Keepalived 高可用解决方案

庆云10个月前技术文章242

Keepalived 起初是为 LVS 设计的,专门用来监控集群系统中各个服务节点的状态,后来有加入 VRRP 的功能,VRRP 是 Virtual Router Redundancy protocol (虚拟路由器冗余协议)的缩写,VRRP 出现的目的就是为了解决静态路由器出现的单点故障问题,它能偶保证网络的不间断、稳定的运行。所有,keepalived 一方面具有 LVS cluster nodes healthchecks(集群节点健康检查)功能,另一方面也具有 LVS directors faiover(负载均衡器故障转移)功能。


1、Keepalived  用途

Keepalived 服务两大用途:healthcheck & failover(健康检查和故障转移)

1.1 LVS directors failover 功能

failover 功能,用于实现 LB Master 主机和 Backup 主机之间故障转移和自动切换。这是针对有两个负载均衡器 Director 同时工作而采取的故障转移措施。当主负载均衡器(MASTER)失效或出现故障时,备份负载均衡器(BACKUP)将自动接管主负载均衡器的所有工作;一旦主负载均衡器(MASTER)故障修复,MASTER 又会接管回它原来处理的工作,而备份负载均衡管理器(BACKUP)会释放 MASTER 失效时它接管的工作,此时两者将恢复到最初各自的角色状态。

1.2 LVS cluster nodes healthchecks 功能

RS healthcheck 功能,负载均衡定期检查 RS 的可用性决定是否非其分发请求。当虚拟服务器中的某一个甚至是几个真实服务器同时发生故障无法提供服务时,负载均衡器会自动将失效的服务器从转发队列中清除出去,从而保证用户的访问不受影响;当故障的服务器被修复以后,系统又会自动地把他们加入转发队列,分发请求提供正常服务。


2、Keepalived 原理

Keepalived dirctors 之间的故障切换转移,是通过 VRRP 协议来实现的。在 keepalived directors 正常工作时,主 Directors 节点会不断的向备节点组播心跳信息,用以告诉备节点自己还活着,当主节点发生故障时,备节点就无法继续检测到主节点的心跳,进而调用自身的接管程序,接管主节点的 IP 资源及服务。而当主节点恢复故障时,备节点会释放主节点故障时,备节点会释放主节点故障时自身接管的 IP 资源及服务,恢复到原来的自身的备用角色。


3、Keepalived 特点

  1. Keepalived 是 LVS 的扩展项目,因此它们之间具备良好的兼容性。 这点应该是 Keepalived 部署比其他类似工具更简洁的原因,尤其是相对于 Heartbeat 而言,Heartbeat 作为 HA 软件,其复杂的配置流程让许多人望而生畏。

  2. 通过对服务器池对象的健康检查,实现对失效机器/服务的故障隔离。

  3. 负载均衡器之间的失败切换,是通过 VRRP(Virtual Router Redundancy Protocol)stack 实现的,VRRP 当初被设计出来就是为了解决静态路由器的单点故障问题。

  4. 通过实际的线上项目,我们可以得知,iptables 的启用是不会影响 Keepalived 的运行的。 但为了更好的性能,我们通常会将整套系统内所有主机的 iptables 都停用。

  5. Keepalived 产生的 VIP 就是整个系统对外的 IP,如果最外端的防火墙采用的是路由模式,那就映射此内网 IP 为公网 IP。


4、Keepalived  实践

4.1 环境准备

节点信息:

  • 192.168.100.10,master web 节点

  • 192.168.100.20,backup web 节点


软件信息:

  • Nginx,用于提供业务访问

  • Keepalived,用于提供业务访问的统一入口(VIP)

$ yum install nginx keepalived -y

# master node
$ vim /etc/nginx/nginx.conf
server {
   listen 80;
   root /www/site1;
}
$ mkdir -p /www/site1
$ echo web-server1 > /www/site1/index.html
$ systemctl start nginx && systemctl enable nginx

# backup node
$ vim /etc/nginx/nginx.conf
server {
   listen 80;
   root /www/site1;
}
$ mkdir -p /www/site1
$ echo web-server2 > /www/site1/index.html
$ systemctl start nginx && systemctl restart nginx

4.2 Keepalived 配置

# master node
$ vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
# 全局配置
global_defs {
router_id 1                            # 设备在高可用组中的标识,不一样即可
}

vrrp_instance VI_1 {                   # 实例名:两台路由器相同
   state MASTER                       # MASTER OR BACKUP
   interface ens32                    # 网卡名称
   mcast_src_ip 192.168.100.10        # 心跳源IP
   virtual_router_id 55               # 虚拟路由编号,主备要一致
   priority 100                       # 优先级
   advert_int 1                       # 心跳间隔(秒)
   
   authentication {                   # 秘钥验证
       auth_type PASS                 # 认证方式:密码
       auth_pass 123456
   }
   
   virtual_ipaddress {                # VIP
   192.168.100.88
   }
}
$ systemctl start keepalived && systemctl enable keepalived
# backup node
$ vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
# 全局配置
global_defs {
router_id 2                            # 设备在高可用组中的标识,不一样即可
}

vrrp_instance VI_1 {                   # 实例名:两台路由器相同
   state BACKUP                       # MASTER OR BACKUP
   interface ens32                    # 网卡名称
   mcast_src_ip 192.168.100.20        # 心跳源IP
   virtual_router_id 55               # 虚拟路由编号,主备要一致
   priority 99                        # 优先级
   advert_int 1                       # 心跳间隔(秒)
   
   authentication {                   # 秘钥验证
       auth_type PASS                 # 认证方式:密码
       auth_pass 123456
   }
   
   virtual_ipaddress {                # VIP
   192.168.100.88
   }
}
$ systemctl start keepalived && systemctl enable keepalived

