Skip to content

MySQL 主从复制 ​

主从复制是商业系统里非常常见的数据库架构能力。它的目标不是让单个 SQL 更快,而是提升读能力、可用性和数据安全。

一句话理解:

主库负责写入并记录 binlog,从库拉取并重放 binlog,最终让从库数据追上主库。

为什么需要主从复制 ​

场景主从复制的作用
读多写少从库分担读查询
备份从库可用于备份,降低主库压力
高可用主库故障时可以切换从库
数据分析报表查询放从库,避免影响主库

但主从复制不等于强一致。默认情况下,从库可能落后主库。

复制流程 ​

mermaid
sequenceDiagram
    participant M as 主库
    participant B as binlog
    participant R as 从库 IO 线程
    participant L as relay log
    participant S as 从库 SQL 线程
    M->>B: 写入 binlog
    R->>M: 拉取 binlog
    R->>L: 写入 relay log
    S->>L: 读取 relay log
    S->>S: 重放 SQL 或行事件

核心组件:

组件作用
binlog主库记录数据变更
IO 线程从主库拉取 binlog
relay log从库本地中继日志
SQL 线程重放 relay log 中的事件

binlog 格式 ​

格式含义特点
Statement记录 SQL日志小,但某些函数和不确定 SQL 风险高
Row记录行变更更准确,日志可能更大
Mixed混合模式MySQL 根据场景选择

商业项目通常更推荐 Row,因为复制结果更确定,也方便基于 binlog 做数据同步。

主从延迟 ​

主从延迟是指从库还没重放到主库最新位置。

mermaid
flowchart TD
    A["主库提交事务"] --> B["binlog 写入"]
    B --> C["从库拉取"]
    C --> D["从库重放"]
    D --> E{"是否追上主库"}
    E -- "否" --> F["产生主从延迟"]
    E -- "是" --> G["数据基本一致"]

常见原因:

原因说明
主库写入太快从库重放速度跟不上
大事务一个事务很大,从库重放耗时长
从库机器弱CPU、IO、内存不足
从库有慢 SQL报表查询占用资源
网络问题binlog 拉取变慢

读写分离的坑 ​

用户刚下单,马上查订单:

mermaid
sequenceDiagram
    participant App as 应用
    participant M as 主库
    participant S as 从库
    App->>M: 写入订单
    M-->>App: 提交成功
    App->>S: 查询订单
    S-->>App: 查不到

原因:从库还没追上主库。

解决方案:

  1. 写后短时间读主库。
  2. 对强一致接口读主库。
  3. 根据主从延迟动态切换。
  4. 使用缓存或业务状态避免立即读从库。

GTID ​

GTID 是全局事务 ID,用于标识每个事务。它让复制定位和故障切换更方便。

传统复制要关注 binlog 文件名和位置:

text
mysql-bin.000010:123456

GTID 复制关注事务 ID 集合,更适合自动化运维。

商业场景 ​

订单系统常见策略:

请求推荐库
创建订单主库
支付回调更新状态主库
用户刚支付后查看结果主库或缓存
历史订单列表可读从库
后台报表独立从库或数仓

不要把所有读都打到从库。强一致读、写后读、支付结果查询等场景应谨慎。

排查主从延迟 ​

常用方向:

sql
show slave status\G
-- 新版本可能使用
show replica status\G

关注:

字段含义
Seconds_Behind_Master从库落后主库的估算秒数
Slave_IO_RunningIO 线程是否正常
Slave_SQL_RunningSQL 线程是否正常
Last_Error最近复制错误

面试标准回答 ​

text
MySQL 主从复制的核心是主库写 binlog,从库 IO 线程拉取 binlog 写入 relay log,从库 SQL 线程再重放 relay log。它可以用于读写分离、备份、高可用和报表隔离。binlog 常见格式有 Statement、Row、Mixed,商业项目通常更偏向 Row,因为复制结果更确定。主从复制默认是异步或半同步思路,所以可能存在主从延迟。写后立刻读从库可能查不到刚写入的数据,强一致读应该走主库或做读写路由控制。主从延迟常见原因包括大事务、主库写入高峰、从库资源不足、慢查询和网络问题。

关联学习:redo log 与 binlog、事务、优化相关。