[转载]阿里云MySQL优化主从同步,降低数据延迟
1. 背景
为了提高系统的可用性和数据保护,MySQL通常采用master-slave的部署结构,简单高效,master和slave之间使用binlog来复制数据。
binlog支持statement和row格式,为了保证数据的一致性,通常采用row格式的event。master-slave的结构图如下:

当主库或者主库所在的主机,机房出现异常情况的时候, 进行master和slave主备切换,让slave来提供不间断的服务。主备进行切换最重要的前提就是:slave节点已经apply完毕master节点所生成的binlog,也就是slave和master处在一致的状态。
如上master-slave的结构图所示,
1. slave端的IO thread首先接收master端生成的binlog
2. slave端的SQL thread开始应用所接收的binlog
由于步骤1的瓶颈在于网络,通常情况下,binlog都能够很快传输到备库。
步骤2需要把row event变更到引擎中,由于是逻辑行的处理,需要索引的查找过程。
所以,大部分的瓶颈点都出在步骤2上,其决定了备库何时能够切换到主库,MySQL也一直在致力于加速binlog的apply。
接下来我们看下RDS MySQL做的一些优化。
2. 二级索引
InnoDB Row event apply的过程, 需要根据before image进行BTree查找, 例如update row, delete row。早期只能根据pk或者uk进行索引查找,如果用户在建表的过程中,只建了普通的二级索引,在备库binlog apply的时候,需要进行全表扫描,这样,每一个row event都需要进行全表扫描,效率非常低,严重影响备库的恢复进度。
RDS在备库apply row event的时候,进行了优化,其优化原则是:
1. 如果有pk或者uk,就直接使用
2. 如果没有pk或者uk,就选择一个二级索引
3. 如果没有二级索引,就选择全表扫描
这样优化后,如果二级索引的选择性比较高,apply的速度也会有很大的提升。
3. 隐含主键
前面我们假设用户如果没有pk或者uk,而创建了普通的二级索引的情况, 如果用户没有创建任何的索引,RDS会帮助用户创建一个隐含主键,如下图所示:

这个隐含的column是auto_increment的,对用户是隐藏的,并且使用也是透明的,这样每一张表没有pk或者uk的表, 就会默认有一个隐含主键,加速备库的apply速度。
4. 只读实例隐式提交
在只读实例上, 一方面用户进行只读查询, 另一方面sql thread进行row event apply,如果用户的查询没有自动提交来释放MDL锁,随后sql thread进行的ddl变更,就会被阻塞,导致整个apply进程被阻塞。
RDS MySQL增加了一个隐式提交的功能,针对只读实例上,用户read-committed隔离级别的sql,进行隐式提交,即在sql结束后,默认进行一个提交动作,以释放MDL锁,减少阻塞的可能性。
5. 表级并行复制
MySQL 5.6之前, 备库的apply线程, 即SQL thread线程都是串行的在执行row event,严重影响了apply速度,在MySQL5.6之后, 官方支持了以db为维度的并行复制,也就是一个Coordinator thread,即分发线程,和一组worker thread,即工作线程。
其工作如下图:

