MySQL 复制拓扑配置详解
MySQL 复制这块,问题也有很多,配置多源复制时忘了启用 GTID,结果事务冲突一大堆;还有半同步模式下超时设置不对,性能直线下降……但是最后还是吧这个循环复制的拓扑做出来了,写下这篇笔记,以后好回顾。
目录
一、MySQL 复制概述
MySQL 复制是服务器间同步数据的功能,主服务器把变更记录到二进制日志,从服务器拉取并应用。日志格式有基于语句、基于行或混合三种。
基础点:主从是一对多关系,从服务器从主拉日志,记录状态以便重启恢复。中继从服务器可以当主,变更传播多级。
扩展原理:复制分层,主记录所有变更(数据+结构),从异步应用。复杂拓扑如双向(互为主从)、循环(环状传播)、多源(一从多主)。
二、复制冲突分析
多主拓扑易冲突,如两客户端同时改同一行,最终值取决于事件顺序。
基础点:分层复制中,中间主改行会导从值不一致;循环中,顺序不同值乱套。
例子:产品价520美元,A操作涨20%(到624),B操作降50美元(到470)。同时发生,主A最终574,主B564,冲突!
实际运用:避免冲突,用单主写,多从读。项目中,我加应用层锁,确保写单点。
经验:我踩坑是双向拓扑没测冲突,数据乱了。现在总先模拟场景测试。
三、何时使用复制
复制用于横向扩展、BI分析、地理分布、高可用。
基础点:扩展读负载(写主,读从均衡);BI从跑报表,不锁主;地理数据本地存,汇总复制总部;高可用冗余、升级切换。
实际运用:电商项目,用从跑分析,避免主卡顿。地理场景,北京从存本地用户,汇总到总部。
扩展:用 BLACKHOLE 引擎在中继从丢弃不需数据,但日志继续传。原理:引擎接受DML但不存,节省空间。
表格复制用例:
| 用例 | 特点 | 优势 |
|---|---|---|
| 横向扩展 | 写主读从,负载均衡 | 无冲突,高吞吐 |
| BI分析 | 从优索引/引擎 | 不干扰生产 |
| 地理分布 | 本地数据+汇总 | 低延迟,数据整合 |
| 高可用 | 冗余/滚动升级 | 零停机维护 |
四、配置复制步骤
-
画拓扑图,标主从。2. 每服务器设唯一server-id(默认1,0禁用)。3. 主启用TCP、二进制日志,创复制用户。4. 备份主作为起点。5. 从恢复备份,用CHANGE MASTER TO连主。6. START SLAVE启动。
代码示例主配置:
CREATE USER 'repl'@'slave_host' IDENTIFIED BY 'pass';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'slave_host';
从配置:
CHANGE MASTER TO
MASTER_HOST='master_host',
MASTER_PORT=3306,
MASTER_USER='repl',
MASTER_PASSWORD='pass',
MASTER_LOG_FILE='binlog_file',
MASTER_LOG_POS=pos;
START SLAVE;
实际运用:项目中,用mysqldump --master-data备份,自动记坐标。查SHOW MASTER STATUS得日志位。
经验:备份后锁主(FLUSH TABLES WITH READ LOCK;)防变更。
五、GTID 与复制过滤
GTID 唯一标事务,格式 source-uuid:transaction-id。启用gtid-mode=ON、enforce-gtid-consistency、log-slave-updates。
基础点:server_uuid存auto.cnf,事务记gtid_executed。复制用MASTER_AUTO_POSITION=1,无需日志位。
过滤:binlog-*主写日志时滤,replicate-*从读中继日志时滤。基于DB/表,优先DB>表,do>ignore。
代码启用GTID:
SET GLOBAL gtid_mode = ON;
实际运用:多环境滤表,如Web从不复制支付表,用replicate-ignore-table。
六、异步、半同步与多源复制
异步:从滞后,主不等。半同步:插件rpl_semi_sync_master/slave,主等至少一从确认,超时异步。
基础点:半同步确保完整,但性能降(等路由+记录+确认)。适用于本地快网。
多源:一从多主,用通道。需表存储库(master-info-repository=TABLE)。
代码多源:
CHANGE MASTER TO MASTER_HOST='master1', ... FOR CHANNEL 'ch1';
START SLAVE FOR CHANNEL 'ch1';
实际运用:备份多主到一从,整合数据。项目中,用通道隔离,避免冲突。
七、二进制日志详解
二进制日志记变更+时间戳,用于恢复/复制。轮转:重启、达max_binlog_size、FLUSH LOGS。
基础点:格式行(默认,记行变)、语句(记SQL,小文件)、混合(语句+不确定时行)。
代码改格式:
SET GLOBAL binlog_format = 'ROW';
中继日志:从存主事件。从状态日志:表/文件存连接/坐标。
故障安全:sync-binlog=1最安全,用表存状态。
Tips:常见踩坑与优化经验
-
冲突坑:多主别同时写同一行,用应用锁或单写点。
-
GTID坑:备份恢复后查gtid_purged,确保从不重复事务。
-
性能优化:半同步本地用,异步跨地域。过滤减带宽。
-
日志管理:设max_binlog_size防盘满,用TABLE存状态防崩溃丢位。
-
经验:我学时异步从滞后读旧数据,现在加读主确认。测试拓扑先小规模练。
总结
通过这篇笔记,从复制概述、冲突到配置、多源,全盘搞懂 MySQL 复制拓扑。这些基础在项目中超实用,比如用半同步保数据,用多源整合备份。作为学生,我觉得多搭环境实践是关键,下次试试循环拓扑加过滤。欢迎评论,一起进步!
更多推荐




所有评论(0)