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控制)。
相关推荐
lansye2 小时前
MySQL K8S日志分析与数据还原
mysql·k8s
lang201509282 小时前
MySQL 8.0原子性DDL全面解析
数据库·mysql
Ytadpole15 小时前
MySQL 数据库优化设计:优化原理和数据库表设计技巧
数据库·mysql·优化·索引·查询·检索·表设计
Boop_wu16 小时前
[MySQL] 基础操作
数据库·mysql
小糖学代码18 小时前
MySQL:14.mysql connect
android·数据库·mysql·adb
可观测性用观测云20 小时前
阿里云 RDS MySQL 可观测性最佳实践
mysql
白云偷星子20 小时前
MySQL笔记14
数据库·笔记·mysql
绵绵细雨中的乡音21 小时前
MySQL 常用函数实操指南:从基础到实战案例
数据库·mysql
凉栀お_1 天前
MySQL相关知识查询表中内容(第二次作业)
数据库·mysql
Java水解1 天前
【SQL】MySQL中空值处理COALESCE函数
后端·mysql