但DB维度的并行复制,粒度太粗,所以RDS在此基础上,实现了表级别的并行复制,以加速备库恢复的并行度。
[转载]阿里云MySQL优化主从同步,降低数据延迟的更多相关文章
- MySQL数据库主从同步安装与配置总结
MySQL的主从同步是一个很成熟的架构,优点为: ①在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力: ②在从主服务器进行备份,避免备份期间影响主服务器服务: ③当主服务器出现问题时 ...
- MySQL数据库主从同步延迟分析及解决方案
一.MySQL的数据库主从复制原理 MySQL主从复制实际上基于二进制日志,原理可以用一张图来表示: 分为四步走: 1. 主库对所有DDL和DML产生的日志写进binlog: 2. 主库生成一个 lo ...
- Linux下MySQL数据库主从同步配置
说明: 操作系统:CentOS 5.x 64位 MySQL数据库版本:mysql-5.5.35 MySQL主服务器:192.168.21.128 MySQL从服务器:192.168.21.129 准备 ...
- mysql数据库主从同步
环境: Mater: CentOS7.1 5.5.52-MariaDB 192.168.108.133 Slave: CentOS7.1 5.5.52-MariaDB 192.168. ...
- 阿里云mysql数据库恢复总结,mysql binlog日志解析
由于意外..阿里云mysql中有一张表被全部删除了,深吸三口气候,开始解决. 首先用凌晨的自动备份的,进行全量恢复,然后找binlog日志(见下文),查找从全量备份到数据删除之间的记录 这导致了一个问 ...
- 【转】MySQL数据库主从同步管理
MYSQL主从同步架构是目前使用最多的数据库架构之一,尤其是负载比较大的网站,因此对于主从同步的管理也就显得非常重要,新手往往在出现主从同步错误的时候不知道如何入手,这篇文章就是根据自己的经验来详细叙 ...
- mysql主从同步(4)-Slave延迟状态监控
mysql主从同步(4)-Slave延迟状态监控 转自:http://www.cnblogs.com/kevingrace/p/5685511.html 之前部署了mysql主从同步环境(Mysql ...
- 阿里云MySQL远程连接不上问题
解决阿里云MySQL远程连接不上的问题:step1:1.修改user表:MySQL>update user set host = '%' where user = 'root'; 2.授权主机访 ...
- MYSQL配置主从同步
MYSQL配置主从同步 mysql主服务器配置 vim /etc/my.cnf [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql. ...
随机推荐
- HPUX 11.31 MC-SG SGeRAC配置
HPUX 11.31 MC-SG SGeRAC配置 环境: 系统版本号 hp-unix 11.3v2 1503 serviceguard extension版本号 T1907 实施 1. 磁盘空间划分 ...
- JQuery插件开发标准写法
;//step01 定义JQuery的作用域 (function ($) { //step03-a 插件的默认值属性 var defaults = { prevId: 'prevBtn', prevT ...
- 【npm】如何在Atom中安装emmet和atom-beautify插件?
为了提高编写HTML和CSS的速度,最近尝试着在Atom中安装emmet插件,下面谈谈安装成功的过程 1首先我尝试了网上教程中介绍最多的方法:打开Atom的引导界面(Welcome Guide)中的i ...
- Android项目实战(三十七):Activity管理及BaseActivity的实现
Ps:7-10月 完成公司两个app项目上架.漏掉的总结 开始慢慢补上. 一.写一个Activity的管理类 1.单例模式,以栈(先进后出)的形式存储Activity对象 public class A ...
- iOS开发之Xcode常用调试技巧总结
转载自:iOS开发之Xcode常用调试技巧总结 最近在面试,面试过程中问到了一些Xcode常用的调试技巧问题.平常开发过程中用的还挺顺手的,但你要突然让我说,确实一脸懵逼.Debug的技巧很多,比如最 ...
- android中的五大布局(控件的容器,可以放button等控件)
一.android中五大布局相当于是容器,这些容器里可以放控件也可以放另一个容器,子控件和布局都需要制定属性. 1.相对布局:RelativeLayout @1控件默认堆叠排列,需要制定控件的相对位置 ...
- js-使用JavaScript、jQuery两种方式实现全选/全不选
html代码 <input type='checkbox' value="10" name="frust"/>苹果10元 <br/> & ...
- 简单记录一下原生ajax
面试老忘记,代码如下 function ajax() { var xmlHttpRequest = null; //定义XMLHttp对象的容器 if(window.XMLHttpRequest) { ...
- 安装supervisord
一:简介 supervisord是一个进程管理工具,提供web页面管理,能对进程进行自动重启等操作. 优点: - 可以将非后台运行程序后台运行 - 自动监控,重启进程 缺点: - 不能管理后台运行程序 ...
- centOS7 mini配置linux服务器(五) 安装和配置tomcat和mysql
配置java运行环境,少不了服务器这一块,而tomcat在服务器中占据了很大一部分份额,这里就简单记录下tomcat安装步骤. 下载 首先需要下载tomcat7的安装文件,地址如下: http://t ...