腾讯云数据库内核揭秘 TXSQL Internals @2018

2018年10月13日ACMUG南京站,来自腾讯技术工程事业群TEG基础架构部数据库内核团队专家工程师王少华,做了主题为「TXSQL Internals@2018」的分享。

CDB作为腾讯规模最大的关系型数据库服务平台,为公司内部业务和腾讯云提供native MySQL服务。从最初重点支持社交、游戏等场景业务,到今天覆盖了游戏、移动互联网和金融等全场景业务,CDB在架构、基础管控平台和垂直行业服务等维度不断的演进和升华。

在CDB一次次业务和技术突破的背后,CDB的内核:Tencent MySQL(TXSQL)宛如威力巨大的核弹头,击溃来犯的性能、功能和稳定性等各种高难度挑战。

本次分享将围绕性能优化、企业级特性和线上稳定性等多个维度,结合云上数据库特征和应用案例,和您一起来探讨TXSQL如何支撑全场景业务。

王少华 ACUMG主席团成员,腾讯专家工程师,负责腾讯云数据库内核TXSQL技术架构与核心开发。华中科技大学数据库所研究生毕业,先后在达梦,Teradata,Oracle等公司从事数据库内核研发,专注于数据库10+年。其中在Oracle MySQL全球研发团队工作4+年,为InnoDB核心成员。

一、TXSQL的介绍 

腾讯云是中国领先的云服务提供商,QQ和微信两大即时通讯工具都是腾讯云的客户,腾讯云为QQ和微信提供计算,存储,数据库以及安全等等服务。目前,腾讯云被来自各行各行业的超过1百万开发者所信赖。

CDB是Cloud Database的简称,是腾讯云上提供的关系数据库服务。CDB提供了关系数据库服务,实现了全平台管控和用户0运维,提供了良好的应用兼容性,以及对多数据库存储引擎的支持。

目前,CDB在腾讯云和公司内部广泛使用,已经成为国内TOP的MySQL集群服务。

在腾讯云上,主要服务于游戏、互联网和金融等数以万计的外部企业客户;在公司内部,CDB对SNG、CDG、OMG和IEG等很多内部业务场景进行了支撑。

CDB是整个数据库云服务的平台,而TXSQL则是这个平台里的数据库内核,提供数据库引擎和复制这两个核心功能。TXSQL是TengXun MySQL的简称,也叫Tecent MySQL,是由TEG基础架构部维护的MySQL分支。

TXSQL是基于ORACLE官方的MySQL内核版本进行深度定制。在可用性,性能优化,企业级特性等等方面进行了很大的改进和提升。

二、TXSQL可用性

异步删除表

在运维过程中,当用户删除一个大表时,如果文件特别大,比如2G。在删除这个大文件的过程中,文件系统IO达到峰值,持续1-2秒,这样会导致文件系统无法响应其他数据库实例的IO请求,对上层应用表现为数据库无发响应。在有些业务中,如果有2秒数据库没有响应,就是很严重的事故。为了让删除大文件的IO更平滑,我们实现了这个异步删除表的功能。

基本原理如下:

1. 删除文件时,将数据文件重命名为一个临时文件;

2. 后台每隔一段时间,将文件截断固定的大小,如128M;

3. 当文件足够小的时候,删除之。

修改表结构DDL的NO_WAIT和WAIT选项

在运维中,经常需要在线修改表的结构。这个操作有时会因为一些增删改查操作占用Metadata Lock(MDL)锁的时间较长而被阻塞。为了避免这种情况,我们在修改表结构的DDL语句中增加了NO_WAIT和WAIT选项。当使用NO_WAIT选项时,如果DDL语句无法立刻获取到MDL锁,则返回失败;当使用WAIT [n] 选项时,如果DDL语句在等待MDL锁n秒后依然无法获得锁,则返回失败。

目前支持的DDL语句如下:

ALTER TABLE DROP TABLE TRUNCATE TABLE OPTIMIZE TABLE RENAME TABBLE CREATE INDEX CREATE FULLTEXT INDEX CREATE SPATITAL INDEX DROP INDEX

Information schema中metadata lock信息视图

MySQL中通过information schema或者performance schema可以获取到很多系统内部的监控和状态信息。可是无法获得metadata lock的信息,导致运维过程中进行系统诊断非常不便。有了该视图之后,就很方便的了解到MDL锁相关的占用和等待等信息。

三、TXSQL优化特性 

下面讲从复制,优化器和存储引擎三个方面来讲一下TXSQL所做的优化特性。

复制优化主要有三条:

1. Slave中锁拆分

2. Slave中IO优化

3. 并行复制

Slave锁拆分

Slave中有一个mutex叫Lock_log,是用来同步SQL线程和IO线程对binlog文件的访问。在图中蓝线可以看到,随着系统压力变大,SQL线程的吞吐量直线降低(注:用更新行衡量),导致主从延迟逐渐拉大。主要原因是Lock_log被IO thread的占用量变大。

实际上,SQL线程和IO线程只有在访问同一个binlog文件,而且文件偏移重叠的情况下才会有冲突。因此在大多数情况下,两个线程不冲突。为了解决这问题,我们对Lock_log mutex进行了拆分。如图橙线可以看到SQL 线程的吞吐量非常稳定。

Slave IO优化

通常IO线程在收到一个event之后,会写入到binlog,并sync到磁盘中。由于sync操作代价很高,所以IO线程的吞吐量很容易到瓶颈(如图蓝线所示)。为了减小sync的次数,我们对event进行缓存,当收到一个事务(transaction)的所有event之后,一并写入binlog,再sync到磁盘中。

