Keepalived 高可用解决方案

庆云1年前技术文章459

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,发现成功切换。


相关文章

kafka常见配置参数解析

broker.idbroker 的全局唯一编号,不能重复,只能是数字num.network.threads=3处理网络请求的线程数量num.io.threads=8用来处理磁盘 IO 的线程数量soc...

K8s数据持久化

K8s数据持久化

一、为什么需要持久化为了解决pod里面的容器被删除后数据不丢失,则引入了存储类型,类似于docker中的数据卷。在kubernetes集群中,其是支持多种存储类型,包括但不限于emptyDir,Hos...

MapReduce生产经验

MapReduce程序效率的瓶颈在于两点:1)计算机性能(1)CPU、内存、磁盘、网络2)I/O操作优化(1)数据倾斜(2)Map运行时间太长,导致Reduce等待过久(3)小文件过多下来就根据这两点...

oracle压测

一、oracle自带压测存储过程: link:https://blog.csdn.net/xiaofan23z/article/details/79789981、首先确定通过运行以下查询,确保为数据文...

CDP实操--配置KNOX SSO(五)

CDP实操--配置KNOX SSO(五)

1.1配置Atlas的SSO身份验证在Knox SSO的topology里配置Knox与LDAP集成认证如下,并重启Knox服务role=authenticationauthentication.na...

MySQL运维实战(4.9) SQL_MODE之NO_UNSIGNED_SUBTRACTION

在mysql数据库中,unsigned表示不存负数,如果unsigned类型的字段作运算,得到的结果为负数,SQL会报错。mysql> create table t...

发表评论    

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