在AWS上基于keepalived 的Mysql Group Replication单主节点的高可用解决方案

首先,话不多说,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集群如下所示

在AWS上基于keepalived 的Mysql Group Replication单主节点的高可用解决方案_第1张图片

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绑定到该主机


若有不足欢迎指正

联系方式:[email protected]


参考链接:

在AWS上部署keepalived - 程序园

https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/install-bundle.html

你可能感兴趣的:(在AWS上基于keepalived 的Mysql Group Replication单主节点的高可用解决方案)