数据库教程FGMT33‑MySQL主从复制项目实施与维护06(MySQL8.4/9.7 MGR组复制)
前言
本套风哥教程面向DBA、数据库运维工程师、云计算运维人员,聚焦MySQL MGR组复制项目实施、部署、运维、故障处理。风哥教程本文包含两套相互独立的实验环境:第一套为Linux平台MySQL8.4 MGR组复制部署;第二套为Linux平台MySQL9.7 MGR组复制部署,两套环境完全隔离,互不干扰。
硬件统一规格:64G内存,8CPU ;主机名固定为fgedu‑net‑cn1、fgedu‑net‑cn2;数据目录统一使用/fgedudb;实例名、数据库名统一使用fgedudb;业务用户名统一为fgedu。风哥教程本文5%内容为前言与大纲,30%为MGR理论原理,60%为实战操作,包含大量可直接复现的命令与配置,5%为总结。
实操提醒:所有命令优先在测试环境执行,上线生产前务必完成备份、功能验证、故障切换演练。
网上搜索风哥教程可以学习全套数据库教程
目录
- MGR组复制基础理论
1.1 MGR组复制概念与核心能力
1.2 MGR底层Paxos协议原理
1.3 MGR单主模式与多主模式对比
1.4 MGR关键前置约束条件
1.5 MySQL8.4 MGR核心特性
1.6 MySQL9.7 MGR新增增强特性
1.7 MGR与传统主从复制差异对比
1.8 MGR集群网络、端口、账号规划规范 - 第一套环境:Linux MySQL8.4 MGR组复制部署(独立环境)
2.1 环境规划与前期检查
2.2 MySQL8.4二进制安装部署(三节点)
2.3 my.cnf完整配置(64G内存8CPU规格)
2.4 初始化实例、配置systemd服务
2.5 MGR复制账号创建
2.6 集群引导初始化,节点加入集群
2.7 MGR集群状态查看与基础验证
2.8 MySQL Router部署配置,业务访问接入
2.9 业务读写功能验证 - MySQL8.4 MGR集群日常运维实战
3.1 MGR常用监控SQL语句
3.2 新增节点加入集群实操
3.3 节点下线、剔除集群实操
3.4 MGR集群逻辑备份mysqldump实操
3.5 MGR物理备份XtraBackup实操
3.6 模拟主节点故障,自动故障切换演练
3.7 单主模式切换至多主模式实操 - 第二套环境:Linux MySQL9.7 MGR组复制部署(独立环境,与8.4环境无关)
4.1 MySQL9.7环境规划、前期环境校验
4.2 MySQL9.7二进制安装部署三节点
4.3 my.cnf配置文件编写,适配9.7新参数,64G内存8CPU
4.4 systemd服务配置、实例初始化
4.5 MGR复制账号创建,适配9.7认证规则
4.6 9.7 MGR集群初始化引导,节点加入集群
4.7 集群状态校验,业务读写验证
4.8 MySQL Router适配9.7版本配置 - MySQL9.7 MGR集群运维实战
5.1 9.7 MGR资源管理器使用
5.2 节点故障自动驱逐、自动重连配置
5.3 备份恢复实操
5.4 故障切换模拟演练 - MGR集群故障排查实战(两套环境通用)
6.1 节点加入集群报ERROR状态排查
6.2 网络分区、脑裂、丢失多数派处理
6.3 GTID事务不一致,节点无法恢复
6.4 复制恢复通道报错3092
6.5 表缺少主键导致写入报错
6.6 super_read_only异常不自动关闭 - 风哥针对本文总结
1 MGR组复制基础理论
风哥 itpux‑com
1.1 MGR组复制概念与核心能力
MGR全称MySQL Group Replication,MySQL官方原生高可用组复制插件,基于分布式Paxos一致性协议,实现多节点数据同步、故障自动检测、自动选主、成员自动管理。
传统异步/半同步主从复制为一主推送binlog给从库;MGR所有节点之间互相通信,事务提交需要组内多数节点达成共识之后,事务才正式提交,保证集群内数据一致性。
MGR核心能力清单:
- 故障自动检测:持续探测各个节点状态,识别宕机、网络隔离故障节点。
- 自动成员管理:故障节点自动被驱逐出集群,正常节点维护组成员列表。
- 自动选主:单主模式主节点故障,集群自动从存活节点选出新PRIMARY主节点。
- 数据一致性保障:事务需要多数派确认,避免脑裂带来的数据冲突。
- 两种运行模式:单主模式Single‑Primary、多主模式Multi‑Primary。
- 分布式恢复:新节点或者故障恢复节点自动从集群同步缺失事务,不需要手动导入备份。
1.2 MGR底层Paxos协议原理
MGR内部使用变种Paxos协议,**多数派(quorum)**是核心概念,集群节点数量建议为奇数(3、5、7节点),防止网络分区产生脑裂问题。
- 3节点集群,多数派等于2;存活节点≥2集群可以正常工作;仅剩余1节点,达不到多数派,集群全部节点进入只读,无法写入。
- 5节点集群,多数派等于3,至少存活3个节点集群才能对外提供写服务。
一条事务完整执行流程:
- 节点本地执行事务,写完binlog;
- 将事务广播发送给集群全部成员;
- 等待组内多数节点收到该事务消息;
- 达成共识,本地提交事务;
- 集群其他节点应用该事务,数据完成同步。
风哥教程 113257174
1.3 MGR单主模式与多主模式对比
| 项目 | 单主模式Single‑Primary | 多主模式Multi‑Primary |
|---|---|---|
| 读写权限 | 仅PRIMARY节点读写;其余SECONDARY节点自动super_read_only=ON只读 | 全部节点均支持读写 |
| 冲突检测 | 主节点写入,从库只应用,冲突概率极低 | 多节点同时写入,需要行级冲突检测,业务必须规避同记录多节点同时写 |
| 故障切换 | 主宕机自动选举出新主,自动关闭super_read_only | 任意节点故障,其余节点继续提供读写,业务需处理冲突 |
| 生产推荐 | ✅ 互联网、企业业务主流推荐 | ❌ 业务复杂场景不推荐,适合特定场景 |
| 约束 | 所有表必须有主键/唯一键 | 所有表必须有主键,业务层控制写冲突 |
1.4 MGR关键前置约束条件
部署MGR集群必须全部满足以下条件,否则集群无法正常运行:
- 全部数据表必须有主键或者唯一索引;无主键的表MGR无法处理行冲突检测;
- 存储引擎必须使用InnoDB,不支持MyISAM;
- 开启GTID模式
gtid_mode=ON,enforce_gtid_consistency=ON; - binlog格式必须为
ROW行模式; log_slave_updates=ON,从节点必须记录接收到的binlog;transaction_write_set_extraction=XXHASH64,用于事务写集冲突检测;- 每个实例
server‑id全局唯一,集群内部每个节点ID不能重复; - 网络互通,开放MySQL端口3306,MGR内部通信端口33061;
- 集群内所有节点时间尽量同步,建议配置NTP时间同步服务。
网上搜索风哥教程可以学习全套数据库教程
1.5 MySQL8.4 MGR核心特性
MySQL8.4为长期支持LTS版本,MGR属于InnoDB Cluster底层核心组件:
- 默认XCOM通信栈,单主模式为出厂默认;
- 支持clone分布式恢复,新节点自动全量拉取数据;
- 支持自动驱逐超时配置
group_replication_member_expel_timeout; - 支持节点自动重连尝试
group_replication_autorejoin_tries; - 完整支持InnoDB Cluster、MySQL Router配套组件;
- 兼容传统物理备份XtraBackup,逻辑备份mysqldump。
1.6 MySQL9.7 MGR新增增强特性
MySQL9.7为新一代LTS版本,MGR做了大量内核增强优化:
- MGR资源管理器 :监控节点内存、复制延迟,资源超限自动驱逐故障节点;参数
group_replication_resource_manager_enabled=ON; - 选主逻辑增强:优先选择事务数据最新的节点提升为主,减少故障切换之后数据丢失风险;
- 通信栈可切换为MYSQL协议,不再完全依赖XCOM;
- 增强自动重连机制,网络抖动之后节点自动尝试重新加入集群;
- 优化大事务复制性能,提升高并发场景吞吐量;
- 认证插件默认
caching_sha2_password,老客户端连接需要特殊适配。
风哥数据库教程 itpux‑com
1.7 MGR与传统主从复制差异对比
| 对比项 | 传统GTID主从复制 | MGR组复制 |
|---|---|---|
| 数据一致性 | 异步/半同步,无法严格保证强一致 | 多数派共识,集群达成共识再提交,强一致 |
| 故障转移 | 需要MHA等第三方工具实现自动切换 | 原生内置自动故障检测、自动选主 |
| 冲突处理 | 主库写入,从库回放,无冲突检测 | 多主模式自动行级冲突检测,冲突事务回滚 |
| 节点管理 | 主从角色静态配置 | 动态成员管理,故障节点自动剔除 |
| 多数派机制 | 无多数派概念,存在脑裂风险 | 奇数节点+多数派,规避脑裂风险 |
1.8 MGR集群网络、端口、账号规划规范
端口规划:
- 3306:MySQL业务SQL访问端口;
- 33061:MGR组复制内部通信端口,节点之间Paxos消息交互,防火墙必须放行该端口。
账号规划:
- MGR恢复通道账号,固定通道名
group_replication_recovery,账号用于节点分布式恢复,新节点加入同步数据,账号需要REPLICATION SLAVE权限,通道名称固定不能修改。
网络要求:集群内网低延迟网络,禁止跨公网部署MGR,公网延迟抖动会直接导致集群不稳定。
上51CTO搜索风哥可以学习全套数据库教程
2 第一套环境:Linux MySQL8.4 MGR组复制部署(独立环境)
说明:本套为独立实验环境,后续MySQL9.7为第二套完全独立环境,两套互不干涉。
实验集群规划,三节点,主机名:
- mgr84‑n1:
fgedu‑net‑cn1server‑id=1,64G内存8CPU - mgr84‑n2:
fgedu‑net‑cn2server‑id=2,64G内存8CPU - mgr84‑n3:
fgedu‑net‑cn3server‑id=3,64G内存8CPU
数据根目录全部为/fgedudb/fgedudb;实例名fgedudb。
操作系统为Linux,全部节点关闭防火墙或者放行3306、33061端口,配置NTP时间同步。
2.1 环境规划与前期检查
所有节点执行系统检查:
# 关闭selinux
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# 时间同步校验
timedatectl
# 端口预留检查
ss -tulnp | grep -E '3306|33061'
# 创建统一目录
mkdir -p /fgedudb/fgedudb
mkdir -p /fgedudb/log
mkdir -p /fgedudb/tmp
chown -R mysql:mysql /fgedudb
chmod 700 /fgedudb/fgedudb
2.2 MySQL8.4二进制安装部署(三节点)
所有三台节点上传mysql‑8.4.0‑linux‑glibc2.28‑x86_64.tar.xz二进制包,统一操作:
cd /usr/local
tar -xf mysql‑8.4.0‑linux‑glibc2.28‑x86_64.tar.xz
ln -sf mysql‑8.4.0‑linux‑glibc2.28‑x86_64 mysql
chown -R mysql:mysql /usr/local/mysql
# 环境变量
echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile
source /etc/profile
2.3 my.cnf完整配置(64G内存8CPU规格)
文件路径/fgedudb/my.cnf,每个节点修改server‑id、report_host、group_replication_local_address,其余配置全部一致。
[mysqld]
user=mysql
port=3306
socket=/fgedudb/fgedudb/mysql.sock
datadir=/fgedudb/fgedudb
pid‑file=/fgedudb/fgedudb/fgedudb.pid
log‑error=/fgedudb/log/error.log
tmpdir=/fgedudb/tmp
#基础实例参数 64G内存8CPU
server‑id=1
report_host=fgedu‑net‑cn1
lower_case_table_names=1
character‑set‑server=utf8mb4
collation‑server=utf8mb4_unicode_ci
max_connections=2000
max_allowed_packet=128M
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE"
#binlog与GTID配置 MGR强制要求
log_bin=binlog
binlog_format=ROW
binlog_checksum=NONE
sync_binlog=1
log_slave_updates=ON
gtid_mode=ON
enforce_gtid_consistency=ON
#relay日志存储在表
master_info_repository=TABLE
relay_log_info_repository=TABLE
#InnoDB参数,硬件64G内存,8CPU
default_storage_engine=InnoDB
innodb_file_per_table=1
innodb_buffer_pool_size=40G
innodb_buffer_pool_instances=8
innodb_log_file_size=4G
innodb_log_buffer_size=256M
innodb_flush_log_at_trx_commit=1
innodb_flush_method=O_DIRECT
innodb_read_io_threads=8
innodb_write_io_threads=8
#MGR组复制核心配置,三台节点group_name完全一致
transaction_write_set_extraction=XXHASH64
loose‑group_replication_group_name="aaaaaaaa‑bbbb‑cccc‑dddd‑eeeeeeeeeeee"
loose‑group_replication_start_on_boot=OFF
loose‑group_replication_local_address= "fgedu‑net‑cn1:33061"
loose‑group_replication_group_seeds= "fgedu‑net‑cn1:33061,fgedu‑net‑cn2:33061,fgedu‑net‑cn3:33061"
loose‑group_replication_bootstrap_group=OFF
loose‑group_replication_member_expel_timeout=5
loose‑group_replication_autorejoin_tries=3
#会话缓冲
sort_buffer_size=4M
join_buffer_size=4M
read_buffer_size=2M
read_rnd_buffer_size=4M
[mysql]
socket=/fgedudb/fgedudb/mysql.sock
default‑character‑set=utf8mb4
注意:节点2修改
server‑id=2、report_host=fgedu‑net‑cn2、group_replication_local_address="fgedu‑net‑cn2:33061";节点3修改server‑id=3、report_host=fgedu‑net‑cn3、group_replication_local_address="fgedu‑net‑cn3:33061";group_seeds三台节点完全相同。
2.4 初始化实例、配置systemd服务
三台节点全部执行初始化,生产环境不要使用‑‑initialize‑insecure,教程实验环境简化使用:
mysqld --initialize‑insecure --user=mysql --defaults‑file=/fgedudb/my.cnf
#编写systemd服务
cat > /etc/systemd/system/mysqld‑fgedudb.service <<EOF
[Unit]
Description=MySQL‑8.4‑fgedudb MGR Instance
After=network.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults‑file=/fgedudb/my.cnf
LimitNOFILE=65535
Restart=on‑failure
[Install]
WantedBy=multi‑user.target
EOF
systemctl daemon‑reload
systemctl start mysqld‑fgedudb
systemctl enable mysqld‑fgedudb
#验证实例启动
systemctl status mysqld‑fgedudb
2.5 MGR复制账号创建(三台节点全部执行)
登录实例:
mysql -S /fgedudb/fgedudb/mysql.sock
执行SQL,创建MGR分布式恢复通道账号repl:
CREATE USER repl@'%' IDENTIFIED BY 'Repl@MGR84_123';
GRANT REPLICATION SLAVE ON *.* TO repl@'%';
FLUSH PRIVILEGES;
#配置MGR固定恢复通道,通道名group_replication_recovery,名称固定不可修改
CHANGE REPLICATION SOURCE TO
SOURCE_USER='repl',
SOURCE_PASSWORD='Repl@MGR84_123'
FOR CHANNEL 'group_replication_recovery';
风哥教程 113257174
2.6 集群引导初始化,节点加入集群
⚠️只在第一个节点mgr84‑n1(fgedu‑net‑cn1)执行引导bootstrap,其余节点禁止执行bootstrap。
节点1执行:
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
#查看集群成员状态
SELECT * FROM performance_schema.replication_group_members;
此时节点1状态为ONLINE,角色PRIMARY。
节点2(fgedu‑net‑cn2)执行,直接加入集群:
START GROUP_REPLICATION;
SELECT * FROM performance_schema.replication_group_members;
节点3(fgedu‑net‑cn3)执行,直接加入集群:
START GROUP_REPLICATION;
SELECT * FROM performance_schema.replication_group_members;
预期结果:三个节点全部MEMBER_STATE=ONLINE;一个PRIMARY,两个SECONDARY。
2.7 MGR集群状态查看与基础验证
登录任意节点执行状态查询SQL:
--查看集群全部成员
SELECT MEMBER_ID,MEMBER_HOST,MEMBER_PORT,MEMBER_STATE,MEMBER_ROLE,MEMBER_VERSION
FROM performance_schema.replication_group_members;
--查看成员统计、事务队列、冲突检测统计
SELECT * FROM performance_schema.replication_group_member_stats\G
业务读写验证,登录PRIMARY主节点:
CREATE DATABASE IF NOT EXISTS fgedudb DEFAULT CHARSET utf8mb4;
USE fgedudb;
CREATE TABLE fg_mgr_test(id BIGINT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(64));
INSERT INTO fg_mgr_test(name) VALUES('test01'),('test02');
SELECT * FROM fg_mgr_test;
切换登录SECONDARY从节点,验证数据已经同步过来;从节点尝试写入会报错,因为单主模式SECONDARY开启super_read_only。
网上搜索风哥教程可以学习全套数据库教程
2.8 MySQL Router部署配置,业务访问接入
在任意一台节点部署MySQL Router,用于业务透明访问MGR集群,实现读写分离、故障自动路由切换。
#安装mysql‑router,8.4配套版本
yum install mysql‑router‑community‑8.4
#初始化router
mysqlrouter --bootstrap repl@fgedu‑net‑cn1:3306 --user=mysqlrouter --directory=/fgedudb/mysqlrouter
生成配置文件,对外端口:6446读写端口(转发到PRIMARY);6447只读端口(负载均衡SECONDARY节点)。
启动服务,业务应用连接Router地址,不再直连MGR后端节点。
2.9 业务读写功能验证
业务程序连接Router 6446端口执行写;连接6447执行查询,验证读写分离效果。
3 MySQL8.4 MGR集群日常运维实战
3.1 MGR常用监控SQL语句
#成员状态
SELECT * FROM performance_schema.replication_group_members;
#复制统计信息,冲突、已处理事务
SELECT * FROM performance_schema.replication_group_member_stats\G
#查看当前集群是否单主模式
SHOW VARIABLES LIKE 'group_replication_single_primary_mode';
#查看复制通道状态
SELECT * FROM performance_schema.replication_connection_status WHERE CHANNEL_NAME='group_replication_recovery';
3.2 新增节点加入集群实操
新增一台节点mgr84‑n4,完成my.cnf配置、初始化实例,创建repl账号,配置group_replication_recovery通道,执行:
START GROUP_REPLICATION;
SELECT * FROM performance_schema.replication_group_members;
新节点进入RECOVERING状态,分布式恢复自动同步集群全部事务,同步完成切换为ONLINE。
3.3 节点下线、剔除集群实操
计划下线某节点,在该节点执行:
STOP GROUP_REPLICATION;
该节点主动离开集群,其余节点自动更新成员列表。
如果节点故障失联,集群会自动驱逐该节点。
3.4 MGR集群逻辑备份mysqldump实操
备份操作建议在SECONDARY从节点执行,不影响主节点业务压力:
mysqldump -S /fgedudb/fgedudb/mysql.sock --single‑transaction --routines --triggers --all‑databases --set‑gtid‑purged=OFF > /fgedudb/backup/mgr84_all_$(date +%Y%m%d).sql
3.5 MGR物理备份XtraBackup实操
xtrabackup --backup --user=root --socket=/fgedudb/fgedudb/mysql.sock --target‑dir=/fgedudb/backup/xtra_mgr84_full_$(date +%Y%m%d)
3.6 模拟主节点故障,自动故障切换演练
在原PRIMARY节点执行停止MySQL服务模拟宕机:
systemctl stop mysqld‑fgedudb
登录剩余存活节点查看集群状态:
SELECT * FROM performance_schema.replication_group_members;
原主节点状态变为UNREACHABLE;集群自动选举出新PRIMARY节点,新主节点自动关闭super_read_only,可以正常接收业务写入,完成故障自动切换。
3.7 单主模式切换至多主模式实操
⚠️生产环境谨慎操作,多主模式业务层必须处理写冲突
SET GLOBAL group_replication_switch_to_multi_primary_mode();
SELECT * FROM performance_schema.replication_group_members;
切换完成,集群全部节点都为读写模式。切回单主模式:
SET GLOBAL group_replication_switch_to_single_primary_mode();
风哥数据库教程 itpux‑com
4 第二套环境:Linux MySQL9.7 MGR组复制部署(独立环境,与8.4环境无关)
重要说明:本套环境完全独立,不与上面MySQL8.4集群互通,为全新一套三节点MGR集群,MySQL版本9.7,硬件同样64G内存8CPU
集群规划:
- mgr97‑n1:
fgedu‑net‑cn1server‑id=11 - mgr97‑n2:
fgedu‑net‑cn2server‑id=12 - mgr97‑n3:
fgedu‑net‑cn3server‑id=13
数据目录/fgedudb/fgedudb,端口3306业务端口,33061MGR通信端口。
4.1 MySQL9.7环境规划、前期环境校验
三台节点执行前置检查,关闭selinux,NTP时间同步,目录创建,同8.4环境。
mkdir -p /fgedudb/fgedudb
mkdir -p /fgedudb/log
mkdir -p /fgedudb/tmp
chown -R mysql:mysql /fgedudb
chmod 700 /fgedudb/fgedudb
4.2 MySQL9.7二进制安装部署三节点
上传mysql‑9.7.0‑linux‑glibc2.28‑x86_64.tar.xz二进制包
cd /usr/local
tar -xf mysql‑9.7.0‑linux‑glibc2.28‑x86_64.tar.xz
ln -sf mysql‑9.7.0‑linux‑glibc2.28‑x86_64 mysql97
echo 'export PATH=$PATH:/usr/local/mysql97/bin' >> /etc/profile
source /etc/profile
4.3 my.cnf配置文件编写,适配9.7新参数,64G内存8CPU
路径/fgedudb/my.cnf,9.7新增MGR资源管理器参数,注意每个节点修改server‑id、report_host、local_address。
[mysqld]
user=mysql
port=3306
socket=/fgedudb/fgedudb/mysql.sock
datadir=/fgedudb/fgedudb
pid‑file=/fgedudb/fgedudb/fgedudb.pid
log‑error=/fgedudb/log/error.log
tmpdir=/fgedudb/tmp
#基础实例参数 64G内存8CPU
server‑id=11
report_host=fgedu‑net‑cn1
lower_case_table_names=1
character‑set‑server=utf8mb4
collation‑server=utf8mb4_unicode_ci
max_connections=2000
max_allowed_packet=128M
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE"
#binlog GTID
log_bin=binlog
binlog_format=ROW
binlog_checksum=NONE
sync_binlog=1
log_slave_updates=ON
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
#InnoDB内存参数
default_storage_engine=InnoDB
innodb_file_per_table=1
innodb_buffer_pool_size=40G
innodb_buffer_pool_instances=8
innodb_log_file_size=4G
innodb_log_buffer_size=256M
innodb_flush_log_at_trx_commit=1
innodb_flush_method=O_DIRECT
innodb_read_io_threads=8
innodb_write_io_threads=8
#MGR 9.7配置,新增资源管理器开关
transaction_write_set_extraction=XXHASH64
loose‑group_replication_group_name="bbbb‑aaaa‑cccc‑dddd‑aaaaaaaaaaaaaaaa"
loose‑group_replication_start_on_boot=OFF
loose‑group_replication_local_address= "fgedu‑net‑cn1:33061"
loose‑group_replication_group_seeds= "fgedu‑net‑cn1:33061,fgedu‑net‑cn2:33061,fgedu‑net‑cn3:33061"
loose‑group_replication_bootstrap_group=OFF
loose‑group_replication_member_expel_timeout=5
loose‑group_replication_autorejoin_tries=3
#9.7新增MGR资源管理器,监控内存、复制延迟超限自动驱逐节点
loose‑group_replication_resource_manager_enabled=ON
#会话内存参数
sort_buffer_size=4M
join_buffer_size=4M
read_buffer_size=2M
read_rnd_buffer_size=4M
[mysql]
socket=/fgedudb/fgedudb/mysql.sock
default‑character‑set=utf8mb4
4.4 systemd服务配置、实例初始化
三台节点初始化实例:
/usr/local/mysql97/bin/mysqld --initialize‑insecure --user=mysql --defaults‑file=/fgedudb/my.cnf
cat > /etc/systemd/system/mysqld‑fgedudb.service <<EOF
[Unit]
Description=MySQL‑9.7‑fgedudb MGR Instance
After=network.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql97/bin/mysqld --defaults‑file=/fgedudb/my.cnf
LimitNOFILE=65535
Restart=on‑failure
[Install]
WantedBy=multi‑user.target
EOF
systemctl daemon‑reload
systemctl start mysqld‑fgedudb
systemctl enable mysqld‑fgedudb
systemctl status mysqld‑fgedudb
4.5 MGR复制账号创建,适配9.7认证规则
9.7默认认证插件caching_sha2_password,三台节点全部执行:
mysql -S /fgedudb/fgedudb/mysql.sock
CREATE USER repl@'%' IDENTIFIED BY 'Repl@MGR97_123';
GRANT REPLICATION SLAVE ON *.* TO repl@'%';
FLUSH PRIVILEGES;
#配置MGR恢复通道,通道名称固定
CHANGE REPLICATION SOURCE TO
SOURCE_USER='repl',
SOURCE_PASSWORD='Repl@MGR97_123'
FOR CHANNEL 'group_replication_recovery';
4.6 9.7 MGR集群初始化引导,节点加入集群
仅mgr97‑n1(fgedu‑net‑cn1)执行bootstrap引导
节点1:
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
SELECT * FROM performance_schema.replication_group_members;
节点2:
START GROUP_REPLICATION;
SELECT * FROM performance_schema.replication_group_members;
节点3:
START GROUP_REPLICATION;
SELECT * FROM performance_schema.replication_group_members;
全部节点状态ONLINE,一个PRIMARY,两个SECONDARY。
4.7 集群状态校验,业务读写验证
主节点测试业务库:
CREATE DATABASE fgedudb;
USE fgedudb;
CREATE TABLE fg_97_mgr_test(id BIGINT PRIMARY KEY AUTO_INCREMENT,info VARCHAR(100));
INSERT INTO fg_97_mgr_test(info) VALUES('mysql9.7 mgr test');
SELECT * FROM fg_97_mgr_test;
登录从节点确认数据同步完成。
4.8 MySQL Router适配9.7版本配置
安装对应9.7版本mysql‑router‑community,bootstrap指向集群节点,完成路由配置。
上51CTO搜索风哥可以学习全套数据库教程
5 MySQL9.7 MGR集群运维实战
5.1 9.7 MGR资源管理器使用
9.7新增资源管理器,自动监控复制延迟、内存占用超限驱逐节点,查看资源管理器状态:
SELECT * FROM performance_schema.group_replication_resource_manager_stats\G
可以配置阈值参数,例如内存超限阈值、复制延迟阈值。
5.2 节点故障自动驱逐、自动重连配置
参数group_replication_autorejoin_tries=3,网络抖动节点被驱逐之后,会自动尝试3次重新加入集群,减少人工干预。
5.3 备份恢复实操
逻辑备份(从节点执行)
mysqldump -S /fgedudb/fgedudb/mysql.sock --single‑transaction --routines --triggers --all‑databases --set‑gtid‑purged=OFF > /fgedudb/backup/mgr97_all_$(date +%Y%m%d).sql
5.4 故障切换模拟演练
停止主节点systemctl stop mysqld‑fgedudb,查看集群自动选主,验证业务写入正常。
6 MGR集群故障排查实战(两套环境通用)
6.1 节点加入集群报MEMBER_STATE=ERROR
常见根因:
- server‑id集群内部重复;
- 防火墙没有放行33061内部通信端口;
- group_replication_recovery通道账号密码错误;
- GTID事务集合不一致。
排查步骤:
-
查看实例error.log日志,
/fgedudb/log/error.log; -
确认每个节点server‑id互不重复;
-
telnet测试33061端口网络连通;
-
检查
group_replication_recovery通道账号权限; -
故障节点清理:
STOP GROUP_REPLICATION;
RESET REPLICA ALL;
RESET BINARY LOGS AND GTIDS;
START GROUP_REPLICATION;
6.2 网络分区、脑裂、丢失多数派
现象:集群节点网络断开,剩余节点不足半数,所有节点只能读不能写。
3节点集群只剩1台存活,达不到多数派,此时需要强制指定成员列表,谨慎操作:
SET GLOBAL group_replication_force_members="fgedu‑net‑cn1:33061";
风险提示:该操作需要业务确认故障节点完全停机,防止双集群脑裂写冲突。生产优先保证集群节点为奇数。
6.3 GTID事务不一致,节点无法恢复
故障节点数据GTID集合和集群差距过大,分布式恢复失败。
处理方案:故障节点清空数据目录,从正常节点执行全量备份导入,重置GTID,再启动START GROUP_REPLICATION。
6.4 复制恢复通道报错3092
报错3092几乎都是group_replication_recovery通道账号配置错误,账号不存在、密码错误、缺少REPLICATION SLAVE权限。
重新执行配置恢复通道命令,账号密码核对正确,通道名称group_replication_recovery不能修改。
CHANGE REPLICATION SOURCE TO
SOURCE_USER='repl',
SOURCE_PASSWORD='Repl@xxxxxx'
FOR CHANNEL 'group_replication_recovery';
6.5 表缺少主键导致写入报错
MGR强制要求所有InnoDB表必须拥有主键/唯一索引,没有主键的表事务提交直接报错。
解决方案:给业务表增加主键,这是MGR硬性约束,上线前期做DDL检查。
6.6 super_read_only异常不自动关闭
故障切换完成新主节点super_read_only仍然开启,无法写入业务。
临时手动关闭:
SET GLOBAL super_read_only=OFF;
根源排查my.cnf参数,确认单主模式参数group_replication_single_primary_mode=ON开启。
7 风哥针对本文总结
风哥教程本文完整讲解MGR组复制理论,并且完成两套完全独立环境的实战部署:第一套MySQL8.4 MGR组复制,第二套MySQL9.7 MGR组复制;两套环境硬件规格均为64G内存8CPU,数据目录/fgedudb,实例fgedudb。
核心要点梳理:
- MGR基于变种Paxos多数派协议,集群节点建议配置奇数个,规避网络分区脑裂风险;生产优先使用单主Single‑Primary模式,多主模式业务需要自行处理多节点写入冲突,一般不推荐直接上生产。
- MGR部署硬性约束:全部业务InnoDB表必须有主键;开启GTID;binlog必须ROW格式;
log_slave_updates=ON;节点之间开放33061MGR通信端口;NTP时间同步。 - MySQL8.4为成熟稳定LTS版本,MGR配套InnoDB Cluster、MySQL Router,运维生态完善。MySQL9.7新增MGR资源管理器、选主逻辑优化,自动驱逐资源超限节点,增强集群稳定性,但新版本上线前需要充分做兼容性验证。
- MGR集群账号关键点:固定名称
group_replication_recovery恢复通道账号,用于节点分布式恢复,账号需要REPLICATION SLAVE权限,该通道名字不可自定义修改。 - 运维重点:上线必须做故障切换演练,模拟主节点宕机,验证自动选主业务连续性;备份优先在SECONDARY从节点执行,降低主库压力;监控重点关注
performance_schema.replication_group_members状态,任何节点出现ERROR/UNREACHABLE及时介入处理。 - 故障排查优先查看error.log错误日志,MGR绝大多数报错信息会记录在错误日志中,优先定位日志再处理问题;遇到丢失多数派、网络分区场景,
group_replication_force_members强制成员命令属于高危操作,操作前确认故障节点已经彻底停机,避免脑裂产生数据损坏。
MGR虽然内置高可用,但不等于零运维,仍然需要持续监控、定期备份、故障演练,才能保障生产数据库稳定运行。