在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更平滑,我们实现了这个异步删除表的功能。
基本原理如下:
-
删除文件时,将数据文件重命名为一个临时文件;
-
后台每隔一段时间,将文件截断固定的大小,如128M;
-
当文件足够小的时候,删除之。
修改表结构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所做的优化特性。
复制优化主要有三条:
-
Slave中锁拆分
-
Slave中IO优化
-
并行复制
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未来发展方向:
-
AI和查询的结合,开发更智能的查询优化器;
-
分布式数据库;
-
新硬件支持,尤其是非易逝性内存,如NVMe;
-
存储和计算分离的结构。