最新发布《数智时代的AI人才粮仓模型解读白皮书(2024版)》,立即领取! 了解详情
写点什么

腾讯云 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:071333

评论

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

presto是如何保证作业内存不会发生冲突和溢出

华为云开发者联盟

内存 presto 内存计算引擎 System Pool general Pool

云效DevOps全家桶评测征集令重磅来袭!免费使用云效全套功能

阿里云云效

云计算 阿里云 DevOps 云原生

使用APICloud AVM多端框架开发仿微信通讯录功能

YonBuilder低代码开发平台

前端开发 APP开发 APICloud 多端开发 avm.js

如何在新公司快速落地

Hockor

HertzBeat赫兹节拍 v1.0.beta.6 发布,Linux监控来啦

TanCloud探云

开源 APM 监控 告警

FAQ(常见问题)页面的编写技巧

小炮

企业 常见问题 客户服务

深度解读「无影云电脑远程办公解决方案」

阿里云弹性计算

远程办公 无影云电脑

RocketMQ的tag还有这个“坑”!

中间件兴趣圈

RocketMQ tag 消息过滤

Redis:在windows环境安装Redis

喀拉峻

redis

IOS技术分享| ARCallPlus 开源项目(一)

anyRTC开发者

ios 移动开发 语音通话 视频通话 呼叫邀请

java培训Redis高频面试考点

@零度

Java redis

焕然一新的 Vue 3 中文文档来了

CRMEB

聊聊 C 语言和 ABAP 这两门编程语言的关系

Jerry Wang

c++ 编程语言 C语言 abap 3月月更

Redis 缓存击穿(失效)、缓存穿透、缓存雪崩怎么解决?

码哥字节

Redis 核心技术与实战 Redis 热点key 缓存服务 3月月更

前端培训之常见算法分享

@零度

前端算法

WebAssembly技术_JS调用C函数示例_传递参数、方法导出

DS小龙哥

webassembly 3月月更

深入浅出 Vue3 核心知识点

百瓶技术

Vue 前端 VUE 3.0 源码 vue3.0

Rust的Cow类型

Shine

rust cow

春招进行时!当代大学生求职行为大赏

易观分析

求职 招聘 春招

设计一个 SaaS 系统需要考虑的4个关键点

Im胡子

系统架构 SaaS SaaS设计 SaaS系统架构

5G 和 Wi-Fi 市场与技术的一些思考系列之二

李伟-晨泳

Jetpack Compose之 在Compose中使用Navigation导航

黄林晴

android Compose JetPack

大数据培训十大Hive调优技巧

@零度

大数据 hive调优

公有云RDS太贵?基于ECS构建的多云RDS服务可降低近半成本

沃趣科技

数据库 公有云 RDS 云数据库RDS for MySQL 云数据库Redis

你了解部署流水线吗?

华为云开发者联盟

自动化 软件开发 devcloud 部署流水线 流水线

如何消除代码山中那一大坨参数列表

华为云开发者联盟

代码 软件设计 参数 全局变量 参数列表

DPU芯片头部企业云豹智能加入龙蜥社区,共同推动新一代数据中心基础设施蓬勃发展

OpenAnolis小助手

云计算 开源 芯片 龙蜥社区

玩转OpenMLDB社区,四张角色卡待解锁

第四范式开发者社区

人工智能 数据库 开源 贡献者 特征平台

最好的 6 个 React Table 组件详细亲测推荐

蒋川

React

☕️从Java8到Java17的新特性(一):Java8 的新特性

看山

Java java8

昇腾CANN论文上榜CVPR,全景图像生成算法交互性再增强!

华为云开发者联盟

CVPR CANN 图像生成 昇腾AI处理器 图像布局

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