连载中 11/22

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

2026-05-07 · 10101 阅读 · 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)

热门推荐

连载中 16/22

连接池:HikariCP 参数与连接风暴

连接池不是越大越好:8 核机器配 1000 连接反而更慢的数学原理,HikariCP 四个必调参数,maxLifetime 与 wait_timeout 的隐形陷阱。

#MySQL#连接池#HikariCP#maxLifetime#连接风暴
2026-05-10 · 9872 阅读 · 0 评论 · 0 赞
连载中 4/16

缓存穿透:恶意 ID 打穿 MySQL 的四道防线

请求的数据在缓存和数据库里都不存在时,缓存形同虚设。聊聊参数校验、空值缓存、布隆过滤器、限流熔断四道防线的原理与组合打法。

#Redis#缓存穿透#布隆过滤器#高可用
2026-05-16 · 9293 阅读 · 21 评论 · 287 赞
连载中 5/22

索引失效:这些写法让索引悄悄下岗

索引明明建了,查询还是全表扫?盘点六大失效写法:函数运算、隐式类型转换、左模糊、or 混搭、not in 与隐式字符集,每一条都附补救写法。

#MySQL#索引失效#隐式类型转换#SQL优化#LIKE
2026-05-03 · 8931 阅读 · 0 评论 · 0 赞