写点什么

腾讯云 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:071526
用户头像

发布了 23 篇内容, 共 15.7 次阅读, 收获喜欢 11 次。

关注

评论

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

Flink Forward Asia 2021 延期,线上相见

Apache Flink

大数据 flink 编程 后端 实时计算

低代码实现探索(一)组件元信息定义

零道云-混合式低代码平台

低代码

回顾“低代码”历史发展,是技术进步了还是倒退了?

优秀

低代码

按需引入ant-design-vue组件

石云升

Vue 11月日更

看完了阿里大牛的Leetcode刷题笔记, 我成功拿到了字节跳动的offer

热爱java的分享家

Java 面试 算法 LeetCode 经验分享

25 K8S之Endpoint对象

穿过生命散发芬芳

k8s 11月日更

数据分析从零开始实战,Pandas读写CSV数据

老表

Python 数据分析 pandas 11月日更

Python Qt GUI设计:QSlider滑动条类(基础篇—16)

不脱发的程序猿

Python PyQt GUI设计 Qt Designer QSlider滑动条类

阿里大牛最新公开压轴的“Redis深度笔记”,GitHub已标星81.6K

热爱java的分享家

Java 架构 面试 程序人生 编程语言

修复一个BaseRecyclerViewAdapterHelper漏洞

Changing Lin

11月日更

面试不慌,拿这70张思维导图,怒怼面试官

奔着腾讯去

c++ golang 数据结构 思维导图 TCP/IP

雇工模式(Employee Pattern)

Tom弹架构

Java 架构 设计模式

萝卜快跑:迎来首单业绩兑现,商业化试点服务进程进入新阶段

脑极体

Spring Boot的前世今生以及它和Spring Cloud的关系详解

Java高级开发

Java 架构 springboot SpringCloud

终于有腾讯架构师把困扰我多年的《计算机网络原理》全部讲明白了

热爱java的分享家

Java 面试 编程语言 网络协议 经验分享

Go语言学习查缺补漏ing Day7

Regan Yue

Go 语言 11月日更

Flink CDC 2.1 正式发布,XTransfer技术专家贡献MongoDB CDC 连接器

XTransfer技术

大数据 实时计算

TypeScript 之 Indexed Access Types

冴羽

JavaScript typescript html5 大前端 ES6

规格模式(Specification Pattern)

Tom弹架构

Java 架构 设计模式

空对象模式(Null Object Pattern)

Tom弹架构

Java 架构 设计模式

字节大牛把算法常见面试:哈希、链表、队列、递归全部总结出来了

热爱java的分享家

Java 面试 程序人生 编程语言 经验分享

不是吧,都2021年了你别说你还不会Spring MVC基本应用

热爱java的分享家

Java 架构 程序人生 编程语言 经验分享

简述以太坊P2P网络之UDP

devpoint

区块链 以太坊 udp 11月日更

XTransfer 1号技术员工卡乐:从普通程序猿到技术专家

XTransfer技术

金融科技 支付 经验分享 创业公司

Camtasia局部放大特效教程

淋雨

Camtasia 录屏

对象池模式(Object Pool Pattern)

Tom弹架构

Java 架构 设计模式

低代码实现探索(二)低代码中的数据

零道云-混合式低代码平台

低代码

【高并发】浅谈AQS中的ReentrantLock、ReentrantReadWriteLock、StampedLock与Condition

冰河

Java 并发编程 多线程 高并发 异步编程

编写Java程序启动脚本最佳实践

WindFlying

API 编排的应用及痛点

全象云低代码

微服务 低代码 api 网关 API 编排

百度与赛诺菲签订许可协议,开启新一代mRNA药物和疫苗研发

百度大脑

人工智能 百度

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