
数据库高可用基石MySQL主从同步机制是如何实现的前言一、什么是主从同步二、主从同步的核心架构三大线程三、主从同步的核心流程分步详解步骤 1Master 记录变更到 Binlog步骤 2Slave 连接 Master 并请求 Binlog步骤 3Master 启动 Binlog Dump 线程推送步骤 4Slave 写入 Relay Log步骤 5Slave 回放 Relay Log四、三种主从同步模式面试重点1. 异步复制默认2. 半同步复制推荐3. 全同步复制五、主从延迟问题及解决方案为什么会延迟如何监控延迟解决方案六、手动搭建主从同步简要步骤1. Master 配置my.cnf2. Slave 配置3. Master 创建复制账号4. Slave 配置主库信息5. 启动同步七、常见面试题Q1主从同步是同步还是异步Q2主库宕机后如何提升从库为主库Q3Binlog 有哪三种格式怎么选总结The Begin点点关注收藏不迷路⬇ ⬇ 底部 ⬇ ⬇前言在互联网后端开发中数据库的高可用、读写分离、数据备份是绕不开的话题。而这一切的核心就是MySQL 主从同步机制。面试官经常问主从同步的原理是什么数据是怎么从 Master 复制到 Slave 的主从延迟怎么来的如何解决今天这篇文章我们从架构图 → 核心原理 → 三种复制方式 → 主从延迟 → 实践配置完整讲透 MySQL 主从同步。一、什么是主从同步主从同步是指一个 MySQL 服务器Master将数据变更实时或准实时地复制到一个或多个 MySQL 服务器Slave上。画个简图写操作 │ ▼ ┌──────────────┐ │ Master │ │ (主库) │ └──────┬───────┘ │ 异步/半同步复制 ▼ ┌──────────────┐ │ Slave │ │ (从库) │ └──────────────┘ │ ▼ 读操作典型应用场景读写分离主库写从库读提升并发数据备份从库做备份不锁主库高可用主库宕机从库快速切换数据汇总多个从库做统计分析二、主从同步的核心架构三大线程MySQL 主从同步依赖三个核心线程线程位置职责Binlog Dump 线程Master推送 binary log 给 SlaveI/O 线程Slave接收 binlog 并写入 relay logSQL 线程Slave从 relay log 读取并回放 SQL完整流程图Master Slave ---------- ------------------- | 事务提交 | | | ----┬----- | I/O 线程 | │ | │ | ▼ │ ▼ | ---------- binlog 事件 ---------- ---------- | | Binlog │ ◄───────────────── │ I/O │ │ Relay │ | | │ (网络推送) │ 线程 │──│ Log │ | ---------- ---------- ---------- | │ │ │ │ ▼ │ │ ---------- │ │ │ SQL 线程 │ │ │ └────┬─────┘ │ │ │ │ │ ▼ │ │ 从库数据 │ -------------------三、主从同步的核心流程分步详解步骤 1Master 记录变更到 Binlog当 Master 执行UPDATE/INSERT/DELETE等写操作时会将变更事件写入二进制日志Binary Log。-- 查看是否开启 binlogSHOWVARIABLESLIKElog_bin;Binlog 有多种格式STATEMENT记录 SQL 语句节省空间但可能主从不一致ROW记录每一行的变更精确但日志量大MIXED混合模式默认 STATEMENT某些情况下自动切 ROW步骤 2Slave 连接 Master 并请求 BinlogSlave 的I/O 线程连接 Master发送COM_BINLOG_DUMP命令告诉 Master“从某个位置开始给我推送 binlog”。步骤 3Master 启动 Binlog Dump 线程推送Master 的Binlog Dump 线程读取 binlog 事件推送给 Slave 的 I/O 线程。步骤 4Slave 写入 Relay LogSlave 的 I/O 线程收到数据后先写入本地的中继日志Relay Log。步骤 5Slave 回放 Relay LogSlave 的SQL 线程读取 relay log解析成 SQL 并在从库上执行实现数据同步。四、三种主从同步模式面试重点1. 异步复制默认Master 提交事务 → 写 binlog → 返回客户端成功 │ └── 事后推送给 Slave不等待优点主库性能最高缺点主库宕机时未推送的 binlog 会丢失2. 半同步复制推荐需要安装semisync插件INSTALL PLUGIN rpl_semi_sync_masterSONAMEsemisync_master.so;INSTALL PLUGIN rpl_semi_sync_slaveSONAMEsemisync_slave.so;流程Master 提交事务 → 写 binlog → 等待至少 1 个 Slave 确认收到 → 返回客户端成功优点不丢数据至少一个从库有缺点主库性能稍降有一个网络 RTT 延迟3. 全同步复制等待所有 Slave都确认收到才返回。优点最安全缺点性能最差几乎不用对比表模式数据安全性主库性能适用场景异步低可能丢数据高非核心业务可容忍少量丢失半同步高中生产环境推荐全同步最高低银行/金融核心交易五、主从延迟问题及解决方案为什么会延迟原因说明从库硬件差CPU/IO 比主库差主库写压力大binlog 产生太快SQL 线程回放不过来大事务一次DELETE几百万行relay log 回放慢从库有查询复杂的SELECT占用资源并行复制未开启默认是单线程回放如何监控延迟-- 在从库执行SHOWSLAVESTATUS\G-- 关键字段Seconds_Behind_Master:0-- 延迟秒数0 表示无延迟解决方案方案说明升级从库硬件保证从库配置不低于主库开启并行复制MySQL 5.7 支持多线程回放避免大事务分批次DELETE/UPDATE读写分离时从库不参与复杂统计用单独分析库使用半同步复制减少主从差距开启并行复制MySQL 5.7-- 从库配置SETGLOBALslave_parallel_typeLOGICAL_CLOCK;SETGLOBALslave_parallel_workers4;六、手动搭建主从同步简要步骤1. Master 配置my.cnf[mysqld] server-id 1 log_bin /var/log/mysql/mysql-bin.log binlog_format ROW2. Slave 配置[mysqld] server-id 2 relay_log /var/log/mysql/relay-bin.log read_only 1 -- 从库只读3. Master 创建复制账号CREATEUSERrepl%IDENTIFIEDBYpassword;GRANTREPLICATIONSLAVEON*.*TOrepl%;FLUSHPRIVILEGES;SHOWMASTERSTATUS;-- 记录 File 和 Position4. Slave 配置主库信息CHANGE MASTERTOMASTER_HOSTmaster_ip,MASTER_USERrepl,MASTER_PASSWORDpassword,MASTER_LOG_FILEmysql-bin.000001,MASTER_LOG_POS12345;5. 启动同步STARTSLAVE;SHOWSLAVESTATUS\G看到Slave_IO_Running: Yes和Slave_SQL_Running: Yes就成功了。七、常见面试题Q1主从同步是同步还是异步默认是异步。生产环境推荐半同步既保证性能又减少数据丢失风险。Q2主库宕机后如何提升从库为主库停止从库同步STOP SLAVE;清除复制信息RESET SLAVE ALL;修改应用程序数据源指向新主库其他从库重新指向新主库Q3Binlog 有哪三种格式怎么选格式优点缺点STATEMENT日志小非确定性函数如 NOW()可能不一致ROW最精确日志大批量操作日志膨胀MIXED兼顾兼容性好生产推荐ROW格式 半同步复制。总结MySQL 主从同步的核心可以浓缩为Master 写 binlog → Slave I/O 线程拉取 → 写入 relay log → SQL 线程回放关键点内容三大线程Binlog Dump主、I/O 线程从、SQL 线程从两大日志Binary Log、Relay Log三种模式异步、半同步、全同步常见问题主从延迟、数据丢失最佳实践半同步 ROW 格式 并行复制 从库只读掌握了这些你不仅能搞定面试还能在生产环境设计出高可用的数据库架构。The End点点关注收藏不迷路⬆ ⬆ 顶部 ⬆ ⬆