Keepalived 服务使用和介绍
Keepalived 是基于VRRP协议的高可用方案,用来解决单点故障,两台机器,分主备,共用一个虚拟IP,主机发送特定消息到备机,当备机收不到消息,即主机宕机,备机会接管虚拟IP,从而实现高可用。
keepalived从三个层次检测服务器的状态:
Layer3通过ip层发送ping包检测是否ping通
Layer4通过tcp层检测端口是否存在
Layer7通过应用层检测用户设定的服务器程序运行是否正常
需要确保网卡开启multicast(组播)功能,不然可能出现下面问题
问题点--
当网络中不支持多播(例如某些云环境),或者出现网络分区的情况,keepalived BACKUP节点收不到MASTER的VRRP通告(备变成主),就会出现脑裂(split brain)现象,此时集群中会存在多个MASTER
节点
keepalived服务源码安装后可以添加到系统服务里
cp xxx/keepalived-xxx/sysconfig/keepalived /etc/sysconfig/
systemctl daemon-reload #刷新系统服务
keepalived配置文件检测服务运行状态,以nginx为例。需要先写监控nginx的脚本,之后配置文件中调用编写的脚本
#!/bin/bash
nginxNumber=`ps -ef | grep nginx |grep -v grep| wc -l`
If [ $nginxNumber -le 2 ]; then
echo "$(date +"%Y-%m-%d %H:%M:%S") nginx is dead" >> /etc/keepalived/nginx.log
systemctl start nginx
sleep 2
if [ `ps -ef | grep nginx |grep -v grep| wc -l` -eq 0 ]; then
systemctl stop keepalived
fi
fi
vrrp_script check_nginx_alive {
script "/etc/keepalived/check_nginx.sh"
interval 2 # 每隔两秒运行上一行脚本
#weight 10 # 条件成立,则升级权重+10
weight -20 # 条件成立,则升级权重-20
}
# 工作模式,nopreempt表示工作在非抢占模式,默认是抢占模式 preempt
nopreempt|preempt
track_script {
check_nginx_alive # 追踪 nginx 脚本
}
notify_master "xxx.sh" 节点变为master之后主动执行的脚本
notify_backup "xxx.sh" 节点变为backup之后主动执行的脚本
解决脑裂问题:
节点之间通过VRRP报文获得相互的优先级及状态信息,因此,可以通过在服务检查失败时,配置防火墙,禁止本机的VRRP报文发出即可。这样,BACKUP节点收不到MASTER节点的VRRP报文,认为MASTER节点不存在,同时MASTER节点能收到其他节点的VRRP报文,感知到新MASTER的产生,从而进入BACKUP状态。
iptables -A OUTPUT -p vrrp -j DROP 新增防火墙策略
iptables -D OUTPUT -p vrrp -j DROP 删除防火墙策略