运行原理

Keepalived高可用服务对之间的故障切换转移,是通过 VRRP (全 称 Virtual Router Redundancy Protocol ,中文名为虚拟路由冗余协议 ,VRRP的出现就是为了解决静态路由的单点故障问题,VRRP是通过一种竞选机制来将路由的任务交给某台VRRP路由器的。)来实现的。

在 Keepalived服务正常工作时,主 Master节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备Backup节点自己还活看,当主 Master节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主 Master节点的心跳了,于是调用自身的接管程序,接管主Master节点的 IP资源及服务。而当主 Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。

安装

yum install -y keepalived

启动

systemctl start keepalived && systemctl enable keepalived

简单实验示例

配置路径:/etc/keepalived/keepalived.conf

环境:两台装有web服务的主机

主节点配置

global_defs {  #全局配置
   router_id lb01
}

vrrp_instance VI_1 {  #定义实例
    state MASTER   #状态参数 master/backup
    interface ens33    #虚拟IP地址放置的网卡位置
    virtual_router_id 51     #同一集群ID必须一致
    priority 150   #优先级决定是主还是备,值越大越优先
    advert_int 1    #主备通讯时间间隔
    authentication {
        auth_type PASS
        auth_pass 1111   #认证密码
    }
    virtual_ipaddress {
        192.168.1.100  #虚拟IP
    }
}

备节点配置

global_defs {
   router_id lb02
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
     192.168.1.100
    }
}

验证(重启服务后停止主节点keepalived,执行ip addr查看虚拟IP是否漂移,或者查看网页可观察到主备切换)

脑裂现象

在高可用(HA)系统中,当联系2个节点的“心跳线”断开时,本来为一整体、动作协调的HA系统,就分裂成为2个独立的个体。由于相互失去了联系,都以为是对方出了故障。两个节点上的HA软件像“裂脑人”一样,争抢“共享资源”、争起“应用服务”,就会发生严重后果——或者共享资源被瓜分、2边“服务”都起不来了;或者2边“服务”都起来了,但同时读写“共享存储”,导致数据损坏(常见如数据库轮询着的联机日志出错)。

可能产生脑裂的原因:

  • 高可用服务器对之间心跳线链路发生故障,导致无法正常通信。
  • 高可用服务器上开启了 iptables防火墙阻挡了心跳消息传输。
  • 高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败。
  • 其他服务配置不当等原因,如心跳方式不同,心跳广插冲突、软件Bug等。
  • Keepalived配置里同一 VRRP实例如果 virtual_router_id两端参数配置不一致也会导致脑裂问题发生

缓解方案:

  • 添加冗余的心跳线,例如:双线条线(心跳线也HA),尽量减少“脑裂”发生几率;
  • 设置仲裁机制,比如互ping参考IP,完全失败放弃竞争。
  • 做好对脑裂的监控报警,第一时间采取中断措施。

keepalived健康监测脚本配置

keepalived提供自定义脚本检测相关服务

例如监控nginx服务:

mkdir /etc/keepalived/scripts

vim check_nginx.sh

#!/bin/bash

while true
do
if [ `ps -ef |grep nginx |grep -v grep |wc -l` -lt 2 ]  #查看nginx进程数
then
   systemctl stop keepalived 
   exit
fi
done

chmod +x /etc/keepalived/scripts/check_nginx.sh

vim /etc/keepalived/keepalived.conf #keepalived配置添加检测模块

vrrp_script check {     #定义脚本
   script "“/server/scripts/check_web.sh"  --- 表示将一个脚本信息赋值给变量check_web
   interval 2    --- 执行监控脚本的间隔时间
   weight 2  ---利用权重值和优先级进行运算,从而降低主服务优先级使之变为备服务器(建议先忽略)
}

# 追踪脚本,通常用于去执行上面的vrrp_script定义的脚本内容 
track_script { }

验证(重启服务后停止主节点nginx即可观察到主备切换)

TIP:根据实际生产环境,脚本可再增加重启服务等操作

keepalived通知配置

notification_email {...}:该指令用于应用一段邮件接收者的一个配置段,用大括号括起来,里面可以配置多个邮件接收者;
notification_email_from:该指令用于指定邮件发出者的邮箱;
smtp_server:该指令用于指定邮件服务器地址;
smtp_connect_timeout:该指令用于指定连接邮件服务器的超时时长,默认30秒;
notify_master:配置节点成为master角色的触发的动作;通常为执行一个脚本;
notify_backup:配置节点角色转换为backup触发的动作;
notify_fault:配置节点为失败状态触发的动作;

keepalived抢占模式配置

# 工作模式,nopreempt表示工作在非抢占模式,默认是抢占模式 preempt 
nopreempt|preempt
# 如果是抢占默认则可以设置等多久再抢占,默认5分钟
preempt delay 300