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 ...
随机推荐
- Linux下使用Jmeter做性能测试
一.安装Jmeter 1.上传Jmeter压缩包到Linux服务器,如:/opt目录下 2.解压缩 unzip apache-jmeter-3.1.zip 3.配置环境变量:vi /etc/profi ...
- 2016年6月20日 JAVA知识框架
基于 J2EE 列举的知识架构,大体列举开发基础知识.帮助我随时查缺补漏,奉行好记性不如烂笔头.写了这该随笔,以便后续查询. 1 JAVA简介 2 JAVA编程环境 3 JAVA基本编程结构 4 ...
- tomcat热部署
tomcat默认支持热部署,修改文件会自动加载部署,不需要重启容器 server.xml配置如下所示 autoDeploy=”true” — 自动部署 reloadable=”true” — 自动加载
- 安装sqoop
安装sqoop 1.默认已经安装好java+hadoop 2.下载对应hadoop版本的sqoop版本 3.解压安装包 tar zxvf sqoop-1.4.6.bin__hadoop-2.0.4-a ...
- Windows下搭建Wordpress博客网站
一:安装wamp Windows下的Apache+Mysql/MariaDB+Perl/PHP/Python,一组常用来搭建动态网站或者服务器的开源软件,本身都是各自独立的程序,但是因为常被放在一起使 ...
- WebGL与three.js
前面学习了一些webgl的基础知识,现在就用一下three.js写一个小例子,记录一下学习的过程. 效果图: 1.去github下载three.js,然后将它加载到网页中 <script src ...
- redis——学习之路五(简单的C#使用redis)
redis官方推荐使用的客户端程序 打星星表示推荐使用的客户端程序,一个笑脸表示最近6个月内有过正式活动的.http://redis.io/clients/#c 从这里我们可以判断官方推荐我们使用Se ...
- (转) Android开发性能优化简介
作者:贺小令 随着技术的发展,智能手机硬件配置越来越高,可是它和现在的PC相比,其运算能力,续航能力,存储空间等都还是受到很大的限制,同时用户对手机的体验要求远远高于PC的桌面应用程序.以上理由,足以 ...
- 获取终端ip地址
网上找的,记录下 import java.io.*; import java.net.*; import java.util.*; //import org.apache.http.conn.util ...
- solr schema.xml文档节点配置
首先,讲解一下/usr/local/solr/collection1/conf/schema.xml的配置,此文档功能类似于配置索引数据库. Field:类似于数据库字段的属性(此文统一使用用“字段” ...