从库配置要点
从库需要自己的身份与约束:唯一的 server_id(与主库以及其它从库都不同)、独立的 relay log 路径、是否把重放的事件再写进自己的 binlog(级联复制或链路切换时需要),以及只读保护。read_only 能挡住普通账号写入,但持有 SUPER 权限的账号仍然可写,所以生产上还要一起打开 super_read_only。这几项都属于一次配好、长期受益的参数,新建实例时补齐比事后补救省事得多。
基本信息
| server_id | 同一拓扑内必须唯一,重复会让复制关系错乱 |
|---|---|
| relay_log | 中继日志路径,建议放在独立磁盘目录 |
| log_replica_updates | 从库重放也写自身 binlog,级联复制需要 |
| read_only | 普通账号不可写,但不限制高权限账号 |
| super_read_only | 连管理员账号也禁写,应急写入需先关闭 |
典型使用场景
- 新建从库时补齐身份与只读参数
- 搭建级联复制,让从库同时充当别人的源
- 规划切换目标,提前打开 binlog 写入
- 防止运维误操作把从库写坏,造成主从分叉
- 排查从库上出现的本地写入事务
从库 my.cnf
从库 my.cnf
[mysqld]
server_id = 1002
relay_log = /var/lib/mysql/relaylog/relay-bin
read_only = ON
super_read_only = ON
# 级联复制(该从库还要当别人的源)需要:
log_replica_updates = ON
log_bin = /var/lib/mysql/mysql-bin
# 独立 relay 目录需提前创建并授权给 mysql 用户配置项与注意
| 配置项 | 作用 | 注意事项 |
|---|---|---|
| server_id | 拓扑内的唯一身份 | 重复会导致复制关系显示混乱 |
| relay_log | 中继日志路径 | 与数据目录同盘会争抢 IO |
| log_replica_updates | 重放事件也写入自身 binlog | 级联复制与链路切换必需 |
| read_only | 挡普通账号写入 | 不限制持有 SUPER 的账号 |
| super_read_only | 连管理员账号也禁写 | 计划内切换前必须先关掉 |
只开 read_only 不开 super_read_only 时,运维用高权限账号仍能把从库写坏,主从立刻分叉。两个参数一起开,才称得上真正只读。
把从库提升为可写之前,一定要先关掉 super_read_only,否则应用写入会一直失败,而报错信息看上去像是在说权限不足,容易误导排查方向。
relay log 与数据目录放在同一块盘上时,重放高峰期的 IO 会互相挤占,主从延迟被明显放大;条件允许时把中继日志单独放到另一块盘。