数据库集群系列(五)使用Keepalived实现MySQL数据库的故障转移与自动切换
一、基本概念
Keepalived 是一个用于实现高可用性和负载均衡的开源软件。它主要通过 IP 虚拟服务器(Virtual Server,简称 VRRP)和健康检查来实现故障切换和负载均衡。
Keepalived的原理是基于TCP/IP参考模型的第三、第四层和第五层交换机制来检测每个服务节点的状态。当某个服务器节点出现异常或工作出现故障时,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除。这些工作全部是自动完成的,不需要人工干涉。需要人工完成的只是修复出现故障的服务节点。
Keepalived 的工作原理:
-
VRRP 协议:
-
Keepalived 使用 VRRP 协议来实现高可用性。VRRP 允许多个服务器共享一个虚拟 IP 地址和一个虚拟 MAC 地址,其中一个服务器是主服务器,负责处理流量,其他服务器是备份服务器,处于热备状态。
-
所有服务器通过 VRRP 协议定期发送心跳包,主服务器发送广播通知其他备份服务器自己仍然处于活动状态。如果主服务器发生故障或无法通信,备份服务器中的一个将会接管虚拟 IP 地址,确保服务的可用性。
健康检查:
-
Keepalived 通过定期的健康检查来确保服务器的可用性。可以配置不同的检查方式,比如 TCP 检查、HTTP 检查、脚本检查等。
-
如果服务器在检查中被标记为不可用,Keepalived 将触发故障转移,将虚拟 IP 地址从故障的服务器迁移到备份服务器。
故障切换:
-
当主服务器发生故障或不可用时,Keepalived 会自动将虚拟 IP 地址迁移到一个备份服务器。这确保了服务的持续可用性。
-
一旦主服务器恢复,Keepalived 会自动将虚拟 IP 地址迁回主服务器,实现了故障的自动恢复。
二、Master-1配置
1、安装keepalived
yum install keepalived -y
2、配置keepalived
vim etc/keepalived/keepalived.conf# 配置通知的emailglobal_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.51.1 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_skip_check_adv_addr # 注释掉vrrp_strict,开启会导致其他机器无法访问虚拟IP # vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0}# 检查mysql脚本,定时执行vrrp_script check_run { script "/usr/check_run.sh" interval 3}# 设置虚拟ipvrrp_instance VI_1 { # 当前节点的状态MASTER、BACKUP state MASTER # 当前服务器使用的网卡名称,使用ifconfig查看 interface ens33 #VRRP组名,两个节点的设置必须一样 virtual_router_id 51 #主节点的优先级(1-254之间) priority 100 #组播信息发送间隔,两个节点设置必须一样 advert_int 1 #设置验证信息,两个节点必须一致 authentication { auth_type PASS auth_pass 1111 } #虚拟IP,对外提供MySQL服务的IP地址 virtual_ipaddress { 192.168.1.111 }}# master2# 配置通知的emailglobal_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.51.1 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_skip_check_adv_addr # 注释掉vrrp_strict,开启会导致其他机器无法访问虚拟IP # vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0}# 检查mysql脚本,定时执行vrrp_script check_run { script "/usr/check_run.sh" interval 3}# 设置虚拟ipvrrp_instance VI_1 { # 当前节点的状态MASTER、BACKUP state BACKUP # 当前服务器使用的网卡名称,使用ifconfig查看 interface ens33 #VRRP组名,两个节点的设置必须一样 virtual_router_id 51 #主节点的优先级(1-254之间) priority 100 #组播信息发送间隔,两个节点设置必须一样 advert_int 1 #设置验证信息,两个节点必须一致 authentication { auth_type PASS auth_pass 1111 } #虚拟IP,对外提供MySQL服务的IP地址 virtual_ipaddress { 192.168.1.111 }}
3、配置check脚本
vim /usr/check_run.sh
#!/bin/bash./root/.bashrccount=1while truedo mysql -uroot -proot -S /tmp/mysql.sock -e "select now();" > /dev/null 2>&1 i=$? ps aux | grep mysqld | grep -v grep > /dev/null 2>&1 j=$? if [ $i = 0 ] && [ $j = 0 ] then exit 0 else if [ $i = 1 ] && [ $j = 0 ] then exit 0 else if [ $count -gt 5 ] then break fi let count++ continue fi fidone
chmod 755 /usr/check_run.sh
4、启动keepalived
systemctl start keepalived.service #启动systemctl stop keepalived.service #停止systemctl status keepalived.service #状态systemctl restart keepalived.service #重启systemctl enable keepalived.service #设置开机重启
5、查看虚拟IP

三、Master-2配置
同Master-1的配置,不再赘述。
四、模拟故障切换测试
1、宕掉master-1,通过虚拟IP依然可以连接

修改数据测试

2、开启master-1,检查数据,发现数据已同步。

结论:通过keepalived实现MySQL的故障切换,可以正常运行。
本文教程参考以下链接实现,感谢原作者:不吃小龙虾哦的创作。https://blog.csdn.net/shuo_house/article/details/127727769
