灯下哥谭 灯下哥谭
首页
关于
  • Hermes Agent 平台
  • Claude Code
  • OpenClaw
  • GPU 推理节点运维
  • MySQL 运维知识地图
  • Elasticsearch 运维知识地图
  • Redis 运维知识地图
  • TiDB 体系
  • DBA 常用 SQL 与命令
  • Nginx 运维知识地图
  • Prometheus 监控
  • Docker
  • Systemd
  • Iptables
  • Firewalld
  • Sshd
  • MySQL8 运维 SOP 手册
  • MySQL 实战 45 讲(读书笔记)
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

灯下哥谭

灯还亮着
首页
关于
  • Hermes Agent 平台
  • Claude Code
  • OpenClaw
  • GPU 推理节点运维
  • MySQL 运维知识地图
  • Elasticsearch 运维知识地图
  • Redis 运维知识地图
  • TiDB 体系
  • DBA 常用 SQL 与命令
  • Nginx 运维知识地图
  • Prometheus 监控
  • Docker
  • Systemd
  • Iptables
  • Firewalld
  • Sshd
  • MySQL8 运维 SOP 手册
  • MySQL 实战 45 讲(读书笔记)
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • MySQL8-SOP

    • 第一章 概述
    • 第二章 环境准备
    • 第三章 安装部署规范
    • 第四章 ReplicaSet高可用配置
      • 4.1 拓扑选型与高可用级别
        • 常见拓扑结构
        • 高可用级别对比
      • 4.2 复制前置配置
        • 主节点参数(my.cnf)
        • 从节点参数(my.cnf)
      • 4.3 复制用户与权限配置
      • 4.4 建立复制链路
        • 基于 GTID 的自动定位
        • 首次全量数据同步
      • 4.5 半同步复制配置
        • 加载插件(如未启用)
        • 写入配置文件
      • 4.6 复制状态验证
        • 基础状态检查
        • GTID 一致性验证
        • 半同步状态验证
      • 4.7 故障切换预案
        • 手动切换步骤
        • 其他从库改指向新主库
        • 自动切换工具
    • 第五章 监控与日常维护
    • 第六章 故障处理手册
    • 第七章 安全与权限管理
    • 第八章 扩展与升级方案
    • 附录
  • 课程笔记

  • 专题系列
  • MySQL8-SOP
灯下哥谭
2024-01-09
目录

第四章 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+ 推荐使用
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
1
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;
1
2
3
4
5
6
7
8

注意:若使用 mysql_native_password(兼容旧客户端):

CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'StrongP@ssw0rd';
1

# 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;
1
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;
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
1
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;
1
2
3

从库:

INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
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
1
2
3
4
5
6
7
8

降级机制:当从库 ACK 超时(默认 10 秒),主库自动降级为异步复制,避免写入阻塞。

# 4.6 复制状态验证

# 基础状态检查

从库执行:

SHOW REPLICA STATUS\G
1

关键字段解读:

字段 正常值 异常排查
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 与主库一致
1
2
3
4
5
6
7

# 半同步状态验证

-- 主库查看半同步连接数
SHOW STATUS LIKE 'Rpl_semi_sync_master_clients';

-- 查看半同步状态
SHOW STATUS LIKE 'Rpl_semi_sync_master_status';
-- ON 表示半同步生效,OFF 表示已降级为异步
1
2
3
4
5
6

# 4.7 故障切换预案

当主库故障不可恢复时,需要手动将从库提升为新主库。切换前必须确认:

  1. 原主库确实无法恢复(避免脑裂)
  2. 候选从库的复制延迟可接受(通过 Seconds_Behind_Source 判断)
  3. 已通知相关业务方暂停写入

# 手动切换步骤

在从库执行:

-- 停止复制
STOP REPLICA;
RESET REPLICA ALL;

-- 取消只读
SET GLOBAL read_only = OFF;
SET GLOBAL super_read_only = OFF;

-- 记录当前位点(供其他从库使用)
SHOW MASTER STATUS;
1
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;
1
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"
  }
}
1
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
#高可用#MySQL#数据库
上次更新: 9/4/2026

← 第三章 安装部署规范 第五章 监控与日常维护→

最近更新
01
当监控说没事而 DMV 说有事——N9E 与 SQL Server 指标交叉验证实战 原创
08-28
02
TiKV 节点 CPU 周期性打满,进程却只占 4%:一次热点 Region 的逆向排查 原创
08-28
03
托管 SQL Server 的运维边界:哪些 DBA 手段会失效,以及用什么替代 原创
08-28
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式