作者:美美2502909961 | 来源:互联网 | 2023-07-04 16:12
什么是高可用?一般是指2台机器启动着相同的业务系统,当有一台机器故障了,另外一台机器能快速自动接管,对于访问的用户是无感知的。keepalived是如何实现高可用的
什么是高可用?
一般是指2台机器启动着相同的业务系统,当有一台机器故障了, 另外一台机器能快速自动接管, 对于访问的用户是无感知的。
keepalived是如何实现高可用的?
keepalived 是基于VRRP协议实现的。VRRP虚拟路由冗余协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。
keepalived 工作模式
1、抢占模式:MASTER从故障中恢复后,会将VIP从BACKUP节点中抢占过来。
2、非抢占模式:MASTER恢复后不抢占,BACKUP升级为MASTER后的VIP。
keepalived 配置文件详解
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf global_defs { #全局定义router_id LVS_01 #每个keepalived名字标识 在同一个局域网中唯一即可
}vrrp_script chk_lb { #添加一个执行的脚本script "/server/scripts/chk_lb.sh" #指定要执行的脚本的路径interval 2 #指定脚本执行的间隔,单位秒weight 2 #调整优先级
}vrrp_instance VI_1 { #实例名字,在同一个配置文件中唯一. 在同一组主备之间名字一致state MASTER #指定该keepalived节点的初始状态interface eth0 #vrrp实例绑定的接口,用于发送VRRP包virtual_router_id 50 #指定VRRP实例ID,同一组 主备之间priority 150 #指定优先级,优先级高的将成为MASTERadvert_int 1 #心跳间隔,发vrrp包间隔时间authentication { #认证模式 推荐使用PASS简单密码认证即可auth_type PASSauth_pass 1111}virtual_ipaddress { #指定虚IP地址(VIP)10.0.0.3/24 dev eth0 label eth0:0}track_script { #执行上面添加的脚本chk_lb }
}
配置案例:keepalived 抢占式
1、准备2台服务器:
lb01 10.0.0.5 负载均衡
lb02 10.0.0.6 负载均衡
2、这2台服务器已部署了nginx做负载均衡,后端对应有3台web服务器,上面跑着blog.oldboy.com网站
在这2台服务器部署keepalived监控nginx修改为高可用
#10.0.0.5 配置文件:[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {router_id LVS_01
}vrrp_script chk_lb {script "/server/scripts/chk_lb.sh"interval 2weight 2
}
vrrp_instance VI_1 {state MASTERinterface eth0virtual_router_id 50priority 150advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {10.0.0.3/24 dev eth0 label eth0:0}track_script {chk_lb }
}
#10.0.0.6 配置文件:[root@lb02 ~]# vim /etc/keepalived/keepalived.conf
global_defs {router_id LVS_02 #名字02
}vrrp_script chk_lb {script "/server/scripts/chk_lb.sh"interval 2weight 2
}vrrp_instance VI_1 {state BACKUP #状态设置为backupinterface eth0virtual_router_id 50priority 100 #优先级比master低advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {10.0.0.3/24 dev eth0 label eth0:0}track_script {chk_lb}}
3、在2台服务器上分别创建脚本文件并添加文件为执行权限
[root@lb02 ~]# cat /server/scripts/chk_lb.sh
#!/bin/bash count=`ps -C nginx --no-heading |wc -l` #统计nginx进程数量
if [ $count -eq 0 ];then #进程数量为0,停掉keepalivedsystemctl stop keepalived
fi
4、2台服务器启动keepalived&nginx服务
[root@lb01 ~]# systemctl start keepalived
[root@lb01 ~]# systemctl start nginx#检查vip此时在lb01服务器上
[root@lb01 conf.d]# ip a |grep 10.0.0.3inet 10.0.0.3/24 scope global secondary eth0:0
5、测试:
1)、访问http://10.0.0.3/ ,抓包分析可以看出,其实访问的是10.0.0.5服务器
2)、把lb01服务器 nginx进程停掉,触发脚本keepalied服务自动停掉。证明此时lb01 nginx服务有故障,这时VIP地址自动漂流到lb02服务器上
3)、当lb01服务器nginx进程、keepalied进程手动启动后,VIP地址又自动漂流到lb01服务器上。意思就是lb01把vip抢占过来的
如何配置非抢占式模式?
1、修改10.0.0.5&10.0.0.6 keepalived配置文件
1)、两个节点的state 初始状态必须设置为BACKUP(官方建议)
2)、两个节点都在vrrp_instance中添加nopreempt参数
3)、其中一个节点的优先级必须要高于另外一个节点的优先级。 例如:
vrrp_instance VI_1 {state BACKUPnopreempt
}
2、重启服务
systemctl restart nginx
systemctl restart keepalived
3、测试:
1、把lb01服务器 nginx进程停掉,触发脚本keepalied服务自动停掉,VIP地址自动漂流到lb02服务器上
2、再将lb01服务器nginx进程、keepalied进程手动启动后,VIP地址并没有漂流到lb01。
这就是非抢占式
keepalived 脑裂
1、什么是脑裂?
两台keepalived高可用服务器在无法检测到对方的心跳消息,相互失去了联系,都以为是对方出了故障,各自都争抢取得资源及服务的所有权,而此时的两台高可用服务器又都还活着。
2、脑裂的原因?
1)、服务器网线松动等网络故障
2)、服务器硬件故障发生损坏现象而崩溃
3)、主备都开启firewalld防火墙
3、如何避免脑裂?
最佳方法:设置仲裁机制。例如设置参考IP(如网关IP),当心跳线完全断开时,2个节点都各自ping一下参考IP,不通则表明断点就出在本端。不仅“心跳”、还兼对外“服务”的本端网络链路断了,即使启动(或继续)应用服务也没有用了,那就主动放弃竞争,让能够ping通参考IP的一端去起服务。
4、案例:利用脚本判断检测,在备服务器lb02上执行
1)、检查本机是否存在VIP
2)、本机是否能够ping通网关。2个条件同时满足发生了脑裂
vip=10.0.0.3
gateway=10.0.0.2
while true
dovip_cnt=`ip a |grep $vip -w|wc -l`#使用ping检查指定ip是否可以访问arping eth0 -c 1 $master_ip &>/dev/nullif [ $? -eq 0 -a $vip_cnt -eq 1 ];thenecho 发生脑裂elseecho 一切正常fisleep 3
done