1. Keepalived介绍
Keepalived 是一个基于 vrrp 协议来实现的服务器高可用解决方案,可以利用其实现避免IP单点故障,类似的工具还有 heartbeat 、 corosync 。不过其不会单独出现,而是搭配着 LVS、Nginx、HAproxy,一起协同工作达到高可用的目的。
1.1 VRRP协议
VRRP 全称Vritual Router Redundancy Protocol,虚拟路由冗余协议。通过把几台提供路由功能的设备组成一个虚拟路由设备,使用一定的机制保证虚拟路由的高可用,从而达到保持业务的连续性与可靠性。
在这组成的一个虚拟路由器中,有 master 和 backup 之分。master是主节点,在一个虚拟路由器中,只能有一个master,但可以有多个backup;backup是备用节点,也就是当master挂掉之后,backup接手master节点的所有资源,当有多个backup节点时,根据其 priority (优先级)的值的大小,来选择谁作为master的替代者。当backup节点的优先级值相同时,根据其IP地址的大小,来决定。
1.2 VRRP工作逻辑
2.配置前提
2.1 各节点时间必须同步
可以使用 ntp 、 chrony 等工具进行时间同步
2.2 确保iptables和selinux规则清空
实验环境下,我们直接将防火墙规则清空,关闭selinux
iptables -F systemctl stop firewalld.service setenforce 0
在vrrp协议中我们要将我们虚拟路由器中各节点的优先级进行广播,这样在我们故障时,其他节点发现在多播域内自己的优先级最高,可以实现故障切换。
多播地址(组播): 224.0.0.0 -- 239.255.255.255
查看是否支持多播
ifconfig | grep MULTICAST #查看是否支持多播 ip link set multicast on dev eth0 #开启多播功能
3.配置Keepalived+Nginx
3.1 拓扑结构
MASTER keep alived BACKUP
+-------------+ +------------+ +--------------+
| Nginx-1 |--------| virtualIP |--------| Nginx-2 |
+-------------+ +------------+ +--------------+
172.31.208.91 172.31.208.95 172.31.208.92
3.2 安装Keepalived
本机环境是 CentOS7
yum install keepalived keepalived -v
3.3 keepalive配置文件
Keepalvie配置文件路径为:/etc/keepalived/keepalived.conf
以下为 MASTER 配置文件示例:请注意 MASTER 与 BACKUP 不同, 需要更改的地方,多余配置请删除
! Configuration File for keepalived global_defs { notification_email { #定义通知邮箱 [email protected] } notification_email_from [email protected] smtp_server 127.0.0.1 #定义SMTP服务器地址 smtp_connect_timeout 30 router_id lb01 #定义id为lb01,ID要唯一 } vrrp_script chk_ngx { #定义vrrp脚本,检测nginx服务状态 script "/etc/keepalived/chk_ngx.sh" #具体脚本位置,当nginx服务有问题时停掉keepalive服务 interval 2 #间隔两秒 weight 2 } vrrp_instance VI_1 { #实例名字为VI_1,相同的实例的备节点名字要和这个相同 state MASTER #状态为MASTER,备节点状态需要改为BACKUP interface ens192 #定义通信接口为eth0,此参数备节点和主节点相同 virtual_router_id 55 #实例ID为55.唯一 priority 150 #优先级为150,备节点的优先级必须比此数字低 advert_int 1 #通信检查检查间隔时间为1秒 authentication { auth_type PASS #认证类型,此参数备节点设置和主节点设置相同 auth_pass 1111 #密码是1111,此参数备节点设置和主节点相同 } virtual_ipaddress { #虚拟机IP,即VIP为172.31.208.95/24,绑定接口为eth0,别名为eth0:1,此参数备节点设置和主节点相同 172.31.208.95/24 dev ens192 label ens192:1 } track_script { chk_ngx #触发检查 } }
以下为BACKUP的配置文件
! Configuration File for keepalived global_defs { notification_email { [email protected] } notification_email_from [email protected] smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id lb02 } vrrp_script chk_ngx { #定义vrrp脚本,检测nginx服务状态 script "/etc/keepalived/chk_ngx.sh" #具体脚本位置,当nginx服务有问题时停掉keepalive服务 interval 2 #间隔两秒 weight 2 } vrrp_instance VI_1 { state BACKUP interface ens192 virtual_router_id 55 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.31.208.95/24 dev ens192 label ens192:1 } track_script { chk_ngx #触发检查 } }
说明:
1、vrr_instance实例,名字是VI_1,每个实例可以认为是keepalived服务的一个或者多个业务服务,可以有多个,注意,主节点的中的vrrp
2、state MASTER代表当前实例VI_1的角色状态,当前角色为MASTER,只有MATER和BACKUP两个状态,必须大写
3、interface 为网络通信接口
4、virtual_router_id为虚拟机路由id表示,最好是数字,而且是配置文件中唯一的,MASTER和BACKUP配置中相同的实例id又必须一致
5、priority优先级,数字越大,优先级越高,MASTER必须高于BACKUP
6、advert_int 同步时间,默认1秒
7、authentication,认证, MASTER和BACKUP需要配置一致
8、virtual_ipaddress虚拟IP,注意,此IP可以配置多个,通常为需要跟域名绑定
9、vrrp_script,定义的脚本
3.4监控脚本编写
默认情况下,keepalived软件仅仅在对方机器宕机或者keepalive停掉的时候才会接管业务。但是有时候nginx服务停掉,但是keepalived服务还在工作,此时就会导致用户的访问的vip无法找到对应的服务,所以需要编写脚本,检测nginx服务状态,当服务中断时,keepalive服务也中断,脚本如下
#!/bin/bash if [ `netstat -lntup|grep nginx|wc -l` -ne 1 ];then systemctl stop keepalived fi
记得设定可执行权限
4、测试
开启keepalived
systemctl start keepalived systemctl enable keepalvied
注意,当配置文件有任何错误的时候,systemctl 不会提示keepalived启动失败,需要使用systemclt status检查服务
当配置正确,MASTER会主机会有VIP
BACKUP上不会有vip
当模拟nginxi服务停止,MASTER的keepalived服务因为脚本会停止,这时BACKUP会争抢使用vip
可以看到MASTER上keepalived服务停止,没有vip
而在BACKUP上争抢到了vip
5、keepalived的裂脑的脚本
由于某些原因,导致两台高可用服务器对在指定时间内,无法检测到对方的心跳消失,各自取得资源及服务的所有权,而此时的两台高可用服务器对都还活着并且在正常运行,
此时就会导致一个IP或者服务存在冲突,两个服务器都会占用同一个VIP,此时就被称为裂脑。
如果出现了裂脑情况,则需要尽快接入中间仲裁,关闭一台服务器或者keepalived服务
脚本思路:
在BACKUP上执行脚本,如果可以ping通MASTER,并且BACKUP有VIP就报警。
#!/bin/sh MASTER_VIP=172.31.208.95 MASTER_IP=172.31.208.91 while true do ping -c 2 -W 3 $MASTER_IP &>/dev/null if [ $? -eq 0 -a `ip addr|grep "$MASTER_IP"|wc -l` -eq 1 ] then echo "HA is split brain.warning." else echo "HA is OK!" fi sleep 5 done
加上可执行权限