MySQL 复制这块,问题也有很多,配置多源复制时忘了启用 GTID,结果事务冲突一大堆;还有半同步模式下超时设置不对,性能直线下降……但是最后还是吧这个循环复制的拓扑做出来了,写下这篇笔记,以后好回顾。

目录

一、MySQL 复制概述

MySQL 复制是服务器间同步数据的功能,主服务器把变更记录到二进制日志,从服务器拉取并应用。日志格式有基于语句、基于行或混合三种。

基础点:主从是一对多关系,从服务器从主拉日志,记录状态以便重启恢复。中继从服务器可以当主,变更传播多级。

扩展原理:复制分层,主记录所有变更(数据+结构),从异步应用。复杂拓扑如双向(互为主从)、循环(环状传播)、多源(一从多主)。

二、复制冲突分析

多主拓扑易冲突,如两客户端同时改同一行,最终值取决于事件顺序。

基础点:分层复制中,中间主改行会导从值不一致;循环中,顺序不同值乱套。

例子:产品价520美元,A操作涨20%(到624),B操作降50美元(到470)。同时发生,主A最终574,主B564,冲突!

实际运用:避免冲突,用单主写,多从读。项目中,我加应用层锁,确保写单点。

经验:我踩坑是双向拓扑没测冲突,数据乱了。现在总先模拟场景测试。

三、何时使用复制

复制用于横向扩展、BI分析、地理分布、高可用。

基础点:扩展读负载(写主,读从均衡);BI从跑报表,不锁主;地理数据本地存,汇总复制总部;高可用冗余、升级切换。

实际运用:电商项目,用从跑分析,避免主卡顿。地理场景,北京从存本地用户,汇总到总部。

扩展:用 BLACKHOLE 引擎在中继从丢弃不需数据,但日志继续传。原理:引擎接受DML但不存,节省空间。

表格复制用例:

用例 特点 优势
横向扩展 写主读从,负载均衡 无冲突,高吞吐
BI分析 从优索引/引擎 不干扰生产
地理分布 本地数据+汇总 低延迟,数据整合
高可用 冗余/滚动升级 零停机维护

四、配置复制步骤

  1. 画拓扑图,标主从。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 复制拓扑。这些基础在项目中超实用,比如用半同步保数据,用多源整合备份。作为学生,我觉得多搭环境实践是关键,下次试试循环拓扑加过滤。欢迎评论,一起进步!

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