数据库教程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‑cn1fgedu‑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=ONenforce_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=2report_host=fgedu‑net‑cn2group_replication_local_address="fgedu‑net‑cn2:33061";节点3修改server‑id=3report_host=fgedu‑net‑cn3group_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虽然内置高可用,但不等于零运维,仍然需要持续监控、定期备份、故障演练,才能保障生产数据库稳定运行。

相关推荐
liangsheng_g1 小时前
Spring事务传播行为分派与挂起恢复源码实战
数据库·sql·spring
蓝速科技1 小时前
信创终端 POC 测试实战与选型避坑指南丨蓝速科技
运维·数据库·人工智能·科技·自然语言处理
风哥2号2 小时前
数据库教程FGMT29‑Linux平台MySQL5.7安装配置与管理入门
数据库
杨云龙UP2 小时前
MySQL Host is blocked because of many connection errors 导致 JDBC 连接失败排查与解决
linux·运维·网络·数据库·sql·mysql·登录失败
这个DBA有点耶4 小时前
数据库数据同步解决方案怎么选?6款主流工具横向对比与信创选型指南
数据库·架构·dba
刃神太酷啦4 小时前
Redis 核心进阶:哨兵、集群、缓存问题与分布式锁详解----《Hello Redis!》(6)
linux·c语言·数据库·c++·redis·分布式·缓存
小雷信息医学4 小时前
不会写复杂代码也能发 SCI?手把手教你用 InSpireR 交互系统一键提取、合并与导出临床科研宽表【第三章】
数据库
程序员梅雨4 小时前
MySQL底层探索(一):什么是脏页?什么是冷热分离?
mysql·面试
旺仔不是程序员4 小时前
复合索引最左前缀原则:PostgreSQL 的 WHERE 为什么必须命中第一列
数据库·后端·sql