MySQL 数据库主从复制架构
前文《MySQL 数据库事务与复制》分析了 MySQL 复制过程中如何保证 binlog 和事务数据之间的一致性,本文进一步分析引入从库后需要保证主从的数据一致性需要考虑哪些方面。
原生复制架构

MySQL 的原生复制架构原理如上图所示。从库的 I/O Thread 线程负责不断读取主库的 binlog 日志文件并写入本地的 Relay log 临时缓存。从库的 SQL Thread 线程则不断读取 Relay log 重放事件入库。整个过程看起来是比较简单清晰的,但其中有几个点对主从数据一致性有关键影响,我们下面逐一分析。
主从复制的场景下,产生数据不一致的现象有两种:
- 数据丢失
- 数据重复
从库的 I/O Thread 是通过网络读取主库的 binlog 的,若出现网络故障,有可能产生数据丢失。为避免网络故障导致的数据丢失,网络恢复后从库重新连接上来需要知道从主库 binlog 的哪个位置重新传输数据。从库需要记住中断发生时 binlog 的位置,并从该断点处重新读取,这个断点我们称为从库的重传检查点。一个可靠的重传检查点必须是在从库读到数据并写入到本地 Relay log 持久化之后才可建立,否则都有丢失数据的可能。
由于主从复制过程的分布式特征,需要保证复制过程的幂等性,也就是重复复制同一条数据最终不会产生重复的数据。防重策略是必须的,一般符合范式特征的数据库表设计通过主键来防重,而无主键表数据可以通过所有字段联合唯一索引来防重。有了防重策略就可以任意回溯复制过程,而不必考虑从库产生重复数据。
为了保证主从数据一致性,复制过程不仅要保证不丢失、不重复,还需要保证操作顺序一致。binlog 的事件日志反应了主库并发事务的操作序列,最终这种序列也要原样反应到从库上。所以原生复制架构为了做到这点,采用了单线程模型的串行化操作。这也是没办法的,因为在数据库层面是无法知道不同数据之间的因果和依赖关系,因此无法并行入库。
原生的复制架构做到了无丢失、无重复和顺序一致性,普通场景下基本可用,但也存在一些不足:
- 可监控性、可管理性相对较弱。
- 对于异构数据无能为力。
- 通用的单线程模型可能成为性能瓶颈,导致复制延时过高。
- 一对多场景下对主库形成过大复制压力,影响主库可用性。
一些特殊场景下的数据库复制分布,使用原生复制架构则不一定合适,可能的场景有:
- 大型库,数据量大,写入量大,还需要跨地域、跨机房的复制,而且对复制延时长短比较敏感,比如大型电商的订单、交易类数据库。
所以我们才需要考虑针对特殊场景自定义复制架构,下面我们看一个自定义复制架构的概念原理图。
自定义复制架构

如上,自定义复制架构参考原生架构模拟成一个 MySQL 从库,它内部包括三个主要角色:
- Pull Worker,作用类似于原生的 I/O Thread。
- Buffer + Persistent Storage,作用类似于原生的 Relay log。
- Load Worker,作用类似于原生的 SQL Thread。
由于是自定义程序实现则可以在无改造 MySQL 的前提下提供额外的功能,相对应用和 MySQL 都可以做到透明。相对原生复制架构的不足,自定义复制架构可以提供更好的复制过程监控和管理能力,并支持异构数据转换等等。而对于需要跨地域、跨机房且延时敏感的大型库复制,则可以通过适当的策略来加速复制过程。
比如前面提到的大型电商的订单、交易类数据库,一般都是分库分表的。分库分表后,不同库表之间的数据其实在业务上是完全独立的,是可以支持并行写入的。所以我们看上图为什么画了两个 Load Worker,就是表达可以针对业务独立的表进行并行写入。一条数据的复制延时包括:
总时长 T = P + N + L; 其中 P 是 Pull Worker 处理时长,N 是网络传输时长, L 是 Load Worker 处理时长。
同一个库的 binlog 是顺序的不好并行拉取,传输过程的网络时长也是刚性的,唯一能加速的就是入库处理。按业务独立的不同表可以做到并行的多线程入库操作,以缩短 L 的整体时长,如下图所示。

总结
本文分析了 MySQL 基于 binlog 的主从复制原理,从数据一致性的角度考虑分布式网络环境下主从架构设计的关键要素。在分析了 MySQL 原生复制架构的基础上给出了一个灵活性和可控性更高的自定义复制架构的高层设计。理解了主从复制架构如何保证数据一致性后,我们后面才可进一步考虑在双写主库的场景如何做双向复制同步并保证双主库的数据最终一致性问题。这个系列下一篇文章会专门分析这个问题。
参考
[1] MySQL Internals Manual. Replication.
[2] MySQL Internals Manual. The Binary Log.
[3] in355hz. 数据库 ACID 的实现.
[4] jb51. MySQL 对 binlog 的处理说明.
[5] repls. 浅析 innodb_support_xa 与 innodb_flush_log_at_trx_commit.
[6] 68idc. MySQL 5.6 之 DBA 与开发者指南.
[7] csdn. 高性能 MySQL 主从架构的复制原理及配置详解
下面是我的微信公众号 「瞬息之间」,除了写技术的文章、还有产品、行业和人生的思考,希望能和更多走在这条路上同行者交流。

