在之前的讨论中,我们探讨了基于容器节点的 MySQL Group Replication 配置。在后续的测试过程中,我们发现如果某个容器节点意外挂掉,该节点会自动从组内退出。这可能会导致组复制的可用性和稳定性受到影响。为了确保组复制的高可用性,本文将介绍如何实现对容器节点可用性的实时检测,以及在节点意外挂掉后如何自动拉起并重新加入组复制。
脚本目录结构 1 2 3 4 5 6 monitor_container.sh container_monitor container_monitor.log
容器节点检测恢复脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 #!/bin/bash CONTAINERS ( mysql_mgr_slave1_8.0.37 mysql_mgr_slave2_8.0.37 mysql_mgr_master_8.0.37 ) LOG_DIR /var/lib/docker/resume_startup/container_monitor mkdir -p $LOG_DIR check_container_status () {local container_name $1 local log_file $LOG_DIR /${container_name} .log local status $(docker inspect --format '{{.State.Status}}' $container_name 2>/dev/null)if [ $status running ]; then echo $(date '%Y-%m-%d %H:%M:%S' ) - 容器 $container_name 正在运行。 >> $log_file else echo $(date '%Y-%m-%d %H:%M:%S' ) - 容器 $container_name 已停止,尝试重新启动... >> $log_file docker start $container_name >> $log_file 2>&1 if [ $? -eq 0 ]; then echo $(date '%Y-%m-%d %H:%M:%S' ) - 容器 $container_name 已成功重新启动。 >> $log_file else echo $(date '%Y-%m-%d %H:%M:%S' ) - 容器 $container_name 重新启动失败。 >> $log_file fi fi } while true ; do for container in ${CONTAINERS[ ]} ; do check_container_status $container done sleep 60 done
定时任务实现脚本自动执行 1 */5 * * * * /var/lib/docker/resume_startup/./monitor_container.sh >> /var/lib/docker/resume_startup/container_monitor.log 2>&1
节点重新加入组内策略 只要在MySQL配置文件中将自动启动组复制的参数设置为ON
1 loose-group_replication_start_on_boot ON
实验模拟 开启会话1查看组内成员的状态,开启会话2模拟mgr_slave1节点挂掉的情况 这时在会话1中发现mgr_slave1节点已经离开组内 ,会话2中查看脚本日志发现mgr_slave1挂掉后很快就会拉起,并且在会话1中看到mgr_slave1节点已重新加入组内
会话1
会话2