MySQL主从复制的底层原理是什么

发布时间:2021-07-26 15:58:13 作者:Leah
来源:亿速云 阅读:161
# MySQL主从复制的底层原理是什么

## 一、主从复制概述

MySQL主从复制(Replication)是指将一个MySQL数据库服务器(主库/Master)的数据复制到一个或多个MySQL数据库服务器(从库/Slave)的过程。这种架构设计主要服务于以下场景:

1. **读写分离**:主库写,从库读
2. **数据备份**:实时热备份方案
3. **高可用基础**:故障转移的基础架构
4. **横向扩展**:分散查询压力

## 二、核心架构组件

### 1. 主库组件
- **Binary Log(二进制日志)**:
  记录所有修改数据的SQL语句(DDL和DML),以事件形式存储
- **Dump Thread(转储线程)**:
  主库上负责发送binlog到从库的专用线程

### 2. 从库组件
- **I/O Thread**:
  连接主库,请求新的binlog事件并写入relay log
- **SQL Thread**:
  读取relay log中的事件并执行
- **Relay Log(中继日志)**:
  存储从主库接收的binlog事件副本

## 三、复制工作原理详解

### 1. 二进制日志记录阶段
当主库执行事务时:
```sql
-- 示例事务
BEGIN;
UPDATE users SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET amount = amount + 100 WHERE id = 2;
COMMIT;

主库的存储引擎处理完成后: 1. 将事务写入binlog(默认ROW格式记录行变更) 2. 提交事务到存储引擎 3. 通过sync_binlog参数控制刷盘策略

2. 日志传输阶段

从库I/O线程的工作流程: 1. 向主库发送COM_BINLOG_DUMP命令 2. 主库dump线程读取binlog事件 3. 通过TCP连接发送到从库 4. 从库接收后写入relay log 5. 更新master.info文件记录复制位置

3. 事件重放阶段

SQL线程执行流程: 1. 读取relay log中的事件 2. 解析事件内容(区分不同格式的binlog) 3. 在从库上执行对应的SQL语句 4. 更新relay-log.info文件记录执行位置

四、复制格式类型

MySQL提供三种binlog格式:

格式类型 特点 适用场景
STATEMENT 记录原始SQL语句 日志量小,但不安全
ROW 记录行数据变化(默认) 数据安全,日志量大
MIXED 混合模式,智能切换 平衡安全性与性能

ROW格式示例

# UPDATE users SET name='张三' WHERE id=1
BINLOG '
...
### WHERE
###   @1=1 /* INT meta=0 nullable=0 is_null=0 */
###   @2='李四' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
### SET
###   @2='张三' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
...
'

五、关键参数解析

主库核心参数

server-id = 1                # 必须唯一
log_bin = mysql-bin         # 启用binlog
binlog_format = ROW         # 推荐ROW格式
sync_binlog = 1             # 事务提交同步刷盘
binlog_group_commit_sync_delay = 100  # 组提交优化

从库核心参数

server-id = 2               # 区别于主库
relay_log = mysql-relay     # 中继日志路径
log_slave_updates = ON      # 级联复制时需要
read_only = ON              # 确保从库只读
slave_parallel_workers = 4  # 并行复制线程数

六、复制拓扑演进

  1. 传统单线程复制

    • 所有SQL由单个线程顺序执行
    • 存在严重的复制延迟问题
  2. 基于组的并行复制(5.7+):

    graph LR
    Coordinator-->Worker1
    Coordinator-->Worker2
    Coordinator-->Worker3
    
    • 同一组的事务可以并行执行
    • 通过slave_parallel_type=LOGICAL_CLOCK启用
  3. 基于WRITESET的复制(8.0+):

    • 通过事务冲突检测实现更高效的并行
    • 配置参数:
      
      binlog_transaction_dependency_tracking = WRITESET
      transaction_write_set_extraction = XXHASH64
      

七、数据一致性保障

1. 半同步复制(Semisynchronous)

sequenceDiagram
    Master->>Slave: 发送事务事件
    Slave-->>Master: ACK确认
    Master->>Client: 返回成功

2. 复制校验(8.0.16+)

-- 主库生成校验和
SELECT * FROM performance_schema.replication_group_member_checksums;
-- 从库验证
SELECT * FROM performance_schema.replication_group_member_checksums;

八、常见问题解决方案

  1. 复制延迟

    • 优化方案:启用并行复制、升级硬件、减少大事务
  2. 数据不一致

    • 校验工具:pt-table-checksum + pt-table-sync
    • 自动修复:通过GTID自动跳过错误
  3. 故障切换: “`sql – 传统方式 STOP SLAVE; RESET SLAVE ALL; CHANGE MASTER TO…

– 使用GTID(推荐) SET GLOBAL gtid_purged=’’; CHANGE MASTER TO MASTER_AUTO_POSITION=1;


## 九、技术演进方向

1. **原子复制**(8.0+):
   - 保证DDL操作的原子性应用
   - 解决长期存在的复制中断问题

2. **Clone Plugin**:
   ```sql
   -- 从库快速重建
   INSTALL PLUGIN clone SONAME 'mysql_clone.so';
   CLONE INSTANCE FROM 'user'@'host':3306 IDENTIFIED BY 'password';
  1. InnoDB ReplicaSet(MySQL Shell):
    • 提供声明式的复制管理接口
    • 简化故障转移操作流程

通过深入理解MySQL复制机制,可以构建更健壮的数据库架构,为业务系统提供可靠的数据服务基础。 “`

推荐阅读:
  1. HashMap的底层原理是什么
  2. SPRINGIOC的底层原理是什么

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

mysql

上一篇:MySQL中怎么防止数据重复

下一篇:MySQL中不建议使用Delete删除数据的原因是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》