1. 背景
A、B服务器均部署有MySQL数据库,且互为主主。此处为A、B服务器部署MySQL数据库实现高可用的部署,当其中一台MySQL宕机后,VIP可自动切换至另一台MySQL提供服务,实现故障的自动迁移,实现高可用的目的。具体流程如下图所示:
Keepalived官网:Keepalived
通过Keepalived的VIP不仅仅能实现数据库的故障转移,还可以实现很多其他的高可用故障转移业务,可自由发挥,以下是详细的部署安装教程。
2. 安装
2.1. 安装keepalived
# 安装keepalived
yum install keepalived -y
# 设置开机启动
systemctl enable keepalived
3. 配置与启动
3.1. 配置Master
! Configuration File for keepalived
# 全局配置
global_defs {
# 路由ID,当前计算机结点标识符,需要保证全局唯一
router_id keep_16
}
vrrp_strict check_mysql_alive {
script "/etc/keepalived/check_mysql_alive.sh" # 检测脚本位置
interval 2 # 每隔2s执行一次检测脚本
weight 10 # 脚本运行成功,权重+10
}
# 计算机结点
vrrp_instance VI_1 {
# 当前节点状态,MASTER/BACKUP
state MASTER
# 当前实例绑定的网卡
interface ens33
# 虚拟路由ID,需保证主备节点一致
virtual_router_id 51
# 优先级/权重,优先级高的在master挂掉之后就能成为master,一般保证主节点的优先级最高
priority 100
# 主备之间同步检查的时间间隔(心跳),默认1s
advert_int 1
# 认证授权的密码,防止非法节点进入,需要保证主备一致
authentication {
auth_type PASS
auth_pass 1111
}
# 追踪脚本,当前实例vrrp_instance实例化以后便会运行
track_script {
check_mysql_alive # 对应vrrp_strict定义的名称
}
# 虚拟IP(VIP)
virtual_ipaddress {
192.168.3.20
}
}
3.2. 配置Backup
# 全局配置
global_defs {
# 路由ID,当前计算机结点标识符,需要保证全局唯一
router_id keep_26
}
# 计算机结点
vrrp_instance VI_1 {
# 当前节点状态,MASTER/BACKUP
state BACKUP
# 当前实例绑定的网卡
interface ens33
# 虚拟路由ID,需保证主备节点一致
virtual_router_id 51
# 优先级/权重,优先级高的在master挂掉之后就能成为master,一般保证主节点的优先级最高
priority 80
# 主备之间同步检查的时间间隔(心跳),默认1s
advert_int 1
# 认证授权的密码,防止非法节点进入,需要保证主备一致
authentication {
auth_type PASS
auth_pass 1111
}
# 虚拟IP(VIP),主备一致
virtual_ipaddress {
192.168.3.20
}
}
3.3. 启动与测试
如上配置完成之后,启动Keepalived
systemctl start keepalived
在Server A服务器上,手动停止mysql,模拟mysql数据库宕机,查看keepalived日志,可见keepalived检测到mysql_check.sh返回非0,将keepalived置为fault,并将vip转移到Server B
在备用服务器Server B上,可以看到keepalived状态变为master:
4. FAQ
4.1. 注意
1、VIP需要采用内网中与部署服务器同一网段不会被使用空闲的一个内网IP,vip使用真实地址可通过查看arp路由表。
# 查看ARP路由表
arp
2、失败请检查日志,Keepalived默认日志文件路径为
/var/log/keepalived.log
3、内网环境需要支持VRRP协议
4.2. 配置防火墙
若测试不通过,在防火墙上开启富策略,放通keepalived广播消息发送地址192.168.3.20(这里放通整个/24网段),同时开通直连策略,放通vrrp协议
#开通富策略,放通广播消息
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 destination address=192.168.3.20/24 protocol value=ip accept'
#在直连策略中放通vrrp协议
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens224 --destination 192.168.3.20 --protocol vrrp -j ACCEPT
firewall-cmd --reload
firewall-cmd --list-all