性能提升利器:MySQL 5.7多源主从复制的独特性

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
日志服务 SLS,月写入数据量 50GB 1个月
简介:

作者介绍

高强,DBAplus社群联合发起人,开源技术专家。擅长MySQL、PostgreSQL等产品的实施、运维和故障处理。曾参与多个省级政府单位项目的实施和运维工作,具有丰富的运维经验。

 

关于MySQL主从复制

 

复制技术顾名思义,就是通过数据库的复制技术以一份数据为主,复制成另一份存放,数据来源的那一份做为主库,存放复制数据的的称为从库。MySQL的复制方案有很多,比如主从复制、半同步复制、多主还有主主复制等。基本都是是通过把主库的操作写入二进制日志,将二进制日志传送到从库并且重演日志中记录的操作跟进主库状态以便达到在从库数据同步的效果。

 

其中,主从复制可以变换、扩展出很多的组合方法,比如多源复制(多台master将数据发送到1台数据库)、1主多从或者还有从服务器再延伸出从服务器。

 

下面列举一些数据库主从复制架构:

 

注:主库为Master(1,2,..,N),从库为Slave(1,2,...,N)。

 

 

主从复制有如下一些优势:

 

  1. 分担负载:对业务进行读写分离,减轻主库I/O负载,将部分压力分担到从库上,缩短客户查询响应时间。

  2. 增加健壮性:在主库出现问题时,可通过多种方案将从库设置为主库,替换主库支撑业务,缩短停机窗口。

  3. 有利备份:在从库上备份,即不影响主库的事务,也不影响主库性能和磁盘空间。

  4. 查询分析:从库可以作为统计、报表等数据分析工作所使用的的OLAP库。

  5. 异地备份:将从库放置在异地可作为异地数据同步备份所用。

 

从MySQL的5.7版本开始支持多源主从复制技术(Multi-Source Replication),就是将多个数据库(Master)的数据集中发送到1台从库(Slave)上,该技术也具有刚才上文提到的主从复制的优势,除了这些,它的独特性还在于:

 

  1. 汇聚数据:尤其是在分库分表的一些场景中,数据集中统计分析操作可以在1台从库服务器上实现。

  2. 节省成本:数据集中存放可避免服务器等软硬件资源浪费,5.7之前1主1从或者1主多从的方案需要为每个主机都安置一台备机;5.7推出多源复制之后,可以将多个从库进行合并,至于是合并存放在高端还是低端服务器上,取决于分析、统计等业务在整体业务中的优先级、繁忙程度等因素。

  3. 集中备份:方便在一台服务器备份所有已收到的数据库数据。

  4. 异地灾备:将从库放在距离远的地方,可用于异地备份项目。

 

基本的1主1从复制实现过程

 

下面咱们先循序渐进简单了解一下基本的1主1从(1 master,1 slave)复制的实现过程:

 

图中Master为主库的主机名,Slave为从库主机名。同步的数据库名为Music。从库接收主库(binlog dump线程)发过来的Binary Log,通过从库的I/O线程(I/O thread)将日志写入从库的Relay Log中,然后通过SQL线程(SQL thread)将日志的内容应用到从库中。

 

在从库上通过命令可以看到2个必备进程(I/O thread和SQL thread)在待命状态,线程状态如下:

 

 

