【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.系统核心问题:

主从延迟

数据一致性

性能与可靠性的权衡

相关推荐
ly76892 小时前
PostgreSQL 备份恢复策略:pg_basebackup、WAL 归档与 PITR 在企业 Java 系统中的落地
java·数据库·postgresql·pitr·pg_basebackup·wal 归档
小羊没烦恼!2 小时前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp
注塑机数据采集联网2 小时前
如何解决注塑机数据采集联网对接MES系统数据WiFi传输数据不稳问题
大数据·数据库·物联网·数据挖掘·数据分析
黄俊懿2 小时前
【架构师从入门到进阶】第六章:服务集群优化——第八节:线程数公式
java·服务器·数据库·分布式·性能优化·架构·系统架构
geovindu3 小时前
sql: JSON and XML Data Handling in SQL using mysql 9.0
数据库·sql·mysql·数据库开发
hackchen3 小时前
LangChain 学习第 3 课 - 输出解析器(Output Parser)
数据库·学习·langchain
Mortalbreeze3 小时前
MySQL 基础篇(九):从 B+ 树到索引优化,全面理解 MySQL 索引
数据库·mysql
泡海椒3 小时前
JQuick-SQL SELECT 投影:字段、别名与表达式查询
数据库·sql
猫咪很可爱3 小时前
mysqldump 失败常见场景
数据库·sql·mysql
大明二代3 小时前
从零构建 Mastra RAG MVP:DeepSeek、SiliconFlow 与 PostgreSQL/pgvector 实战
javascript·数据库·人工智能