首先,话不多说,Mysql Group Replication(MGR)是目前的一个Mysql高可用架构,可是MGR只是实现了在集群中主节点宕机后,剩下的节点能够重新选举出一个新的主节点来提供服务,无法解决将连接数据库的应用连接到新的主节点,于是需要借助keepalived来实现数据库连接的转移,应用连接虚拟IP即可
mysql主节点:192.18.0.167
mysql从节点1:192.18.0.168
mysql从节点2:192.18.0.169
虚拟IP:192.18.0.200
搭建好MGR集群如下所示
keepalived配置如下所示(主从一样):
global_defs {
router_id LVS_DEVEL
script_user root
# enable_script_security
}
vrrp_script check_mysql {
script "/data0/scripts/keepalived_scripts/check-mysql.sh"
interval 1
weight -20
fall 3
rise 1
}
vrrp_instance VI_1 {
state BACKUP
notify_master "/data0/scripts/keepalived_scripts/assign_private_ip.sh"
unicast_src_ip 192.18.0.167 #不同的主机需要做相应的更改
unicast_peer { #不同的主机需要做相应的更改
192.18.0.168
192.18.0.169
}
interface ens5
virtual_router_id 51
priority 100
authentication {
auth_type PASS
auth_pass 12e43d!
}
virtual_ipaddress {
192.18.0.200
}
track_script {
check_mysql
}
}
cat /data0/scripts/keepalived_scripts/check-mysql.sh
#!/bin/bash
My_ID="<数据库成员ID>" #具体可以使用命令select * from performance_schema.replication_group_members; 查看
Master_ID=`mysql -u<数据库账号> -p<数据库密码> -e "show global status like 'group_replication_primary_member';" 2>/dev/null |awk -F " " 'NR==2{print $2}'`
#echo $Master_ID
if [ "$Master_ID" == "$My_ID" ];
then
exit 0
else
exit 1
fi
该脚本主要是检测本实例的ID是否与MGR主节点的ID是否一样,若一样则说明是主节点,那么需要获取VIP来提供数据库读写
cat /data0/scripts/keepalived_scripts/assign_private_ip.sh
#!/bin/bash
/usr/local/aws/bin/aws ec2 assign-private-ip-addresses \
--network-interface-id <实例eni> \
--private-ip-addresses 192.18.0.200 \
--allow-reassignment
该脚本主要是使VIP能够在集群内被认可,能够被集群其余节点访问得到,在执行这个操作之前需要保证IP:192.18.0.200已经作为辅助IP创建出来并且已经附加到了集群中的节点上,
切换原理:首先按照要求填写好相关的信息,在启动keepalived的时候会通过check脚本进行检查,当节点不是主的时候优先级会下降,从100下降到80,当节点是主的时候优先级会保持不变为100,获得VIP提供读写服务,简单的说,那个节点是主节点,那个就会获得VIP
脑裂的解决:可以使用仲裁,不过需要一台第三方的主机。简单一点的可以在执行主节点上的assign_private_ip.sh时候创建一个文件,在成为从节点的时候删除该文件,在主节点上面添加cron任务,检查该文件是否存在,若存在则判断虚拟IP和辅助IP是否在该主机,若不存在那么触发assign_private_ip.sh脚本,强制的将IP绑定到该主机
若有不足欢迎指正
联系方式:958905365@qq.com
参考链接:
https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/install-bundle.html