第四章 ReplicaSet高可用配置原创
# 第四章 ReplicaSet高可用配置
本章覆盖 MySQL 8.0 异步/半同步主从复制集群的完整搭建路径:拓扑选型与高可用级别、主从节点的参数配置、复制用户与权限、基于 GTID 的复制建立、半同步插件配置、以及复制状态的验证方法。本章内容可与第六章故障处理手册配合使用。
版本说明
本章配置基于 MySQL 8.0 全系列。半同步复制插件在 8.0 中为内置功能,无需额外安装。复制命令语法采用 8.0.22+ 新命名(REPLICA 替代 SLAVE),旧命令在 8.0 中仍兼容。
# 4.1 拓扑选型与高可用级别
MySQL 复制支持多种拓扑结构和高可用级别,选择适合业务需求的方案是搭建高可用集群的第一步。
# 常见拓扑结构
一主一从:最基础的复制架构,适用于读写分离和备份下沉场景。主库处理写请求,从库处理读请求或作为备份源。缺点是单点故障时没有自动故障转移。
一主两从:推荐的生产配置。可分摊读流量,单节点故障时仍有冗余。若采用半同步复制,两从库中至少一个 ACK 后主库即可提交,兼顾性能与数据安全。
一主多从 + 级联复制:当读节点超过 3 个时,可考虑级联复制(A→B→C),减轻主库的 Binlog 传输压力。但级联增加了复制延迟累积的风险。
# 高可用级别对比
| 级别 | 机制 | 数据一致性 | 故障切换方式 |
|---|---|---|---|
| 异步复制 | 主库写入即返回 | 可能丢数据 | 手动或脚本切换 |
| 半同步复制 | 至少一个从库 ACK 后返回 | 基本不丢(超时降异步) | 手动或脚本切换 |
| InnoDB Cluster | Group Replication | 强一致 | MySQL Shell 自动 |
选型建议:对数据一致性要求高的核心业务采用半同步复制,并辅以 Orchestrator 等自动切换工具。对一致性要求不高的报表库可采用异步复制。
# 4.2 复制前置配置
# 主节点参数(my.cnf)
[mysqld]
server_id = 1 # 必须唯一
log_bin = /data/mysql/logs/binlog/mysql-bin
binlog_format = ROW
sync_binlog = 1
# GTID 配置(8.0 默认开启,显式声明更安全)
gtid_mode = ON
enforce_gtid_consistency = ON
# 半同步复制(主库侧)
rpl_semi_sync_master_enabled = 1
rpl_semi_sync_master_timeout = 10000 # 10秒超时降异步
# 日志保留
expire_logs_days = 7
binlog_expire_logs_seconds = 604800 # 8.0.1+ 推荐使用
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 从节点参数(my.cnf)
[mysqld]
server_id = 2 # 与主库不同
log_bin = /data/mysql/logs/binlog/mysql-bin
binlog_format = ROW
# GTID
gtid_mode = ON
enforce_gtid_consistency = ON
# 从库只读
read_only = ON
super_read_only = ON # 连超级用户也只读
# 半同步复制(从库侧)
rpl_semi_sync_slave_enabled = 1
# 日志保留(级联复制需要)
log_replica_updates = ON # 从库也写 binlog(8.0.22+ 语法)
# 或 log_slave_updates(兼容旧语法)
expirre_logs_days = 7
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
参数说明:
read_only = ON:普通用户只读,super 权限用户仍可写super_read_only = ON:super 用户也强制只读,防止误操作
# 4.3 复制用户与权限配置
在主节点创建专用复制用户:
-- MySQL 8.0 默认使用 caching_sha2_password
CREATE USER 'repl'@'%' IDENTIFIED WITH caching_sha2_password BY 'StrongP@ssw0rd';
-- 授予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
2
3
4
5
6
7
8
注意:若使用 mysql_native_password(兼容旧客户端):
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'StrongP@ssw0rd';
# 4.4 建立复制链路
# 基于 GTID 的自动定位
从节点执行:
-- 停止已有复制(若存在)
STOP REPLICA;
RESET REPLICA ALL;
-- 配置主库信息(8.0.23+ 语法)
CHANGE REPLICATION SOURCE TO
SOURCE_HOST = '192.0.2.11',
SOURCE_PORT = 3306,
SOURCE_USER = 'repl',
SOURCE_PASSWORD = 'StrongP@ssw0rd',
SOURCE_AUTO_POSITION = 1; -- 使用 GTID 自动定位
-- 启动复制
START REPLICA;
2
3
4
5
6
7
8
9
10
11
12
13
14
旧版语法(8.0.23 之前):
CHANGE MASTER TO
MASTER_HOST = '192.0.2.11',
MASTER_PORT = 3306,
MASTER_USER = 'repl',
MASTER_PASSWORD = 'StrongP@ssw0rd',
MASTER_AUTO_POSITION = 1;
2
3
4
5
6
# 首次全量数据同步
若从库是全新实例,需先同步主库数据:
# 主库备份
mysqldump --single-transaction --master-data=2 -A > full_backup.sql
# 传输到从库
scp full_backup.sql root@192.0.2.12:/tmp/
# 从库导入
mysql < /tmp/full_backup.sql
2
3
4
5
6
7
8
# 4.5 半同步复制配置
# 加载插件(如未启用)
主库:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled = 1;
SET GLOBAL rpl_semi_sync_master_timeout = 10000;
2
3
从库:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
2
# 写入配置文件
# 主库 my.cnf
plugin_load_add = semisync_master.so
rpl_semi_sync_master_enabled = 1
rpl_semi_sync_master_timeout = 10000
# 从库 my.cnf
plugin_load_add = semisync_slave.so
rpl_semi_sync_slave_enabled = 1
2
3
4
5
6
7
8
降级机制:当从库 ACK 超时(默认 10 秒),主库自动降级为异步复制,避免写入阻塞。
# 4.6 复制状态验证
# 基础状态检查
从库执行:
SHOW REPLICA STATUS\G
关键字段解读:
| 字段 | 正常值 | 异常排查 |
|---|---|---|
| Replica_IO_Running | Yes | No 则检查网络/账号 |
| Replica_SQL_Running | Yes | No 则检查 SQL 错误 |
| Seconds_Behind_Source | 0 或较小 | 持续增大说明延迟 |
| Last_Error | 空 | 报错则按错误码处理 |
# GTID 一致性验证
-- 主库
SHOW MASTER STATUS;
-- 记录 Executed_Gtid_Set
-- 从库
SHOW REPLICA STATUS\G
-- 确认 Retrieved_Gtid_Set 与主库一致
2
3
4
5
6
7
# 半同步状态验证
-- 主库查看半同步连接数
SHOW STATUS LIKE 'Rpl_semi_sync_master_clients';
-- 查看半同步状态
SHOW STATUS LIKE 'Rpl_semi_sync_master_status';
-- ON 表示半同步生效,OFF 表示已降级为异步
2
3
4
5
6
# 4.7 故障切换预案
当主库故障不可恢复时,需要手动将从库提升为新主库。切换前必须确认:
- 原主库确实无法恢复(避免脑裂)
- 候选从库的复制延迟可接受(通过 Seconds_Behind_Source 判断)
- 已通知相关业务方暂停写入
# 手动切换步骤
在从库执行:
-- 停止复制
STOP REPLICA;
RESET REPLICA ALL;
-- 取消只读
SET GLOBAL read_only = OFF;
SET GLOBAL super_read_only = OFF;
-- 记录当前位点(供其他从库使用)
SHOW MASTER STATUS;
2
3
4
5
6
7
8
9
10
# 其他从库改指向新主库
STOP REPLICA;
CHANGE REPLICATION SOURCE TO
SOURCE_HOST = '新主库IP',
SOURCE_USER = 'repl',
SOURCE_PASSWORD = '密码',
SOURCE_AUTO_POSITION = 1;
START REPLICA;
2
3
4
5
6
7
# 自动切换工具
生产环境建议使用成熟工具实现自动故障发现和切换:
- Orchestrator:可视化拓扑管理,支持自动故障检测和优雅切换
- MHA (Master High Availability):成熟的 MySQL 高可用方案,支持 VIP 漂移
重要:自动切换必须配合监控告警,切换后人工确认数据一致性。
🤖 Agent 可直接解析的元数据块(点击展开)
{
"_meta": {
"doc_version": "2024-01-09",
"article_id": "mysql8-sop-chapter4",
"profile_context": "mysql-sop",
"estimated_setup_time": "45min"
},
"quick_start": {
"create_repl_user": "GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'",
"change_source": "CHANGE REPLICATION SOURCE TO SOURCE_HOST='主库IP', SOURCE_USER='repl', SOURCE_AUTO_POSITION=1",
"start_replica": "START REPLICA",
"check_status": "SHOW REPLICA STATUS\\G"
},
"safety_rules": [
"server_id 集群内必须唯一",
"从库必须设置 read_only = ON",
"半同步超时会降级为异步,需监控",
"故障切换前确认主库确实不可恢复"
],
"verification": {
"io_running": "SHOW REPLICA STATUS; Replica_IO_Running = Yes",
"sql_running": "SHOW REPLICA STATUS; Replica_SQL_Running = Yes",
"seconds_behind": "SHOW REPLICA STATUS; Seconds_Behind_Source ≈ 0",
"gtid_match": "主库 Executed_Gtid_Set == 从库 Retrieved_Gtid_Set"
}
}
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