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控制)。
相关推荐
xrandzj14 小时前
MySQL8.0 从零通关核心操作手册(Ubuntu实战版)
数据库·mysql
我不会插花弄玉15 小时前
4.数据类型【由浅入深-MySQL】
数据库·mysql
好好学习的星熊17 小时前
SQL 面试题(数据分析师)
sql·mysql
破土士V17 小时前
MySQL基础知识集合
数据库·mysql
360智汇云19 小时前
MySQL-DTS数据同步工具:告别手动拼方案,迁移同步一站完成
数据库·mysql
宠友信息21 小时前
内容社区源码开发实践解析,用Spring Boot打造1:1仿小红书源码平台
java·spring boot·redis·websocket·mysql·spring·uni-app
λqaq71 天前
MySQL 数据库基础(2)约束、用户权限、远程连接、外键与 TCP/UDP 理解
linux·数据库·python·tcp/ip·mysql
叫我:松哥1 天前
基于flask图书数据管理系统,技术栈flask+MySQL+boostrap
python·mysql·flask
PHP实战开发录1 天前
企业微信客户标签同步冲突排查记录
mysql·系统安全·php·企业微信·开发
又是重名了1 天前
集团项目信创改造3 mysql to dm 插入获取主键
数据库·mysql·dameng