1. 首页 > MySQL教程 > 正文

数据库教程FGMT33‑MySQL主从复制项目实施与维护06(MySQL8.4/9.7 MGR组复制)

数据库教程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%为总结。

>
> 实操提醒:所有命令优先在测试环境执行,上线生产前务必完成备份、功能验证、故障切换演练。
> 网上搜索风哥教程可以学习全套数据库教程

## 目录

1. 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集群网络、端口、账号规划规范
2. 第一套环境: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 业务读写功能验证
3. MySQL8.4 MGR集群日常运维实战
3.1 MGR常用监控SQL语句
3.2 新增节点加入集群实操
3.3 节点下线、剔除集群实操
3.4 MGR集群逻辑备份mysqldump实操
3.5 MGR物理备份XtraBackup实操
3.6 模拟主节点故障,自动故障切换演练
3.7 单主模式切换至多主模式实操
4. 第二套环境: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版本配置
5. MySQL9.7 MGR集群运维实战
5.1 9.7 MGR资源管理器使用
5.2 节点故障自动驱逐、自动重连配置
5.3 备份恢复实操
5.4 故障切换模拟演练
6. MGR集群故障排查实战(两套环境通用)
6.1 节点加入集群报ERROR状态排查
6.2 网络分区、脑裂、丢失多数派处理
6.3 GTID事务不一致,节点无法恢复
6.4 复制恢复通道报错3092
6.5 表缺少主键导致写入报错
6.6 super_read_only异常不自动关闭
7. 风哥针对本文总结

## 1 MGR组复制基础理论

>
> 风哥 itpux‑com

### 1.1 MGR组复制概念与核心能力

MGR全称MySQL Group Replication,MySQL官方原生高可用组复制插件,基于分布式Paxos一致性协议,实现多节点数据同步、故障自动检测、自动选主、成员自动管理。
传统异步/半同步主从复制为一主推送binlog给从库;MGR所有节点之间互相通信,事务提交需要组内多数节点达成共识之后,事务才正式提交,保证集群内数据一致性。

MGR核心能力清单:

1. **故障自动检测**:持续探测各个节点状态,识别宕机、网络隔离故障节点。
2. **自动成员管理**:故障节点自动被驱逐出集群,正常节点维护组成员列表。
3. **自动选主**:单主模式主节点故障,集群自动从存活节点选出新PRIMARY主节点。
4. **数据一致性保障**:事务需要多数派确认,避免脑裂带来的数据冲突。
5. **两种运行模式**:单主模式Single‑Primary、多主模式Multi‑Primary。
6. **分布式恢复**:新节点或者故障恢复节点自动从集群同步缺失事务,不需要手动导入备份。

### 1.2 MGR底层Paxos协议原理

MGR内部使用变种Paxos协议,**多数派(quorum)**是核心概念,集群节点数量建议为奇数(3、5、7节点),防止网络分区产生脑裂问题。

– 3节点集群,多数派等于2;存活节点≥2集群可以正常工作;仅剩余1节点,达不到多数派,集群全部节点进入只读,无法写入。
– 5节点集群,多数派等于3,至少存活3个节点集群才能对外提供写服务。

一条事务完整执行流程:

1. 节点本地执行事务,写完binlog;
2. 将事务广播发送给集群全部成员;
3. 等待组内多数节点收到该事务消息;
4. 达成共识,本地提交事务;
5. 集群其他节点应用该事务,数据完成同步。

>
> 风哥教程 113257174

### 1.3 MGR单主模式与多主模式对比

| 项目 | 单主模式Single‑Primary | 多主模式Multi‑Primary |
| — | — | — |
| 读写权限 | 仅PRIMARY节点读写;其余SECONDARY节点自动super_read_only=ON只读 | 全部节点均支持读写 |
| 冲突检测 | 主节点写入,从库只应用,冲突概率极低 | 多节点同时写入,需要行级冲突检测,业务必须规避同记录多节点同时写 |
| 故障切换 | 主宕机自动选举出新主,自动关闭super_read_only | 任意节点故障,其余节点继续提供读写,业务需处理冲突 |
| 生产推荐 | ✅ 互联网、企业业务主流推荐 | ❌ 业务复杂场景不推荐,适合特定场景 |
| 约束 | 所有表必须有主键/唯一键 | 所有表必须有主键,业务层控制写冲突 |

### 1.4 MGR关键前置约束条件

部署MGR集群必须全部满足以下条件,否则集群无法正常运行:

1. 全部数据表必须有主键或者唯一索引;无主键的表MGR无法处理行冲突检测;
2. 存储引擎必须使用InnoDB,不支持MyISAM;
3. 开启GTID模式`gtid_mode=ON`,`enforce_gtid_consistency=ON`;
4. binlog格式必须为`ROW`行模式;
5. `log_slave_updates=ON`,从节点必须记录接收到的binlog;
6. `transaction_write_set_extraction=XXHASH64`,用于事务写集冲突检测;
7. 每个实例`server‑id`全局唯一,集群内部每个节点ID不能重复;
8. 网络互通,开放MySQL端口3306,MGR内部通信端口33061;
9. 集群内所有节点时间尽量同步,建议配置NTP时间同步服务。

>
> 网上搜索风哥教程可以学习全套数据库教程

### 1.5 MySQL8.4 MGR核心特性

MySQL8.4为长期支持LTS版本,MGR属于InnoDB Cluster底层核心组件:

1. 默认XCOM通信栈,单主模式为出厂默认;
2. 支持clone分布式恢复,新节点自动全量拉取数据;
3. 支持自动驱逐超时配置`group_replication_member_expel_timeout`;
4. 支持节点自动重连尝试`group_replication_autorejoin_tries`;
5. 完整支持InnoDB Cluster、MySQL Router配套组件;
6. 兼容传统物理备份XtraBackup,逻辑备份mysqldump。

### 1.6 MySQL9.7 MGR新增增强特性

MySQL9.7为新一代LTS版本,MGR做了大量内核增强优化:

1. **MGR资源管理器**:监控节点内存、复制延迟,资源超限自动驱逐故障节点;参数`group_replication_resource_manager_enabled=ON`;
2. **选主逻辑增强**:优先选择事务数据最新的节点提升为主,减少故障切换之后数据丢失风险;
3. 通信栈可切换为MYSQL协议,不再完全依赖XCOM;
4. 增强自动重连机制,网络抖动之后节点自动尝试重新加入集群;
5. 优化大事务复制性能,提升高并发场景吞吐量;
6. 认证插件默认`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‑cn1` server‑id=1,64G内存8CPU
– mgr84‑n2:`fgedu‑net‑cn2` server‑id=2,64G内存8CPU
– mgr84‑n3:`fgedu‑net‑cn3` server‑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‑cn1` server‑id=11
– mgr97‑n2:`fgedu‑net‑cn2` server‑id=12
– mgr97‑n3:`fgedu‑net‑cn3` server‑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

常见根因:

1. server‑id集群内部重复;
2. 防火墙没有放行33061内部通信端口;
3. group_replication_recovery通道账号密码错误;
4. GTID事务集合不一致。

排查步骤:

1. 查看实例error.log日志,`/fgedudb/log/error.log`;
2. 确认每个节点server‑id互不重复;
3. telnet测试33061端口网络连通;
4. 检查`group_replication_recovery`通道账号权限;
5. 故障节点清理:

“`
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。

核心要点梳理:

1. MGR基于变种Paxos多数派协议,集群节点建议配置奇数个,规避网络分区脑裂风险;生产优先使用**单主Single‑Primary模式**,多主模式业务需要自行处理多节点写入冲突,一般不推荐直接上生产。
2. MGR部署硬性约束:全部业务InnoDB表必须有主键;开启GTID;binlog必须ROW格式;`log_slave_updates=ON`;节点之间开放33061MGR通信端口;NTP时间同步。
3. MySQL8.4为成熟稳定LTS版本,MGR配套InnoDB Cluster、MySQL Router,运维生态完善。MySQL9.7新增MGR资源管理器、选主逻辑优化,自动驱逐资源超限节点,增强集群稳定性,但新版本上线前需要充分做兼容性验证。
4. MGR集群账号关键点:固定名称`group_replication_recovery`恢复通道账号,用于节点分布式恢复,账号需要REPLICATION SLAVE权限,该通道名字不可自定义修改。
5. 运维重点:上线必须做故障切换演练,模拟主节点宕机,验证自动选主业务连续性;备份优先在SECONDARY从节点执行,降低主库压力;监控重点关注`performance_schema.replication_group_members`状态,任何节点出现ERROR/UNREACHABLE及时介入处理。
6. 故障排查优先查看error.log错误日志,MGR绝大多数报错信息会记录在错误日志中,优先定位日志再处理问题;遇到丢失多数派、网络分区场景,`group_replication_force_members`强制成员命令属于高危操作,操作前确认故障节点已经彻底停机,避免脑裂产生数据损坏。

MGR虽然内置高可用,但不等于零运维,仍然需要持续监控、定期备份、故障演练,才能保障生产数据库稳定运行。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息