MySQL主从复制通过**二进制日志(Binary Log)**实现数据同步,其核心流程分为三阶段(:
核心挑战:异步复制模式下,主库提交事务后立即返回结果,从库延迟可能导致数据不一致。尤其在以下场景中风险显著:
DELETE
/ALTER TABLE
)ini# 主库配置
server-id=1
log-bin=mysql-bin
binlog-format=ROW # 避免函数依赖导致的不一致
sync-binlog=1 # 每次事务提交强制刷盘
# 从库配置
server-id=2
relay-log=mysql-relay
read-only=ON
注意事项:
server-id
必须唯一,否则复制失败();ROW
模式虽占用更多日志空间,但能精确还原行变更,推荐使用()。启用GTID实现自动位点管理:
sql-- 主从库均需配置
gtid_mode=ON
enforce_gtid_consistency=ON
-- 配置复制链路
CHANGE MASTER TO MASTER_AUTO_POSITION=1;
优势:
MASTER_LOG_FILE
和MASTER_LOG_POS
;原理:主库提交事务后需等待至少一个从库确认接收日志(写入中继日志)再返回成功。
配置步骤:
sql-- 主从库安装插件
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled=1;
-- 从库启用
SET GLOBAL rpl_semi_sync_slave_enabled=1;
效果:数据丢失风险从“可能丢失”降至“仅丢失未ACK的事务”,延迟增加约1个RTT(往返时间)。
适用场景:高并发写入场景下的延迟治理。
实现方式:
slave_parallel_workers
参数控制)。采用**两阶段提交(2PC)**机制确保redo log
与binlog
原子性:
redo log
并标记事务为准备状态;binlog
后,InnoDB提交事务并释放锁。binlog
与redo log
保证主从数据一致。sqlSHOW SLAVE STATUS\G
-- 关注Seconds_Behind_Master、Last_SQL_Error字段
SET GLOBAL sql_slave_skip_counter=1; START SLAVE;
(谨慎使用);mysqldump
导出并重新导入从库。auto_increment_offset
/auto_increment_increment
避免自增冲突。定期使用pt-table-checksum
工具检测主从差异:
bashpt-table-checksum h=master_host,u=admin,p=password
输出示例:
textDIFFS 1 -- 表示存在1处数据不一致
若发现差异,使用pt-table-sync
自动修复。
优化方案 | 数据一致性 | 性能影响 | 适用场景 |
---|---|---|---|
异步复制(默认) | 低 | 最优 | 对一致性容忍度高的读多写少场景 |
半同步复制 | 中高 | 中等 | 核心业务数据库(如订单系统) |
同步复制 | 高 | 较差 | 金融级数据可靠性要求场景 |
并行复制 | 依赖底层 | 提升吞吐 | 高并发写入场景 |
最终建议:
通过以上策略,可将主从延迟从秒级降至毫秒级,数据不一致概率降低99%以上,为高可用架构奠定基础。