暂无图片
暂无图片
5
暂无图片
暂无图片
暂无图片

MGR集群故障自愈方案

IT那活儿 2026-04-16
824

点击上方“IT那活儿”公众号--专注于企业全栈运维技术分享,不管IT什么活儿,干就完了!!!



简介

本方案通过zabbix对MGR集群的节点进行监控与告警功能,同时在检测到节点宕机时,能够通过执行目标服务器的自愈脚本实现MGR集群的故障自愈,可以长时间维护MGR集群的高可用性能,确保服务的稳定性。
架构概述:
1)MGR 集群简介
MGR (MySQL Group Replication)是 MySQL 的一个高可用性和高扩展性的解决方案,它通过多主复制(multi-master replication)允许所有节点同时接受写入,并且确保数据在集群中的所有成员之间保持一致。
2)Zabbix 监控系统
Zabbix 是一个开源的企业级 IT 基础设施监控解决方案,提供了广泛的监控功能和服务质量管理。它能够对网络设备、服务器硬件、操作系统、应用程序等进行实时监控,并且具有灵活的告警机制和强大的数据可视化能力。
3)自愈机制
  • 检测
    在Zabbix前端对MGR的全部节点建立监控机制,检测MySQL的状态。
  • 告警机制
    通过对MySQL服务器端口(3306)及MGR服务端口(33061)的监控,收集MGR集群的数据,当返回值=0(未检测到33061端口)时,触发告警。
  • 自愈
    编写自愈脚本,内容包括尝试重新启动MySQL进程,检查MGR集群状态和集群中的主机数量,重新引导集群以及故障点恢复,并将所有MySQL状态和集群状态记录在指定的日志当中。


实施准备工作

2.1 安装与配置 Zabbix
1)zabbix-server端
步骤1:安装zabbix-server包
官网url https://www.zabbix.com/cn/download?zabbix=5.0&os_distribution=centos&os_version=7&components=server_frontend_agent&db=mysql&ws=apache
操作步骤:
准备zabbix所需yum源
rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-latest-5.0.el7.noarch.rpm
yum clean all
#清理yum缓存
安装Zabbix server,Web前端,agent
yum install zabbix-server-mysql zabbix-agent
安装zabbix前端
yum源下载
yum install centos-release-scl
编辑配置文件 etc/yum.repos.d/zabbix.repo

下载zabbix前端:
yum install zabbix-web-mysql-scl zabbix-apache-conf-scl
步骤二:创建初始数据库
在数据库主机上运行以下代码:
mysql -uroot -pmysql> create database zabbix character set utf8 collate utf8_bin;mysql> create user zabbix@localhost 
identified by '123456';mysql> grant all privileges on zabbix.* to zabbix@localhost;mysql> set global log_bin_trust_function_creators = 1;mysql> quit;

为了在其他主机能够登陆zabbix前端,还需为zabbix用户添加所有主机的权限:
导入初始架构和数据,系统将提示输入新创建的密码:
zcat usr/share/doc/zabbix-server-mysql/create.sql.gz | mysql -uzabbix -p zabbix
mysql -uroot -pmysql> set global log_bin_trust_function_creators = 0;mysql> quit

为Zabbix server配置数据库。
编辑配置文件 etc/zabbix/zabbix_server.conf更改数据库内容。
步骤三:为Zabbix前端配置PHP
编辑配置文件 /etc/opt/rh/rh-php72/php-fpm.d/zabbix.conf 中的时区:
php_value[date.timezone] = Asia/Shanghai
步骤四:启动Zabbix server和agent进程
启动Zabbix server和agent进程,并为它们设置开机自启:
# systemctl restart zabbix-server zabbix-agent httpd rh-php72-php-fpm# systemctl enable zabbix-server zabbix-agent httpd rh-php72-php-fpm
查看端口号,确认服务是否成功启动:
2)zabbix-agent端
步骤一:设置被检测端的主机名
[root@localhost ~]# hostnamectl set-hostname mysql1.com
[root@localhost ~]# hostnamectl set-hostname mysql2.com
[root@localhost ~]# hostnamectl set-hostname mysql3.com
[root@localhost ~]# vim /etc/hosts