4.3 浏览器访问测试

keepalived-vip.png

断开网卡连接,访问测试:

22.png


33.png

启动 master 节点网卡,又恢复正常。

master 节点,关闭 nginx 服务,再进行访问测试:

44.png

4.4 监听脚本

问题:为什么 master 节点断开网卡,VIP 漂移到了 backup 节点,而 master 节点停掉 nginx 服务却无法访问?

答案:因为 keepalived 监听的是接口的 IP 状态和 nginx 没有关联,无法监控 nginx 服务状态。

解决:加监听脚本

  • 分别在 master 节点和 backup 节点添加如下启动脚本,并修改 keepalived 配置文件。

# master node
$ vim /etc/keepalived/ck_ng.sh
#!/bin/bash
# 检查nginx进程是否存在
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ];then
# 尝试启动一次nginx,停止5秒后再次监测
   service nginx start
   sleep 5
   counter=$(ps -C nginx --no-heading|wc -l)
   if [ "${counter}" = "0" ];then
   # 如果启动没成功,就杀掉 keepalived 触发主备切换
       service keepalived stop
   fi
fi


$ chmod +x /etc/keepalived/ch_ng.sh
$ vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
# 全局配置
global_defs {
router_id 1                            # 设备在高可用组中的标识,不一样即可
}

vrrp_script chk_nginx {              # 健康检查
script "/etc/keepalived/ck_ng.sh"      # 检查脚本
interval 2                         # 检查频率(秒)
weight -5                              # priority减5
fall 3                                 # 失败三次
}

vrrp_instance VI_1 {                   # 实例名:两台路由器相同
   state MASTER                       # MASTER OR BACKUP
   interface ens32                    # 网卡名称
   mcast_src_ip 192.168.100.10        # 心跳源IP
   virtual_router_id 55               # 虚拟路由编号,主备要一致
   priority 100                       # 优先级
   advert_int 1                       # 心跳间隔(秒)
   
   authentication {                   # 秘钥验证
       auth_type PASS                 # 认证方式:密码
       auth_pass 123456
   }
   
   virtual_ipaddress {                # VIP
   192.168.100.88
   }

   track_script {                     # 引用脚本
       chk_nginx
   }
}
$ systemctl restart keepalived
# backup node
$ vim /etc/keepalived/ck_ng.sh
#!/bin/bash
# 检查nginx进程是否存在
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ];then
# 尝试启动一次nginx,停止5秒后再次监测
   service nginx start
   sleep 5
   counter=$(ps -C nginx --no-heading|wc -l)
   if [ "${counter}" = "0" ];then
   # 如果启动没成功,就杀掉keepalived触发主备切换
       service keepalived stop
   fi
fi


$ chmod +x /etc/keepalived/ch_ng.sh
$ vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
# 全局配置
global_defs {
router_id 2                            # 设备在高可用组中的标识,不一样即可
}

vrrp_script chk_nginx {              # 健康检查
script "/etc/keepalived/ck_ng.sh"      # 检查脚本
interval 2                         # 检查频率(秒)
weight -5                              # priority减5
fall 3                                 # 失败三次
}

vrrp_instance VI_1 {                   # 实例名:两台路由器相同
   state BACKUP                       # MASTER OR BACKUP
   interface ens32                    # 网卡名称
   mcast_src_ip 192.168.100.20        # 心跳源IP
   virtual_router_id 55               # 虚拟路由编号,主备要一致
   priority 99                        # 优先级
   advert_int 1                       # 心跳间隔(秒)
   
   authentication {                   # 秘钥验证
       auth_type PASS                 # 认证方式:密码
       auth_pass 123456
   }
   
   virtual_ipaddress {                # VIP
   192.168.100.88
   }

   track_script {                     # 引用脚本
       chk_nginx
   }
}
$ systemctl restart keepalived

访问测试,问题解决,特地修改监听 nginx 脚本不尝试启动 nginx,直接杀掉 keepalived,发现成功切换。


相关文章

基于commit命令创建docker镜像

基于commit命令创建docker镜像

创建docker容器```Plain Text sudo docker run -it centos:centos7 /bin/bash![https://teamo-md.oss-cn-shang...

Presto临时设置session超时时间

Presto临时设置session超时时间

全局默认超时时间为200s:测试语句:select    "t7"."__fcol_16" "__fcol_22",    date_trunc('month', "t7"."__fcol_21"...

flink获取taskmanager的pstree信息

flink获取taskmanager的pstree信息

使用pstree –p 进程号 的方式能够获取taskmanager的pstree信息,这个地方提供一个收集脚本。内容如下:#!/bin/bashsearchPID() {   l...

shell脚本--sed

sed后面接的动作,务必以 '........'两个单引号包住1.擅长对文件进行操作处理2.对文件信息进行内容的信息修改-i 参数代表直接修改原文件a :往后新增一行, a 的后面可以接字串,而这些字...

MySQL运维实战(4.2) 关于SQL_MODE

早期mysql对一些不符合SQL标准的SQL语句和数据的容忍度比较高。mysql 5.7 修改了默认sql mode。系统从低版本升级或迁移到高版本时,需要经过全面的测试,避免影响程序的正常运行。5....

查看相关服务器信息命令

查看相关服务器信息命令

1、查看服务器架构方式arch2、查看服务器cpu核数nproc3、查看服务器内存大小free -hdmidecode -t 17 | grep Size4、查看某目录下挂载磁盘大小lsblk5、查看...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。