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控制)。
相关推荐
什么半岛铁盒27 分钟前
C++项目:仿muduo库高并发服务器------EventLoop模块的设计
linux·服务器·c++·mysql·ubuntu
leo_yu_yty1 小时前
Mysql DBA学习笔记(MVCC)
学习·mysql·dba
饿了我会自己捡代码吃2 小时前
【MySQL】使用C/C++链接mysql数据库
c语言·数据库·mysql
不是三毛没有半2 小时前
Mysql 简单的语句回顾
数据库·mysql·oracle
abcefg_h3 小时前
MySQL查询详细介绍
数据库·mysql
XueminXu4 小时前
Flink-SQL通过过滤-解析-去重-聚合计算写入到MySQL表
mysql·flink·kafka·topic·flink sql·flink-sql·sink
计算机学姐7 小时前
基于微信小程序的扶贫助农系统【2026最新】
java·vue.js·spring boot·mysql·微信小程序·小程序·mybatis
程序新视界7 小时前
MySQL的两种分页方式:Offset/Limit分页和游标分页
后端·sql·mysql
周杰伦的稻香8 小时前
MySQL中的空间碎片率计算分析
android·数据库·mysql
yuyue_99911 小时前
理解 mvcc
mysql