mysql主从复制流程

mysql主从复制流程说明如下:
- 主库记录binlog:主库db的更新事件(update、insert、delete等)被写到binlog
- 从库连接主库:从库发起请求,连接到主库(一般是集群创建时会设定好主从关系,所以,流程2是独立的)
- 主库发送binlog:主库创建一个binlog dump thread,将binlog发送到从库
- 写入中继日志:从库会有一个IO thread 将收到的数据写入到中继日志 relay log中
- 执行中继日志:从库启动一个sql thread,将数据写到slave库中
复制模式介绍
同步复制
- 主库提交事务:主库执行完事务后,将binlog通过dump线程发送给所有从库。
- 等待从库确认:
- 主库需等待所有从库的I/O线程将binlog写入中继日志(relay log),并完成SQL线程的重放(即数据实际更新到从库磁盘)。
- 从库重放完成后,向主库发送ACK确认。
- 主库提交完成:主库收到所有从库的ACK后,才向客户端返回成功,确保数据强一致性。

- 注意: 多从库场景的性能影响:若有多个从库,主库需等待所有从库完成同步,可能导致延迟显著增加,因此需通过超时机制(如rpl_semi_sync_master_timeout参数)避免长时间阻塞。
异步复制
- 主库执行事务并记录Binlog:主库处理写操作后,将数据变更写入Binlog。
- 异步推送Binlog到从库:主库通过Binlog Dump线程将Binlog事件异步发送给从库,从库接收后写入Relay Log,无需等待SQL执行完成。
- 主库快速返回客户端:主库在Binlog写入本地磁盘后立即向客户端返回成功,不等待从库确认,降低延迟。
- 从库异步执行Relay Log:从库的SQL线程独立解析Relay Log并执行SQL,更新本地数据,执行结果不反馈主库。

- 注意:
- 若主库故障且未同步事务较多,可能导致数据丢失,需结合备份策略(如定期全量备份+Binlog归档)降低风险。
- 从库故障恢复后,需通过SHOW SLAVE STATUS检查Seconds_Behind_Master,确保延迟在可接受范围内。
半同步复制
- 主库执行事务后,将binlog写入本地并通知从库。
- 等待条件:仅需至少一个从库接收binlog并写入relay log(无需执行SQL),立即向主库发送ACK确认。
- 主库收到ACK后,提交事务并返回客户端成功,后续从库的SQL执行为异步。

增强半同步复制
- 主库执行事务时,先不提交,而是等待至少一个从库的I/O线程将binlog写入relay log并返回ACK确认。
- 仅当收到ACK后,主库才正式提交事务并返回客户端成功,确保数据已持久化到至少一个从库。
- 若超时未收到ACK,主库可配置为自动降级为异步复制或阻塞等待(需结合参数rpl_semi_sync_master_wait_no_slave控制)。
