MGR高可用脚本

在之前的讨论中,我们探讨了基于容器节点的 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 # 每隔 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