mysql之主从复制

mysql主从复制流程

mysql主从复制流程说明如下:

  1. 主库记录binlog:主库db的更新事件(update、insert、delete等)被写到binlog
  2. 从库连接主库:从库发起请求,连接到主库(一般是集群创建时会设定好主从关系,所以,流程2是独立的)
  3. 主库发送binlog:主库创建一个binlog dump thread,将binlog发送到从库
  4. 写入中继日志:从库会有一个IO thread 将收到的数据写入到中继日志 relay log中
  5. 执行中继日志:从库启动一个sql thread,将数据写到slave库中

复制模式介绍

同步复制

  1. 主库提交事务:主库执行完事务后,将binlog通过dump线程发送给所有从库。
  2. 等待从库确认:
    • 主库需等待所有从库的I/O线程将binlog写入中继日志(relay log),并完成SQL线程的重放(即数据实际更新到从库磁盘)。
    • 从库重放完成后,向主库发送ACK确认。
  3. 主库提交完成:主库收到所有从库的ACK后,才向客户端返回成功,确保数据强一致性。
  • 注意: 多从库场景的性能影响:若有多个从库,主库需等待所有从库完成同步,可能导致延迟显著增加,因此需通过超时机制(如rpl_semi_sync_master_timeout参数)避免长时间阻塞。

异步复制

  1. 主库执行事务并记录Binlog:主库处理写操作后,将数据变更写入Binlog。
  2. 异步推送Binlog到从库:主库通过Binlog Dump线程将Binlog事件异步发送给从库,从库接收后写入Relay Log,无需等待SQL执行完成。
  3. 主库快速返回客户端:主库在Binlog写入本地磁盘后立即向客户端返回成功,不等待从库确认,降低延迟。
  4. 从库异步执行Relay Log:从库的SQL线程独立解析Relay Log并执行SQL,更新本地数据,执行结果不反馈主库。
  • 注意:
    1. 若主库故障且未同步事务较多,可能导致数据丢失,需结合备份策略(如定期全量备份+Binlog归档)降低风险。
    2. 从库故障恢复后,需通过SHOW SLAVE STATUS检查Seconds_Behind_Master,确保延迟在可接受范围内。

半同步复制

  1. 主库执行事务后,将binlog写入本地并通知从库。
  2. 等待条件:仅需至少一个从库接收binlog并写入relay log(无需执行SQL),立即向主库发送ACK确认。
  3. 主库收到ACK后,提交事务并返回客户端成功,后续从库的SQL执行为异步。

增强半同步复制

  1. 主库执行事务时,先不提交,而是等待至少一个从库的I/O线程将binlog写入relay log并返回ACK确认。
  2. 仅当收到ACK后,主库才正式提交事务并返回客户端成功,确保数据已持久化到至少一个从库。
  3. 若超时未收到ACK,主库可配置为自动降级为异步复制或阻塞等待(需结合参数rpl_semi_sync_master_wait_no_slave控制)。
相关推荐
五岁小孩吖1 小时前
Mysql 如何使用 binlog 日志回滚操作失误的数据
mysql
Runing_WoNiu2 小时前
最佳左前缀法则(Optimal Left-Prefix Rule)
数据库·mysql
五月茶8 小时前
MySQL——黑马
数据库·mysql
一号IT男8 小时前
MySql MVCC的原理总结
数据库·mysql
荔枝吻9 小时前
【沉浸式解决问题】mysql-connector-python连接数据库:RuntimeError: Failed raising error.
数据库·python·mysql
一号IT男9 小时前
MySQL聚簇索引与非聚簇索引详解
数据库·mysql
苹果醋39 小时前
react_05create-react-app脚手架详细解析(export)
java·运维·spring boot·mysql·nginx
就叫飞六吧10 小时前
mysql全屏终端全量、部分备份、恢复脚本
android·mysql·adb
fenglllle1 天前
项目中MySQL遇到的索引失效的问题
数据库·mysql