[转载]阿里云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. ...
随机推荐
- HDU1598 find the most comfortable road 【并查集】+【枚举】
find the most comfortable road Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- 关于UTF8文件带BOM头可能会引起的错误解析
今天在做一个文件上传的项目中碰到了一个十分奇怪的问题,在解析上传上来的csv文件时,总是在解析第一行的第一个标题字段时出错,就是第一个那个字段总是和对应的model字段对应不上,这个坑是真的很深,找了 ...
- 【maven教程】(1)---maven环境配置
maven环境配置 刚开始学习maven,现在项目需要用到maven,而且他确实很好用,也比较容易上手,我也是主要通过视频学习,在写博客的时候也会总结其它人所写 博客,从简到难,如果你也是初学者那接下 ...
- 《Netty5.0架构剖析和源码解读》【PDF】下载
<Netty5.0架构剖析和源码解读>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062545 内容简介 Netty 是个异步的 ...
- HBase0.98使用ReplicationAdmin管理集群同步
公司datalink平台负责从各种数据源读取数据并同步到其他的同步或者异构数据源,最近增加的HBase的reader利用到了Hbase的Replication特性. 正常情况下,我们配置HBase的R ...
- ubuntu下加载mcypt
mcrypt 是php 里面重要的加密支持扩展库,linux环境下:该库在默认情况下不开启.window环境下:PHP>=5.3,默认开启mcrypt扩展 1.命令行下载(不嫌麻烦可以到网上找安 ...
- SSH远程登录密码尝试
import threading #创建一个登陆日志,记录登陆信息 paramiko.util.log_to_file('paramiko.log') client = paramiko.SSHCli ...
- qt中进程的使用
qt中的进程使用需要用到头文件:include<QProcess> 首先来看看需要用到的主要的函数 (1)进程的定义: QProcess *mprocess; //定义一个进程参数 (2) ...
- fastq,sam文件一些小结(持续补充。。。)
ST-E00211::H5L3NCCXY:::: chr14 141M = - ACTTCACCTCCTGGAGTCCTGGACTTCCCCACATCTCCCCTGCCCCTCCCACGTTTCCAT ...
- redis资料收集
http://www.runoob.com/redis/redis-sets.html redis set 使用 https://www.cnblogs.com/wanzaixiaoxin/p/49 ...