如图橙线所示,吞吐量得到了很大的提升(>50%)。

并行复制

在MySQL 5.6的版本中,首次引入了并行复制功能。系统架构是由SQL线程来进行binlog的解析以及任务的分发和同步,多个工作线程来执行任务。SQL线程是基于库(database)来进行分发的,也就是说不同数据库的事务是并发执行的。

但是在线上环境中,很多用户往往只有一个库,按库的并行复制和单线程复制效果一样。因此,我们开发了按表(table)的分发算法,即不同表的事务由不同的工作线程来执行。在我们的性能测试中,按表的测试效果和按logic clock不相上下。

查询优化

在应用中,分页操作以及聚集操作如sum,count是非常常见的。可是在大数据量的条件下,这些查询效率不够高,或者有时候非常差。为了解决这个问题,我们将这些操作下推到存储引擎执行,极大地提高了查询执行效率。

原因有两个:

其一避免了server层和存储引擎层的过多的交互和函数调用;

其二避免了行数据格式在server层和存储引擎层的转换。

InnoDB存储引擎的read view优化

我们对事务系统做了深度的优化,包括mutex,read view等方面,并且取得了不错的效果。如图中蓝线所示,随着并发的增大,写性能一直很稳定。

经过优化后,橙线所示,写性能得到大幅提升,达2倍之多。

四、TXSQL企业特性

TXSQL审计功能

审计功能是一个很重要的企业级特性,在线上用户也有强烈的需求。而MySQL社区版本不提供审计功能,只提供了审计插件的接口。因为我们在TXSQL中开发了独立的审计插件。

在审计插件中,审计记录首先写入缓冲区中,由一个flush线程负责将缓冲区中的记录写到磁盘的审计文件里。在一台物理机上,有一个审计代理,负责将审计文件中的记录读取并发送到后台存储,后台存储则是CTSDB集群。CTSDB是腾讯云上提供的时序数据库服务,拥有强大的查询性能和压缩功能。

在当前架构下,审计功能开启后对性能的影响能低至5%。

TXSQL加密功能

MySQL社区版本提供透明加密功能(Transparent Data Encryption),密钥在keyring里面。目前只提供keyring_file插件,即密码保存在本地文件中,而且是明文。商业版本中则提供keyring_okv插件,与Oracle Key Vault工具进行了深度集成。

TXSQL与腾讯云平台的KMS和CAM进行集成,开发了keyring_kms插件。密钥在腾讯提供的密钥管理服务中保护,安全可靠。

五、TXSQL客户应用案例:

TXSQL在内部为微信、QQ提供服务,在外部被游戏、电商、物流、金融、智慧零售等各行各业广泛应用。

某游戏厂商

微信红包

更多数据库前沿技术可关注 我们公众号:腾讯云数据库CDB

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏腾讯大数据的专栏

数据库schema设计与优化

1、 前言 对于数据库而言,在日常开发中我们主要的关注点有两块,一个是schema的结构设计,另一个就是索引的优化,这两块是影响我们最终系统结构和性能的关键部分...

24550
来自专栏一名叫大蕉的程序员

慢SQL,压垮团队的最后一根稻草No.92

先说结论,我支持将逻辑写在 Java 等应用系统中。 背景:今天只讨论一种应用模式,就是最普遍的,前端实时调用后端web服务,服务端经过DB的增删改查作出响应的...

49060
来自专栏北京马哥教育

10年 Windows 与 Linux 程序员的区别

如果一个程序员从来没有在Linux、Unix下开发过程序,一直在Windows下面开发程序,同样是工作10年,大部分情况下与在Linux、unix下面开发10年...

20700
来自专栏数据和云

深入剖析:not exists对外层查询的影响

何剑敏 Oracle ACS华南区售后团队,首席技术工程师。供职于Oracle ACS华南区售后团队,首席技术工程师。多年从事第一线的数据库运维工作,有丰富项...

31650
来自专栏CSDN技术头条

盘点一下影响MySQL性能的因素

既然要优化数据库,我们就首先要知道,优化的是什么,或者说:什么因素影响了数据库的性能。

13840
来自专栏程序猿

从0学习MySQL系列(一)简介篇

概述 ---- 阅读本系列说明: 本系列的划分,旨在涵盖MySQL的大部分方面,旨在作为大纲,每篇文章都会有重点以及在开发中需要经常注意的地方...

36250
来自专栏MySQL实战分享

数据库评测报告第二期:MongoDB-3.2

看到MongoDB如此特性和优势,不免勾起了我们的好奇心。这一期的评测报告就着重针对MongoDB的读写性能的进行测试和分析,一起来揭秘一下如今MongoDB在...

81520
来自专栏编程札记

MongoDB替换MySQL?

早在上个世纪就有什么面向对象数据库等非关系型数据库扬言要替代关系型数据库,但是到现在,那些数据库都默默无闻,关系型数据库却依旧是应用最广泛的数据库,为什么?

54750
来自专栏杨建荣的学习笔记

一次数据变更的审核过程(r8笔记第95天)

今天正在做一个数据变更操作,突然一个开发的同学找到我,看起来比较着急的样子,说想让我做一个数据变更。 当然在这种时候,我正在做的数据变更操作已经被打断了...

27970
来自专栏MySQL

分库分表后如何部署上线?

不要惊讶,写这篇文章前,我特意去网上看了下分库分表的文章,很神奇的是,都在讲怎么进行分库分表,却不说分完以后,怎么部署上线的。这样在面试的时候就比较尴尬了。

32310

扫码关注云+社区

领取腾讯云代金券