线程的功能主要通过state字段确认:

 

  • I/O线程:

    Waiting for master to send event 

  • SQL(Coordinator)线程:

    Slave has read all relay log; waiting for more updates

     

    开启并发后还会有以下线程:

     

    • Worker线程:

      Waiting for an event from Coordinator  

     

    多源复制的实现与1主1从的类似,都是发送二进制日志再重演,但是在SQL线程(SQL thread)上有略微区别,会为每个主库实例提供一套SQL和IO线程:

     

     

    配置多源复制的操作方法

     

    多源复制的配置比较简单:

     

    1. stop slave;

    2. SET GLOBAL master_info_repository = 'TABLE';

    3. SET GLOBAL relay_log_info_repository = 'TABLE';

    4. change master to master_host='192.168.5.160',master_user='slave1',master_password='gaoqiang'  for channel 'master1';

    5. change master to master_host='192.168.5.163',master_user='slave1',master_password='gaoqiang'  for channel 'master2';

    6. start slave;

     

    图中使用了2个主库:music和habit,假设music存放音乐的歌手、名称和其他信息,habit保存了用户的偶像、最喜欢的歌、常听的歌、播放高峰时间段和地理位置信息的话,汇聚到从库便可即实现了经济实惠的从库端分库合并又实现了统一做用户行为分析,还可以用一条mysqldump命令加个--all-databases参数全部导出做备份。

     

    考虑到多源复制运行过程中,一台从库要接受多方的数据,相比压力会比单库复制有所提升,因此需要优化一下从库配置,从而提升从库执行效率。

     

    性能提升利器——并行复制

     

    接下来要说的就是:性能提升利器——并行复制。为了提高SQL线程(SQL thread)的执行效率,减少主库与从库之间的延迟,MySQL提供了并行复制的特性,可以将事务在从库上多线程并发的回放应用,从而达到加速同步速度的效果。

     

    需要注意的是,使用过程中还是有一些问题需要稍加留意,如果设置不当,反而可能会画蛇添足。

     

    就拿性能来说,并不是并发开的越高越好,并发开的过高和过低,都可能带来负面性能影响,比如引起Coordinator的判断、分发等处理过程开销升高,使用Sysbench进行压力测试的过程中,该开销升高症状体现在CPU消耗高。可能在不同的环境和业务场景下都会有相应的反应,需要量体裁衣、因地制宜。

     

    下图为1主1从SQL线程并行复制回放过程:

     

    图2中,SQL线程(SQL thread)由原来的1个,分裂变成了1个Coordinator和N个worker。Coordinator主要用来分发工作给不同的worker,并且在必要时自己也进行重演操作。图中分了18个并行,即18个worker并行工作。他们负责并行的将日志中可以划分成一组的事务进行并行回放。

     

    在把事务应用到从库的时候,根据binary log中last_committed(需设置并行类型为logical clock)的值判断是否可以放在一组进行并行回放,如果取值相同,便并行执行。

     

    日志信息:

     

     

    从日志中看到,数据库已经开启了GTID(全局事务标识)功能,此功能是5.6版本出现的,可以保证每个提交的事务都会有一个全局唯一的编号,日志中也可看到GTID信息。

     

    多源复制开启并发后的架构图:

     

    开启并行复制操作的方法对于1主和多源是一样的:

     

    1. stop slave;

    2. SET GLOBAL SLAVE_PARALLEL_TYPE='LOGICAL_CLOCK';

    3. SET GLOBAL SLAVE_PARALLEL_WORKERS=30;

    4. start slave;

     

    验证配置生效:

     

     

    用show processlist命令会看到会出现多个coordinator线程和每个co线程所分配的30个worker线程,总共60多个线程。(由于worker阵容太庞大,超占篇幅,就不在此展示了)

     

    为什么选择并行度为30,原因是从1主1从的测试中发现该并行度在本次测试环境中磁盘资源利用率略高于其他场景,CPU消耗相对比较低,内存消耗差别不大,总体效率最高,执行时间最短。

     

    1主1从复制时Slave数据库的CPU性能状态特征:

     

    CPU性能统计:

     

    从图中可以看到,在本次测试环境中,CPU状态最好的是并发度为18和30的时候,并发度为300的时候CPU反而消耗明显;并发为2的时候cpu消耗高,并且处理时间更耗时;并发为0的时候,其实等于不并发,CPU利用率不高,耗时也较长;值得关注的是,并发度设置为1的时候,即使只有1个worker,但是毕竟是并发模式,此时同样在消耗coordinator的资源,并且此时coordinator也参与了重演操作,相当于2个线程进行重演,因此与并发度设置为2很接近,所以务必注意如果想关闭并发一定要设置为0,而不是1。

     

    接下来进行多源复制的压力测试与性能监控:

     

    多源复制的压力测试使用了Sysbench对2台主库(master和master1)一起加压,同时对从库slave进行性能监控。(3个数据库所在的服务器配置完全相同)

     

    测试语句:

     

     

    参数说明:

     

    1. OLTP场景

    2. Innodb引擎

    3. 对5张表操作

    4. 每数据库1万个操作请求(一共2万个操作请求)

    5. 混合读写

    6. 每数据库100并发

    7. 每表20万条数据

     

    考虑到30并发度的资源利用相对充分、执行效率相对较高的测试结果,在从库开启30个SQL线程并行后进行测试,并将从库的监控数据进行统计做成可视化曲线图进行分析。

     

    从下面3张测试后生成的曲线图可以看到,对于从主库发过来的2万个请求,并行执行的完成时间(横轴为时间)比单线程更短,资源利用率更高,执行效率更高。

     

    CPU使用率:

     

     

    从图中可看到,开启并行之后,CPU的利用率比之前有所升高,负载还OK,最高36%左右,利用较单线程更充分,操作完成时间更早(曲线最先恢复下降到0)。

     

    Disk Write KB/s

     

     

    硬盘使用率从图中看出,并行SQL线程relay过程相对比较平稳,未出现明显抖动,并且30并发的曲线最早归零,结束操作。

     

    Free Memory 剩余内存:

     

     

    内存使用差不太多。

     

    由此可见,多源复制在合理的开启并行之后,有助于提高复制效率,缩短数据的延迟。

     

    小结

     

    总体说来,MySQL的多源复制提供了更经济、方便和安全的数据库环境。如有感兴趣的朋友,欢迎留言一起交流,模拟业务场景进行测试、提出测试建议、更正错误和共同研究都是非常欢迎的,希望与大家互助共进!


    本文来自云栖社区合作伙伴"DBAplus",原文发布时间:2016-11-08

    相关实践学习
    如何在云端创建MySQL数据库
    开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
    全面了解阿里云能为你做什么
    阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
    目录
    相关文章
    |
    28天前
    |
    缓存 关系型数据库 MySQL
    MySQL索引策略与查询性能调优实战
    在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
    |
    2月前
    |
    SQL 关系型数据库 MySQL
    mysql主从复制概述和配置
    【10月更文挑战第22天】MySQL 主从复制是一种将主服务器的数据复制到一个或多个从服务器的技术,实现读写分离,提高系统性能和可用性。主服务器记录变更日志,从服务器通过 I/O 和 SQL 线程读取并应用这些变更。适用于读写分离、数据备份和恢复、数据分析等场景。配置步骤包括修改配置文件、创建复制用户、配置从服务器连接主服务器并启动复制进程。
    105 1
    |
    2月前
    |
    存储 关系型数据库 MySQL
    提高MySQL查询性能的方法有很多
    提高MySQL查询性能的方法有很多
    190 7
    |
    2月前
    |
    监控 关系型数据库 MySQL
    深入了解MySQL主从复制:构建高效稳定的数据同步架构
    深入了解MySQL主从复制:构建高效稳定的数据同步架构
    133 1
    |
    2月前
    |
    存储 关系型数据库 MySQL
    提高MySQL的查询性能
    提高MySQL的查询性能
    77 4
    |
    29天前
    |
    SQL 关系型数据库 MySQL
    MySQL性能探究:count(*)与count(1)的性能对决
    在MySQL数据库的性能优化中,对查询语句的细微差别有着深入的理解是非常重要的。`count(*)`和`count(1)`是两种常用的聚合函数,用于计算行数。在面试中,面试官经常会问到这两种函数的性能差异。本文将探讨`count(*)`与`count(1)`的性能对比,并整理十道经典的MySQL面试题,帮助你在面试中游刃有余。
    70 3
    |
    2月前
    |
    存储 关系型数据库 MySQL
    MySQL主从复制原理和使用
    本文介绍了MySQL主从复制的基本概念、原理及其实现方法,详细讲解了一主两从的架构设计,以及三种常见的复制模式(全同步、异步、半同步)的特点与适用场景。此外,文章还提供了Spring Boot环境下配置主从复制的具体代码示例,包括数据源配置、上下文切换、路由实现及切面编程等内容,帮助读者理解如何在实际项目中实现数据库的读写分离。
    MySQL主从复制原理和使用
    |
    1月前
    |
    缓存 监控 关系型数据库
    如何根据监控结果调整 MySQL 数据库的参数以提高性能?
    【10月更文挑战第28天】根据MySQL数据库的监控结果来调整参数以提高性能,需要综合考虑多个方面的因素
    78 1
    |
    1月前
    |
    监控 关系型数据库 MySQL
    如何监控和诊断 MySQL 数据库的性能问题?
    【10月更文挑战第28天】监控和诊断MySQL数据库的性能问题是确保数据库高效稳定运行的关键
    116 1
    |
    1月前
    |
    缓存 关系型数据库 MySQL
    如何优化 MySQL 数据库的性能?
    【10月更文挑战第28天】
    95 1