腾讯数据库内核团队资深架构师:TXSQL Internals @2018

在ODF2018开源数据库论坛暨首届MariaDB中国用户者大会上,来自腾讯技术工程事业群TEG基础架构部数据库内核团队资深架构师王少华,做了主题为「TXSQL Internals@2018」的分享。

我们同步了嘉宾现场沙龙分享视频,请点击下方「腾讯技术课小程序」卡片即可查看:

同时附上整理好的演讲稿:

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

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

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

王少华,现为TEG基础架构部数据库内核团队资深架构师,负责TXSQL技术架构与核心开发。

2007年华中科技大学数据库所研究生毕业后,先后在达梦,Teradata,Oracle等公司从事数据库内核研发,专注于数据库10+年。其中在Oracle MySQL全球研发团队工作4+年,作为InnoDB核心成员,设计和开发了批量建立索引,数据缓冲区mutex分拆,全文索引插件支持,SKIP LOCKED/NO WAIT以及8.0中DDL的原子性等重要功能。

一、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企业级特性

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线程池功能吸收了其他开源社区如percona等的一些优点,并解决了其中一些痛点。比如在percona版本中存在的由于持有锁的低优先级事务饿死导致的死锁问题。

在调度算法上,如果持有锁的低优先级事务与高优先级事务可以获得同等的调度机会,从而避免死锁。

通过上图可以看到,在并发线程大于500时,开启线程池功能,性能更好更稳定。

五、TXSQL未来发展方向:

1. AI和查询的结合,开发更智能的查询优化器;

2. 分布式数据库;

3. 新硬件支持,尤其是非易逝性内存,如NVMe;

4. 存储和计算分离的结构。

原文发布于微信公众号 - 腾讯技术工程(Tencent_TEG)

原文发表时间:2018-09-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏逸鹏说道

03.SQLServer性能优化之---存储优化系列

汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 概 述:http://www.cnblogs....

2975
来自专栏更流畅、简洁的软件开发方式

【自然框架】 之 资源角色——列表过滤方案(思路篇)

名词解释 1、资源角色,我的理解就是资源过滤方案 + 角色。就是把资源过滤方案和角色结合在一起的东东。 2、资源:这里的资源指的是关系数据库里的记录。 3、资...

1965
来自专栏编程一生

架构师之路--搜索业务和技术介绍及容错机制

1262
来自专栏UML

什么是实体关系图(ERD)?

实体 - 关系(ER)图(也称为ERD或ER模型)是Peter最初在1976年提出的经典且流行的概念数据模型。它是系统内不同实体的视觉表示以及它们如何相互关联。...

3425
来自专栏美团技术团队

Leaf——美团点评分布式ID生成系统

背景 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识。如在美团点评的金融、支付、餐饮、酒店、猫眼电影等产品的系统中,数据日渐增长,对数据分库分表后需...

5984
来自专栏吉浦迅科技

NVIDIA Jetson开发压箱底的秘密都在这里,很多人还不知道(一)

经常有人在群里问我各种“小”问题: Jetson TX2 显存是多大? Jetson TX2 开发板的尺寸是多大?给我个孔位图纸 Jetson TX2 支持最...

7498
来自专栏沃趣科技

容器化RDS|计算存储分离架构下的 IO 优化

在基于 Kubernetes 和 Docker 构建的私有 RDS 中,普遍采用了计算存储分离架构。该架构优势明显, 但对于数据库类 Latency Sensi...

3274
来自专栏IT大咖说

容器化RDS|计算存储分离架构下的 IO 优化

摘要 在基于 Kubernetes 和 Docker 构建的私有 RDS 中,普遍采用了计算存储分离架构。该架构优势明显, 但对于数据库类 Latency Se...

3598
来自专栏idealclover的填坑日常

ubuntu 18.04 前期配置

啊这个显卡实在让我欲仙欲死...让ubuntu卡在开机logo的罪魁祸首...这个已经在上一期里说过啦

2921
来自专栏数据和云

深入解析:Row Movement 的原理和性能影响与关联

作者简介: ? 黄玮(Fuyuncat) 资深Oracle DBA,个人网站www.HelloDBA.com,致力于数据库底层技术的研究,其作品获得广大同行...

2853

扫码关注云+社区

领取腾讯云代金券