Keepalived 高可用解决方案
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 功能
2、Keepalived 原理
Keepalived dirctors 之间的故障切换转移,是通过 VRRP 协议来实现的。在 keepalived directors 正常工作时,主 Directors 节点会不断的向备节点组播心跳信息,用以告诉备节点自己还活着,当主节点发生故障时,备节点就无法继续检测到主节点的心跳,进而调用自身的接管程序,接管主节点的 IP 资源及服务。而当主节点恢复故障时,备节点会释放主节点故障时,备节点会释放主节点故障时自身接管的 IP 资源及服务,恢复到原来的自身的备用角色。
3、Keepalived 特点
Keepalived 是 LVS 的扩展项目,因此它们之间具备良好的兼容性。 这点应该是 Keepalived 部署比其他类似工具更简洁的原因,尤其是相对于 Heartbeat 而言,Heartbeat 作为 HA 软件,其复杂的配置流程让许多人望而生畏。
通过对服务器池对象的健康检查,实现对失效机器/服务的故障隔离。
负载均衡器之间的失败切换,是通过 VRRP(Virtual Router Redundancy Protocol)stack 实现的,VRRP 当初被设计出来就是为了解决静态路由器的单点故障问题。
通过实际的线上项目,我们可以得知,iptables 的启用是不会影响 Keepalived 的运行的。 但为了更好的性能,我们通常会将整套系统内所有主机的 iptables 都停用。
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 浏览器访问测试
断开网卡连接,访问测试:
启动 master 节点网卡,又恢复正常。
master 节点,关闭 nginx 服务,再进行访问测试:
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