MySQL 数据库主从复制架构的更多相关文章
- Mysql实现企业级数据库主从复制架构实战
场景 公司规模已经形成,用户数据已成为公司的核心命脉,一次老王一不小心把数据库文件删除,通过mysqldump备份策略恢复用了两个小时,在这两小时中,公司业务中断,损失100万,老王做出深刻反省,公司 ...
- 项目实战7—Mysql实现企业级数据库主从复制架构实战
Mysql实现企业级数据库主从复制架构实战 环境背景:公司规模已经形成,用户数据已成为公司的核心命脉,一次老王一不小心把数据库文件删除,通过mysqldump备份策略恢复用了两个小时,在这两小时中,公 ...
- Linux mariadb(Mysql)的主从复制架构
mysql的主从复制架构,需要准备两台机器,并且可以通信,安装好2个mysql,保持版本一致性 mysql -v 查看数据库版本 1.准备主库的配置文件 /etc/my.cnf 写入开启主库的参数[ ...
- mysql数据库主从复制部署笔记
主从复制是mysql中数据库实时同步的一个常用做法了,今天我来给各位介绍一下关于mysql数据库主从复制部署一个过程,希望此例子对各位同学参考参考. 数据库主从复制原理: 数据库的主从复制就是从mas ...
- Mysql数据库主从复制搭建
Mysql数据库主从复制原理: 主库开启bin-log日志,同时生成IO线程.IO线程负责将用户写入数据库的sql语句记录在二进制日志bin-log,该记录过程可并发进行:生成标识号 server i ...
- ABP框架使用Mysql数据库,以及基于SQLServer创建Mysql数据库的架构和数据
ABP默认的数据库是SQLServer,不过ABP框架底层是EF框架,因此也是很容易支持其他类型的数据库的,本篇随笔介绍在ABP框架使用Mysql数据库,以及基于SQLServer创建MySql数据库 ...
- Mysql实现数据库主从复制架构
MySQL复制 (1)扩展方式: Scale Up ,Scale Out (2)MySQL的扩展 读写分离 复制:每个节点都有相同的数据集 向外扩展 二进制日志 单向 (3)复制的功用: 数据分布 负 ...
- 怎样解决MySQL数据库主从复制延迟的问题---流行网站的解决办法(转载)
像Facebook.开心001.人人网.优酷.豆瓣.淘宝等高流量.高并发的网站,单点数据库很难支撑得住,WEB2.0类型的网站中使用MySQL的 居多,要么用MySQL自带的MySQL NDB Clu ...
- 怎样解决MySQL数据库主从复制延迟的问题
像Facebook.开心001.人人网.优酷.豆瓣.淘宝等高流量.高并发的网站,单点数据库很难支撑得住,WEB2.0类型的网站中使用MySQL的居多,要么用MySQL自带的MySQL NDB Clus ...
随机推荐
- Android使用CountDownTimer倒计时
1.布局文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android ...
- 【体系结构】动态调度算法:记分牌算法和tomasulo算法
记分牌和tomasulo算法 动态调度: 通过硬件在程序执行时重新安排代码的执行序列来减少竞争引起的流水线停顿时间 动态调度流水线具备以下功能: (1)允许按序取多条指令和发射多条指令----取指(I ...
- Tor网络突破IP封锁,爬虫好搭档【入门手册】
本文地址:http://www.cnblogs.com/likeli/p/5719230.html 前言 本文不提供任何搭梯子之类的内容,我在这里仅仅讨论网络爬虫遇到的IP封杀,然后使用Tor如何对抗 ...
- 解决C# WinForm Graphics绘制闪烁问题
不直接使用form的CreateGraphics创建Graphics进行绘制,可以先在Form上面放一个需要大小的PictureBox,再创建一个同大小的Bitmap,将这个Bitmap设置为Pict ...
- jq冒泡之——点击其他地方隐藏
e.stopPropagetion(); <!DOCTYPE html> <html lang="en"> <head> <meta ch ...
- FZU 1914 单调队列
题目链接:http://acm.fzu.edu.cn/problem.php?pid=1914 题意: 给出一个数列,如果它的前i(1<=i<=n)项和都是正的,那么这个数列是正的,问这个 ...
- PHP 汉字拼音互转
<?PHP function Pinyin($_String, $_Code='gb2312'){ $_DataKey = "a|ai|an|ang|ao|ba|bai|ban|ban ...
- Linux 利用lsof命令恢复删除的文件
lsof命令 lsof命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP.UDP).找回/恢复删除的文件.是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需 ...
- bash快捷键
https://linuxtoy.org/archives/bash-shortcuts.html 编辑命令 Ctrl + a :移到命令行首 Ctrl + e :移到命令行尾 Ctrl + f :按 ...
- Mac osx 安装PIL出现Some externally hosted files were ignored (use --allow-external PIL to allow).
出现这个问题Some externally hosted files were ignored (use --allow-external PIL to allow)的主要原因是PIL的一些依赖库还没 ...