限时领|《AI 百问百答》专栏课+实体书(包邮)! 了解详情
写点什么

腾讯云 MySQL 内核优化深度分享

  • 2016-06-16
  • 本文字数:2121 字

    阅读完需:约 7 分钟

作者简介:

简怀兵,讯云数据库高级工程师,负责腾讯云 CDB 内核及基础设施建设,先后供职于 Thomson Reuters 和 YY 等公司,PTimeDB 作者,曾获一项发明专利,从事 mysql 内核开发工作 8 年,具有丰富的优化经验;在分布式存储等领域有较丰富经验;

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

内核性能的优化

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

1、主备 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 线程间的优化

问题分析

如上图所示,在原生 MySQL 中多个事务提交线程 TrxN 和多个 Dump 线程之间会同时竞争 Binlog 文件资源的保护锁,多个事务提交线程对 Binlog 执行写入,多个 Dump 线程从 Binlog 文件读取数据并发送给 Slave。所有的线程之间是串行执行的!

优化方法

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

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

优化效果

优化后的示意图如下:

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

主备库交互流程优化

问题分析

如上图所示,在原生 MySQL 中主备库之间的数据发送和 ACK 回应是简单的串行执行,在上一个事件 ACK 回应到达之前,不允许继续发送下一个事件;这个行为在跨园区 (RTT 2-3ms) 的情况性能非常差,而且也不能很好地利用带宽优势。

优化方法

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

将发送和 ACK 回应的接收独立到不同的线程中,由于发送和接收都是基于 TCP 流的传输,所以时序性是有保障的;这样发送线程可以在未收 ACK 之前继续发送,接受线程收到 ACK 后唤醒等待的线程执行相应的任务。

优化效果

根据实际用例测试,优化后的 TPS 提升为 15% 左右。

内核功能的优化

预留运维帐号连接数配额

在腾讯云上,不时遇到用户 APP 异常或者 BUG 从而占满 DB 的最大连接限制,这是 CDB OSS 帐号无法登录以进行紧急的运维操作。针对这个现状,我们在 MySQL 内核单独开辟了一个可配置的连接数配额,即便在上述场景下,运维帐号仍然可以连接到 DB 进行紧急的运维操作。极大地降低了异常情况下 DB 无政府状态的风险。该帐号仅有数据库运维管理权限,无法获取用户数据,也保证了用户数据的安全性。

主备强同步

针对一些应用对数据的一致性要求非常高,CDB 在 MySQL 原生半同步的基础上进行了深度优化,确保一个事务在主库上提交之前一定已经复制到至少一个备库上。确保主库宕机时数据的一致性。

外围系统的优化

除了以上提到的 MySQL 内核侧的部分优化,我们也在外围 OSS 平台进行了多处优化。例如使用异步 MySQL ping 协议实现大量实例的监控、通过分布式技术来加固原有系统的 HA/ 服务发现和自动扩容等功能、在数据安全 / 故障切换和快速恢复方面也进行了多处优化。

2016 年 7 月 5 日,诚邀您参与腾讯·“云 + 未来”生态峰会,与腾讯董事会主席马化腾先生及各界顶级企业家,国际专家一同,共探产业与互联网融合发展之道,推动互联网 + 生态圈发展。欢迎点击了解 http://www.qcloud.com/event/tcc2016?utm_source=infoqlink&utm_medium=wzl&utm_campaign=infoQ

2016-06-16 05:071732
用户头像

发布了 26 篇内容, 共 18.3 次阅读, 收获喜欢 12 次。

关注

评论

发布
暂无评论
发现更多内容

Alien Skin Exposure2023最新版下载

茶色酒

Alien Skin Exposure

python利用open3d可视化npy文件

Studying_swz

Python 11月月更

金九银十结束了,各大公司Java后端开发真题汇总,明年再战

小二,上酒上酒

Java MySQL 编程 分布式 算法

Java 字符串 split 的一个反直觉陷阱

mylxsw

Java 字符串 基础 陷阱

一文弄懂Vue与Servlet的交互:让你的大学课设变得容易起来

游坦之

Vue axios 11月月更

分布式技术难学?谷歌大神首发纯手撸ZK+Dubbo笔记,网友看完直呼NB

程序知音

Java zookeeper 分布式 java架构 后端技术

Linux 磁盘管理

芯动大师

11月月更 Linux系统 Linux磁盘管理

架构实战训练营模块6作业

atcgnu

【Python 函数】-嵌套使用,变量的作用域

度假的小鱼

11月月更 Python局不变量 Python全局变量

MongoDB 新手入门 - CRUD

mylxsw

mongo database 入门教程

MongoDB 新手入门 - Aggregation

mylxsw

mongo database 入门教程

第六章TCP/IP——网络传输硬件设备

初学者

11月月更

模块六作业 - 拆分电商系统为微服务

小虎

架构训练营

架构--模块六作业

李某人

架构训练营

数据结构分析_Inception_GNN_GCN

Studying_swz

人工智能 深度学习 11月月更

Python 操作 lxml库与Xpath

度假的小鱼

11月月更 Python 操作 lxml库 UI自动化例子

第七章TCP/IP——ARP网络攻击与欺骗

初学者

网络 11月月更

【设计模式】适配器模式:攻敌三分,自留七分,以超兽武装的例子来谈谈适配器模式

游坦之

软件工程 设计模式 11月月更

花一周时间,啃完这套京东架构师独家微服务笔记,成功面进字节

小二,上酒上酒

Java 负载均衡 编程 架构 SpringCloud

耗时3个月啃烂了这份Redis技术笔记,我成功上岸进了字节

程序知音

Java 数据库 redis java架构 后端技术

Sentinel Go-揭秘[流量控制]的实现原理

柠檬汁Code(binbin0325)

源码 sentinel 熔断 限流 冷启动

架构误区系列7:删除+更新的缓存刷新机制

agnostic

缓存

【Python 函数】-参数-返回值

度假的小鱼

11月月更 Python函数参数使用

【设计模式】装饰者模式:以造梦西游的例子讲解一下装饰者模式,这也是你的童年吗?

游坦之

软件工程 设计模式 11月月更

终于有好心的人把高性能MySQL「第三版」电子版分享出来了

小二,上酒上酒

Java MySQL 编程 计算机

熬夜也要肝完的阿里内部面试官手册,吃透直接拿下大厂心仪offer

小二,上酒上酒

Java 数据库 架构 分布式 高并发

混沌工程之ChaosBlade利刃出鞘

柠檬汁Code(binbin0325)

混沌工程 故障注入 ChaosBlade Chaos Mesh

刨根问底 Kafka,面试过程真好使

蔡农曰

Java kafka 面试 后端

阿里P8大牛刷算法的正确姿态!女朋友再也不用担心我刷不动力扣了

小二,上酒上酒

Java 编程 算法 LeetCode

阿里高工内产的 SpringBoot 保姆级笔记,面面俱到,太全了

程序知音

Java spring springboot java架构 后端技术

MySQL 数据库索引技术原理初探

mylxsw

MySQL 数据库 索引 B树

腾讯云MySQL内核优化深度分享_数据库_云加社区_InfoQ精选文章