【MySQL】主从复制原理详解:从 Binlog 到数据一致性

📌 目录

  1. 什么是 MySQL 主从复制

  2. 主从复制的应用场景

  3. 二进制日志 Binlog 详解

  4. MySQL 主从复制流程

  5. 异步复制的问题与优化

  6. Redo Log 与 Binlog 的关系

  7. 数据一致性核心机制

  8. 主从复制配置与备份


一、什么是 MySQL 主从复制

MySQL 主从复制是一种 基于日志的异步复制机制,用于将主库的数据同步到从库。

其核心依赖两种日志:

  • Binlog(二进制日志,主库)

  • Relay Log(中继日志,从库)

支持三种复制模式:

模式 说明
Statement 基于 SQL 语句复制
Row 基于行数据复制
Mixed 自动切换

二、主从复制的应用场景

在实际项目中,主从复制主要用于:

读写分离(最常见)

负载均衡

数据备份(注意:复制不等于备份)

高可用架构(主从切换)

数据库升级迁移


三、二进制日志 Binlog

1. 什么是 Binlog

Binlog 用于记录所有 修改数据的操作

  • INSERT

  • UPDATE

  • DELETE

注意:

SELECT 查询不会记录


2. Binlog 的作用

数据复制的基础

数据恢复(配合备份使用)


3. Binlog 三种格式

格式 原理 优点 缺点
STATEMENT 记录 SQL 日志小 性能高 可能不一致
ROW 记录数据变化 精确可靠 日志大
MIXED 自动切换 折中方案 逻辑复杂

Tips

生产环境一般建议使用:

复制代码
binlog_format = ROW

原因是数据一致性更可靠


四、MySQL 主从复制流程

1. 五步流程

1 主库写入 Binlog

2 从库 IO 线程请求日志

3 主库 Dump 线程发送日志

4 从库写入 Relay Log

5 从库 SQL 线程执行


2. 流程图理解

主库写 Binlog

通过网络发送

从库写入 Relay Log

再执行恢复数据


3. 核心线程

线程 作用
IO Thread 拉取主库日志
SQL Thread 执行日志

五、异步复制的问题与优化

1. 异步复制问题

主库提交成功

但从库还没同步

可能导致:

主从数据不一致

主库宕机导致数据丢失


2. 主从延迟问题

原因:

主库并发写入

从库单线程执行

解决方案:

复制代码
slave_parallel_workers = 4

开启并行复制


3. 半同步复制

为了解决数据丢失问题:

主库提交事务时

至少一个从库确认接收

优点:

降低数据丢失风险

缺点:

性能略有下降


六、Redo Log 与 Binlog 的关系

这是 MySQL 面试高频重点

1. 两种日志的区别

日志 层级 作用
Redo Log 存储引擎层 保证崩溃恢复
Binlog Server 层 用于复制

2. 执行流程

复制代码
1 写 Redo Log(prepare)
2 写 Binlog
3 提交事务

七、数据一致性核心机制

1. 为什么需要一致性

如果:

Redo Log 写了

Binlog 没写

会导致:

主从数据不一致


2. 两阶段提交

MySQL 使用两阶段提交保证一致性:

阶段 操作
Prepare 写 Redo Log
Commit 写 Binlog

只有 Binlog 写成功

事务才算成功


3. 安全配置建议

复制代码
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1

说明:

每次提交都刷盘

保证数据最安全


Tips

这两个参数:

安全性最高

但性能会下降


八、主从复制配置与备份

1. 常见备份工具

工具 类型 优点 缺点
mysqldump 逻辑备份 灵活
XtraBackup 物理备份 快 支持热备 依赖工具

2. 表级复制配置

复制代码
replicate-do-table=db_name.table_name

Tips

推荐:

全库复制 + 读写分离


九、总结

MySQL 主从复制核心可以总结为三点:

1.数据同步流程:

主库写 Binlog

从库拉日志

从库执行日志

2.数据一致性核心:

Redo Log + Binlog

两阶段提交

3.系统核心问题:

主从延迟

数据一致性

性能与可靠性的权衡

相关推荐
Flying pigs~~1 天前
RAG智慧问答项目
数据库·人工智能·缓存·微调·知识库·rag
misL NITL1 天前
mysql之如何获知版本
数据库·mysql
许彰午1 天前
CacheSQL(二):主从复制——OpLog 环形缓冲区与故障自动恢复
java·数据库·缓存
2401_832365521 天前
JavaScript中rest参数(...args)取代arguments的优势
jvm·数据库·python
2301_779622411 天前
Go语言怎么用信号量控制并发_Go语言semaphore信号量教程【入门】
jvm·数据库·python
2301_766283441 天前
c++如何将控制台输出保存到文件_cout重定向到txt【详解】
jvm·数据库·python
北极的冰箱1 天前
MySQL Ver 8.0.41 for macos14.7密码遗忘
数据库·mysql
XDH_CS1 天前
MySQL 8.0 安装与 MySQL Workbench 使用全流程(超详细教程)
开发语言·数据库·mysql
秋91 天前
MySQL 8.0.46 全平台安装与配置详解(Windows/Linux/macOS)
linux·windows·mysql
treacle田1 天前
达梦数据库-统计信息收集-记录
数据库·达梦数据库统计信息收集