与Server端不同,Agent端只需要安装zabbix和zabbix-agent包就可以了。
步骤二:安装agent端软件
yum install zabbix-agent
打开/etc/zabbix/zabbix_agentd.conf并修改以下设置:
[root@host2 ~]# vi etc/zabbix/zabbix_agentd.conf
Server=Zabbix #Server端主机名或IP地址
ServerActive= Zabbix #Server端主机名或IP地址
Hostname#Agent端的主机名/IP
UnsafeUserParameters=1 #//是否限制用户自定义keys使用特殊字符

步骤三:启动Zabbix Agent,并检查agent端口
2.2 设置 MGR 集群
本次实验使用三台服务器,1台master服务器,2台node服务器。
在三台服务器上做域名解析、ssh互信、关闭防火墙与selinux。
步骤一: 使用二进制方式安装配置mysql
前往mysql官网下载mysql安装包,此次实验使用的安装包是mysql-5.7.28
url:https://dev.mysql.com/downloads/mysql/5.7.html#downloads
创建mysql用户:
useradd -M -s sbin/nologin -r mysql
解压二进制包,并移动到解压地址下:
tar zxf mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz -C usr/local/ & cd /usr/local
方便后续使用,将文件夹更名为mysql:
mv mysql-5.7.26-linux-glibc2.12-x86_64/ mysql
进入文件夹:
cd /usr/local/mysql
创建数据目录:
mkdir data

修改文件夹所属组和所属主:
chown -R mysql.mysql usr/local/mysql/

初始化:
bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
初始化会生成一段随机代码,保存以进行后续的登陆。
编辑配置文件:
配置文件地址:/etc/my.cnf。
文件内容修改如下:
配置环境变量:
临时修改:
export PATH=/usr/local/mysql/bin:$PATH

若要将其持久化,则要将此命令加入/etc/profile文件中,或者在/etc/profile.d下创建一个.sh文件,将其加入并执行。
刷新环境变量:
./etc/profile.d/mysql.shsource /etc/profile

生成启动脚本:
cd /usr/local/mysql && cp support-files/mysql.server etc/init.d/mysqld

更改启动脚本权限:
chmod +x etc/init.d/mysqld

在/etc/init.d/msyqld下修改如下两行:
basedir=/usr/local/mysql 
datadir=/usr/local/mysql/data

启动MySQL:
/etc/init.d/mysqld start
登陆
mysql -uroot -p'初始密码'
修改密码
mysql>set password for root@localhost=password('123456');


步骤二: 基于MGR方式搭建MySQL集群
重新打开一个终端窗口,切换为root用户进行如下操作:
在全部三个节点修改mysql配置文件/etc/my.cnf。
主节点:
从节点与主节点内容大致相同,更改以下内容:
mysql2:
server id=2 
loose-group_replication_local_address= "mysql2:33061"

mysql3:server id=3
loose-group_replication_local_address= "mysql3:33062"

创建复制账号(三个节点)。
登录mysql,各节点执行如下命令:
SET SQL_LOG_BIN=0;
CREATE USER mgruser@'%' IDENTIFIED BY '123456';#授予用户 mgruser 从任何主机 ('%') 连接到 MySQL 服务器并进行复制的权利
GRANTREPLICATIONSLAVEON *.* TO mgruser@'%';
FLUSH PRIVILEGES; #刷新数据库权限

SET SQL_LOG_BIN=1; 开启二进制日志记录
CHANGE MASTER TO MASTER_USER='mgruser', MASTER_PASSWORD='123456'FOR CHANNEL 'group_replication_recovery';
#创建复制账号,设置用户名和密码,以便其他节点可以从这个节点恢复数据。

#复制账号mgruser可以用随意账号创建,但需要保证所有节点一致。
安装MGR插件:
install PLUGIN group_replication SONAME 'group_replication.so';-
查看group replication组件:
show plugins;
启动MGR单主模式:
主节点:
SET GLOBAL group_replication_bootstrap_group=ON;#准备引导新的组
START GROUP_REPLICATION;#启动组复制
SET GLOBAL group_replication_bootstrap_group=OFF;
# 取消引导标志

