MGR主节点故障自动切换
MGR单主模式下,当主节点故障,MGR内部将会发起一轮新的选举,选出新的主,这是由MGR内部决定并执行的。但是当应用的连接遇到主节点挂掉的情况下,IP是不会自动发生切换的,也就是说,MGR内部没有提供一种机制,来实现主节点故障切换对应用无感知。
解决办法,用Keepalived 实现MGR节点故障自动切换。应用程序连接数据库使用VIP即可,后面master是哪一台数据库是通过keepalived服务端实现的;keepalived通过检测脚本确定哪一台是master就把VIP飘在哪一台服务器上。
1、安装Keepalived
yum install -y keepalived
- 修改配置文件(原示例配置删除即可)
原理:
vrrp_script脚本中weight这个值必须指定,否则有时候重启服务后该节点被显示为fault 状态。weight值分为正值和负值,假定weight值为W,初始的优先级为P。
当weight值小于0时:
如果检测脚本返回值=0,则节点最终优先级不改变;
如果检测脚本返回值≠0,则节点最终优先级=P-W,优先级会减小。
当weight值大于0时:
如果检测脚本返回值=0,则节点最终优先级=P+W,优先级会增加;
如果检测脚本返回值≠0,则节点最终优先级不改变。
权重策略是:
当weight > 0时:脚本执行成功了 Priority+Weight 执行失败 Priority
当weight < 0时:脚本执行成功了 Priority 执行失败 Priority+Weight
通过chk_mysql.sh脚本检测mysql服务是否存在返回返回值,Keepalived判断脚本返回值调整优先级,调整后VIP会飘到优先级最大的机器上,
整体来说就是通过改变机器的权重来把VIP飘在权重最大的机器上的;我们要做的就是通过脚本判断是否执行,使得master的权重最高;这里的权限一定得控制好;
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
#指定mysql服务检测脚本
vrrp_script chk_mysql_port {
script "/root/chk_mysql_port.sh" #脚本路径
interval 2 #脚本检测频率
weight -5 #脚本执行返回值 =0 ,优先级不变。 !=0 时优先级 -5
fall 2 #如果连续两次检测失败,认为节点服务不可用
rise 1 #如果连续2次检查成功则认为节点正常
}
#监测mysql 是否是master
vrrp_script chk_mysql_master {
script "/root/chk_mysql_master.sh"
interval 2
weight 10 #脚本执行返回值 =0 ,优先级加 10。 !=0 时优先级不变。
}
vrrp_instance VI_1 {
state MASTER #指定实例初始状态,实际的MASTER和BACKUP是选举决定的。
interface eth0 #指定实例绑定的网卡
virtual_router_id 88 #设置VRID标记(0..255)
priority 100 #设置优先级,优先级高的会被竞选为Master
advert_int 1 #检查的时间间隔,默认1s
authentication { #节点间的认证,所有的必须一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #设置VIP,可以设置多个,用于切换时的地址绑定。
64.115.5.111
}
track_script { #指定前面脚本的名字
chk_mysql_port
chk_mysql_master
}
}
三台节点不同处,根据实际修改。
interface : 网卡根据实际网卡名修改
priority :优先级,三台机器不同
Centos76(master): 100
k8s-node1(slave): 98
k8s-node2(slave): 96
- 邮件通知配置(选配)
global_defs {
notification_email { #设置 keepalived 在发生事件(比如切换)的时候,需要发送到的email地址,可以设置多个,每行一个。
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc #设置通知邮件发送来自于哪里,如果本地开启了sendmail的话,可以使用上面的默认值。
smtp_server 192.168.200.1 #指定发送邮件的smtp服务器。
smtp_connect_timeout 30 #设置smtp连接超时时间,单位为秒。
router_id LVS_DEVEL #是运行keepalived的一个表示,多个集群设置不同。
}
- 两个MySQL 监测脚本(每台机器上都得有)
##chk_mysql.sh 检查mysql 服务脚本
#!/bin/bash
mysql_port=netstat -antp |grep :::3306 |wc -l
if [$mysql_port -ne 1 ];then
exit 1
fi
##chk_mysql_master.sh 检查mysql master 脚本
#!/bin/bash
master_hostname=mysql -h127.0.0.1 -uroot -pWANG_feng123 -e "SELECT * FROM performance_schema.replication_group_members WHERE MEMBER_ID = (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME= 'group_replication_primary_member')" |awk 'NR==2{print}'|awk -F" " '{print $3}'
hostname=hostname
if [ $master_hostname == $hostname ];then
exit 0
else
exit 1
fi
- Mysql root用户默认只能本地登录,通过VIP连接需要授权(三台都需要执行)
mysql> grant all on *.* to root@'%' identified by "WANG_feng123";
mysql> flush privileges;
- 登录测试