连载中 11/22

主从搭建实操:从零配出一主两从

2026-05-07 · 10091 阅读 · 0 评论 · 0 赞

动真格:给订单库配从库

原理铺垫了十篇,这回动真格——老王的订单库要做读写分离,第一步先搭一主两从。环境约定:主库 192.168.2.101,从库 A 192.168.2.102,从库 B 192.168.2.103,MySQL 8.0,GTID 全程护航。每一步都能照抄,最后附一份翻车排查清单。

第一步:主库配置

# 主库 my.cnf
[mysqld]
server_id = 101                  # 集群内唯一,绝不能重复
log_bin = mysql-bin              # 开 binlog(第 10 篇的主角)
binlog_format = ROW              # 行格式,主从一致性的基石
gtid_mode = ON                   # GTID 开启
enforce_gtid_consistency = ON    # 拒绝破坏 GTID 一致性的写法

GTID(全局事务标识)= 实例标识 + 事务序号,开启后每个事务有了全球唯一身份证,从库不用再记「复制到主库哪个文件哪个位点」,缺什么补什么,换主切换也省心。

第二步:主库建复制账号

CREATE USER "repl"@"192.168.2.%" IDENTIFIED WITH caching_sha2_password BY "Repl@2026";
GRANT REPLICATION SLAVE ON *.* TO "repl"@"192.168.2.%";

权限只给 REPLICATION SLAVE,网段限定内网——复制账号是链路命脉,最小权限 + 最小可达。caching_sha2_password 是 8.0 默认认证方式,非 SSL 连接需要在后面配置里带上 GET_SOURCE_PUBLIC_KEY。

第三步:从库配置

# 从库 A my.cnf(从库 B 把 server_id 改成 103)
[mysqld]
server_id = 102
relay_log = relay-bin            # 中继日志前缀
read_only = ON                   # 普通账号只读
super_read_only = ON             # 连有 SUPER 权限的也只读(除复制线程)

两层 read_only 都打开——从库的只读不靠自觉,靠配置。复制线程拥有豁免权,正常回放不受影响。

第四步:初始数据对齐

# 主库导出(--source-data=2 会把备份时的位点写进文件,仅作注释留档)
mysqldump -h 192.168.2.101 --single-transaction --source-data=2 --triggers --routines --all-databases > full.sql

# 从库导入
mysql -h 192.168.2.102 < full.sql

--single-transaction 用一致性快照导 InnoDB,不锁全表(原理第 21 篇讲)。传统方案要精确对齐 binlog 位点,GTID 模式下省了这一步:START REPLICA 后从库自动比对 GTID 集合,缺哪个事务补哪个。

第五步:启动复制

CHANGE REPLICATION SOURCE TO
  SOURCE_HOST = "192.168.2.101",
  SOURCE_PORT = 3306,
  SOURCE_USER = "repl",
  SOURCE_PASSWORD = "Repl@2026",
  SOURCE_AUTO_POSITION = 1,     -- GTID 自动定位
  GET_SOURCE_PUBLIC_KEY = 1;    -- 配合 caching_sha2_password
START REPLICA;
SHOW REPLICA STATUS;            -- 关注两行 Running 是否都是 Yes

8.0.22 起 CHANGE MASTER TO 更名为 CHANGE REPLICATION SOURCE TO,SHOW SLAVE STATUS 改叫 SHOW REPLICA STATUS,旧语法仍兼容——看到老文章用旧词别慌,一个意思。

第六步:验收

SHOW REPLICA STATUS 的输出几十行,日常盯这几个字段:

字段健康值异常排查方向
Replica_IO_RunningYesNo 则看 Last_IO_Error:网络、防火墙、账号密码、server_id 重复
Replica_SQL_RunningYesNo 则看 Last_SQL_Error:从库数据冲突、GTID 缺口、表结构不一致
Seconds_Behind_Source0持续大于 0 就是延迟,治理方案第 12 篇专讲
Retrieved / Executed_Gtid_Set两边一致差距大说明回放跟不上拉取

最后做端到端验证:主库插一条测试数据,两个从库立刻能查到;再从业务账号试着往从库写,应被 read_only 拒绝——链路和防护双确认。

翻车排查清单

  • server_id 重复:IO 线程连上就断,主库错误日志写明 duplicate server id;
  • 3306 没放行:IO_Running = Connecting,telnet 通了再谈复制;
  • 先 START 后导数据:GTID 缺口导致 SQL 线程报错,重新对齐初始数据(RESET REPLICA 后重来);
  • 从库被误写:super_read_only 忘了开,数据冲突后复制中断;
  • 主键冲突 1062:多数是有人绕过复制直接改了从库——从库纪律问题。

一主两从跑起来了,但「跑起来」和「跑得好」之间隔着一个字:延迟。主从延迟从哪来、并行复制和半同步怎么救,下一篇拆解。

咖啡凉了,记得趁热喝。

503

10 年全栈工程师 · 503咖啡馆主理人

#MySQL#主从复制#GTID#主从搭建#高可用

评论 (0)

相关推荐

连载中 12/20

排查四件套:jstack、jmap、jstat、jcmd 的实战分工

jstack 看线程在干什么,jmap 看堆里装了什么,jstat 看运行时在变什么,jcmd 是统一入口。四把刀各管一段,配合着用没有查不动的现场。

#jstack#jmap#jstat#jcmd#排查工具
2026-09-16 · 3 阅读 · 0 评论 · 0 赞
连载中 11/20

GC 日志:把回收过程翻译成人话

一行 GC 日志里塞着七种信息:谁触发的、收了哪、停了多久、活了哪些。加上 -Xlog 配置,再加上日志分析工具,GC 不再是只能盯监控曲线的黑盒。

#GC日志#Xlog#日志分析#GC监控#Full GC排查
2026-09-16 · 13 阅读 · 0 评论 · 0 赞
连载中 10/20

ZGC:亚毫秒停顿是怎么炼成的

百 G 大堆停顿不到一毫秒,靠的是把搬家全部挪到并发阶段——着色指针让引用自带状态,读屏障让搬运中的对象依然可访问。代价是吞吐与内存,收益是停顿与堆大小解耦。

#ZGC#着色指针#读屏障#亚毫秒停顿#分代ZGC
2026-09-15 · 8 阅读 · 0 评论 · 0 赞