查看MGR组信息:
SELECT * FROM performance_schema.replication_group_members;
从节点:
加入MGR
START GROUP_REPLICATION;

查看MGR信息:
SELECT * FROM performance_schema.replication_group_members;
节点状态皆为ONLINE,即集群成功搭建完成。
2.3 准备自愈脚本
分为mysql自愈脚本与MGR自愈脚本两部分。
1)mysql自愈脚本
简介:这个 Bash 脚本用于尝试重启 MySQL 服务并检查其可用性,目的是主节点启用MGR自愈脚本时,使其能够正常连接到故障节点的mysql服务,会记录自愈流程到日志文件中。
将这个脚本放置在所有节点的根目录上,并给予执行权限:
chmod +x /mysql_heal.sh
2)MGR自愈脚本
简介:该脚本部署于主节点,会首先检查本机mysql服务状态,确定各节点mysql服务正常启用,能够通信之后,通过远程登陆以及SQL语句轮流检查所有节点的MGR状况,并且在故障节点重新启用MGR服务,如果判断集群处于崩溃状态,会先在本机启动引导程序以重新启用集群,之后在每个节点启动MGR服务,并且记录所有操作和检查结果到日志文件中。
将这个脚本放置在主节点根目录上,并给予执行权限:
chmod +x /mgr_heal.sh
2.4 配置 Zabbix 动作
1)创建监控项
为每台主机创建监控项,监控节点的3306端口与33061端口。
3306端口:
33061端口:
2)创建触发器
为每台主机创建触发器,并连接监控33061端口(即MGR集群状态)的监控项:
3)定义动作
指定远程命令操作来调用节点上的自愈脚本,自愈流程分为两部分:
  • 在故障节点调用mysql自愈脚本,重新启用mysql服务,以支持主节点的MGR自愈脚本连接mysql服务器;
  • 在主节点(MYSQL1)调用MGR自愈脚本,重新检测mysql服务、检查故障点,并启用判断机制,即当集群正常运作,仅单一节点宕机时,则启动该节点,若集群崩溃,则在主节点执行引导命令,其他节点启动MGR以加入集群。

4)配置图形与聚合图形
结果如下:


测试

3.1 环境预设
使用chaosblade工具进行测试,通过模拟占用3306网络端口,制造节点宕机故障,观察该方案在故障环境下的可行性。
每个节点安装chaosblade工具。
下载
wget 
https://github.com/chaosblade-io/chaosblade/releases/download/v1.7.2/chaosblade-1.7.2-linux-amd64.tar.gz
解压
tar -xvf chaosblade-1.7.2-linux-amd64.tar.gz && cd chaosblade-1.7.2/

3.2 单一节点故障
步骤一:实验前集群状态
MGR状态正常,图表显示正常。
步骤二:向MYSQL3节点投入模拟杀进程实验
命令:
./blade create process kill --process mysqld --signal 9
实验后节点状态:
可见无法查询到MySQL服务,节点宕机。
步骤三:观察zabbix监控数据
查看故障日志:
zabbix成功检测到节点故障并且启动了触发器动作,故障自动恢复,针对单节点的故障自愈成功。
3.3 集群崩溃故障
步骤一:查看实验前集群状态
MGR状态正常,图表显示正常。
步骤二:在全部节点执行模拟杀进程实验,造成集群崩溃
命令:
./blade create process kill --process mysqld --signal 9
步骤三:观测zabbix监控数据
实验后集群状态:
故障恢复后集群状态:

查看自愈日志:
zabbix成功检测到节点故障并且启动了触发器动作,故障自动恢复,针对集群崩溃的故障自愈成功。
本次实验成功使用zabbix监控远程执行shell脚本的方式完成了MGR集群的故障自愈,该方案可以有效应对MGR集群的单点或崩溃故障,在面对不同的故障问题时,在短时间内执行故障自愈与之后的自检,分辨故障来源并且针对性得进行故障自愈,并将结果记录到日志当中。

END


本文作者:周登晖 (上海新炬中北团队)

本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论