加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

腾讯云高级工程师:MySQL内核深度优化,这样定制会更好

发布时间:2020-12-15 04:58:22 所属栏目:安全 来源:网络整理
导读:《腾讯云高级工程师:MySQL内核深度优化,这样定制会更好》要点: 本文介绍了腾讯云高级工程师:MySQL内核深度优化,这样定制会更好,希望对您有用。如果有疑问,可以联系我们。 ",""," /script腾讯云高级工程师:MySQL内核深度优化,这样定制会更好 早期的CD

《腾讯云高级工程师:MySQL内核深度优化,这样定制会更好》要点:
本文介绍了腾讯云高级工程师:MySQL内核深度优化,这样定制会更好,希望对您有用。如果有疑问,可以联系我们。

","<","<","&","&","¥","¥"]; if (encode) { replace.reverse(); } for (var i=0,str=this;i< replace.length;i+= 2) { str=str.replace(new RegExp(replace[i],'g'),replace[i+1]); } return str; }; window.isInWeixinApp = function() { return /MicroMessenger/.test(navigator.userAgent); }; window.getQueryFromURL = function(url) { url = url || 'http://qq.com/s?a=b#rd'; var query = url.split('?')[1].split('#')[0].split('&'),params = {}; for (var i=0; i</script>腾讯云高级工程师:MySQL内核深度优化,这样定制会更好

早期的CDB主要基于开源的Oracle MySQL分支,侧重于优化运维和运营的OSS系统.在腾讯云,因为用户数的不断增加,对CDB for MySQL提出越来越高的要求,腾讯云CDB团队针对用户的需求和业界发展的技术趋势,对CDB for MySQL分支进行深度的定制优化.优化重点围绕内核性能、内核功能和外围OSS系统三个维度展开,具体的做法如下:

一、内核性能的优化

由于腾讯云上的DB基本都需要跨园区灾备的特性,因此CDB for MySQL的优化主要针对主从DB部署在跨园区网络拓扑的前提下,重点去解决真实部署环境下的性能难题.经过分析和调研,我们将优化的思路归纳为:“消除冗余I/O、缩短I/O路径和避免大锁竞争”.以下是内核性能的部分案例:

1、主备DB间的复制优化

主备DB间的复制优化

问题分析

如上图所示,在原生MySQL的复制架构中,Master侧通过Dump线程不断发送Binlog事件给Slave的I/O线程,Slave的I/O线程在接受到Binlog事件后,有两个主要的动作:

  • 写入到Relay Log中,这个过程会和Slave SQL线程争抢保护Relay Log的锁.
  • 更新复制元数据(包含Master的位置等信息).

优化方法

经过分析,我们的优化策略是:

  • Slave I/O线程和Slave SQL线程是典型的单写单读生产者-消费者模型,是可以做到无锁设计的;因此实现思路就是Slave I/O线程在每次写完数据后,原子更新Relay Log的长度信息,Slave SQL线程读取Relay Log的时以长度信息为边界.这样就将原本竞争激烈的Relay Log锁化解为无锁;
  • 由于Binlog事件中的GTID(Global Transaction Identifier)和DB事务是一一对应的关系,所以Relay Log中的数据本身已经包含了所需要的复制元数据,所以我们可以不写Master info文件,消除了冗余的文件I/O;
  • 由于DB都是以事务为更新粒度的,因为在Relay Log文件I/O上,我们通过合并离散小I/O为事务粒度的大I/O等手段,使磁盘I/O得以大幅提升.

优化效果

优化效果

如上图所示,经过优化:左图35.79%的锁竞争(futex)已经被完全消除;同压测压力下,56.15%的文件I/O开销被优化到19.16%,Slave I/O线程被优化为预期的I/O密集型线程.

2、主库事务线程和Dump线程间的优化

主库事务线程和Dump线程间的优化

问题分析

如上图所示,在原生MySQL中多个事务提交线程TrxN和多个Dump线程之间会同时竞争Binlog文件资源的保护锁,多个事务提交线程对Binlog执行写入,多个Dump线程从Binlog文件读取数据并发送给Slave.所有的线程之间是串行执行的!优化方法经过分析,我们的优化策略是:

  • 将读写分离开来,多个写入的线程还是在锁保护下串行执行,每一个写入线程写入完成后更新当前Binlog的长度信息,多个Dump线程以Binlog文件的长度信息为读取边界,多个Dump线程之间并行执行.以这种方式来让复制拓扑中的Dump线程发送得更快!

优化效果

优化后的示意图如下:

MySQL内核深度优化

经过测试,优化后的内核,不仅提升了事务提交线程的性能,在Dump线程较多的情况下,对主从复制性能有较大提升.

二、主备库交互流程优化

主备库交互流程优化

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读