Keppalived概念:keepalived是以VRRP协议为基础实现的,VRRP全称VirtualRouterRedundancyProtocol,中文名为虚拟路由冗余协议,VRRP的出现就是为了解决静态路由的单点故障问题,VRRP是通过一种竞选机制来将路由的任务交给某台VRRP路由器的。
在两个负载均衡调度器上安装Keepalived以实现高可用的目的。
两个调度器之间通过VRRP协议来保证高可用性,当一台调度器宕机时,另一台备用的立即接替原主机服务,当主机被修复之后又将服务返还给主机。
Keepalived故障切换原理:在主节点正常工作的时候,会不断地向备节点广播心跳消息,用来告诉备节点自己还活着,当主节点发生故障的时候,备节点就无法收到主节点广播的消息,即可判定主节点发生故障,进而调用自身的接管程序,接管主节点的IP资源及服务。而当主节点被修复时,备节点会释放主节点故障时自己所接管的IP资源和服务,恢复到原来备用的角色。
两个节点都为BACKUP节点,优先级一样,谁先启动谁就是主节点
配置文件详解
global_defs { ##全局定义,对整个Keepalived起作用
router_id MySQL-HA ##运行Keepalived的机器的标识
}
##配置虚拟路由器
vrrp_instance 名字 {
state MASTER/BACKUP ##主/备
interface IFACE_NAME ##绑定为当前虚拟路由器使用的物理接口;
virtual_router_id VRID ##当前虚拟路由器的惟一标识,范围是0-255;
priority 100 ##当前主机在此虚拟路径器中的优先级;范围1-254;
advert_int 1 ##vrrp通告的时间间隔;主备间通告时间检查的时间间隔,单位为s,默认1s
##配置认证
authentication {
auth_type AH|PASS ##加密认证|明文认证
auth_pass <PASSWORD> ##密码
}
##设置VIP即虚拟IP地址
virtual_ipaddress {
<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
192.168.200.17/24 dev eth1
192.168.200.18/24 dev eth2 label eth2:1
}
##配置要监控的网络接口,一旦接口出现故障,则转为FAULT状态;
track_interface {
eth0
eth1
nopreempt:定义工作模式为非抢占模式;
preempt_delay 300:抢占式模式下,节点上线后触发新选举操作的延迟时长;
}
}
##配置业务进程脚本
vrrp_script check_run {
script "/home/mysql/mysql_check.sh" ##设置脚本文件名
interval 60 ##设置脚本执行的时间间隔
fall 2 ##定义检测失败的最大次数,表示当请求失败几次时就认为节点资源故障
rise 1 ##定义请求成功的次数,表示当进行几次请求成功后就认为节点资源恢复正常
}
vrrp_sync_group VG1 {
group { ##设置同一组中的vrrp实例名
VI_1
}
}
##vrrp_sync_group配置VRRP同步组。不使用Sync Group的话,如果机器有两个网段,一个内网一个外网,每个网段开启一个VRRP实例。假设VRRP配置为检查内网,那么当外网出现问题时,VRRPD认为自己仍然健康,那么不会触发Master和Backup的切换,从而导致问题。Sync Group解决这个问题,可以把两个实例都放进一个Sync Group,这样的话,Sync Group里面任何一个实例出现问题都会发生切换
vrrp_instance VI_1 {
state BACKUP ##实例出事状态
interface ens32 ##实例绑定的网卡
virtual_router_id 51 ##VRID标记,值为0-255
priority 90 ##优先级
advert_int 1 ##检查间隔
nopreempt ##不发生抢占
authentication { ##认证类型和密码
auth_type PASS ##认证类型
auth_pass 1234 ##铭文认证密码
}
##vrrp_instance配置VRRP实例。VRRP实例表示在上面开启了VRRP协议。这个实例说明了VRRP的一些特性,比如主从、VRID等等。可以在每个网卡上开启一个实例。VRRP实例主要定义vrrp_sync_group里面的每个组的漂移IP等。
track_script { ##设置追踪脚本,调用vrrp_script使之生效
check_run ##调用vrrp_script中定义的脚本
}
##定义通知脚本
notify_master /home/mysql/master.sh ##当切换到master时执行的脚本
notify_stop /home/mysql/stop.sh ##vrrp停止以后执行的脚本
notify_backup /home/mysql/backup.sh ##当前节点转为备节点时触发的脚本;
notify_fault /home/mysql/fault.sh ##当前节点转为“失败”状态时触发的脚本;
notify /home/mysql/general.sh ##通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知;
virtual_ipaddress { ##指定漂移地址
172.16.1.100/24 ##不加掩码,默认是32位的
}
}
配置的脚本
#!/bin/bash
kkk=`/usr/local/mysql/bin/mysqld -h127.0.0.1 -pmysql_passwd -Pmysql_port -N -s -e "show databases" 2>/dev/null`
if [ ! -z "$kkk" ]; then
exit 0 ##表示服务正常
else
exit 1 ##表示服务有报错
fi
当查看数据库里有哪些库时报错时,keepalived就会自动转移VIP到正常的backup节点