涨知识!腾讯云数据库内核揭秘TXSQL Internals@2018
Posted 云加社区
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了涨知识!腾讯云数据库内核揭秘TXSQL Internals@2018相关的知识,希望对你有一定的参考价值。
2018年10月13日ACMUG南京站,来自腾讯技术工程事业群TEG基础架构部数据库内核团队专家工程师王少华,做了主题为「TXSQL Internals@2018」的分享。
CDB作为腾讯规模最大的关系型数据库服务平台,为公司内部业务和腾讯云提供native mysql服务。从最初重点支持社交、游戏等场景业务,到今天覆盖了游戏、移动互联网和金融等全场景业务,CDB在架构、基础管控平台和垂直行业服务等维度不断的演进和升华。
在CDB一次次业务和技术突破的背后,CDB的内核:Tencent MySQL(TXSQL)宛如威力巨大的核弹头,击溃来犯的性能、功能和稳定性等各种高难度挑战。
本次分享将围绕性能优化、企业级特性和线上稳定性等多个维度,结合云上数据库特征和应用案例,和您一起来探讨TXSQL如何支撑全场景业务。
腾讯云是中国领先的云服务提供商,QQ和微信两大即时通讯工具都是腾讯云的客户,腾讯云为QQ和微信提供计算,存储,数据库以及安全等等服务。目前,腾讯云被来自各行各行业的超过一百万开发者所信赖。
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内核版本进行深度定制。在可用性,性能优化,企业级特性等等方面进行了很大的改进和提升。
异步删除表
在运维过程中,当用户删除一个大表时,如果文件特别大,比如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所做的优化特性。
复制优化主要有三条:
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审计功能
审计功能是一个很重要的企业级特性,在线上用户也有强烈的需求。而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在内部为微信、QQ提供服务,在外部被游戏、电商、物流、金融、智慧零售等各行各业广泛应用。
某游戏厂商
微信红包
作者介绍:王少华 ACUMG主席团成员,腾讯专家工程师,负责腾讯云数据库内核TXSQL技术架构与核心开发。华中科技大学数据库所研究生毕业,先后在达梦,Teradata,Oracle等公司从事数据库内核研发,专注于数据库10+年。其中在Oracle MySQL全球研发团队工作4+年,为InnoDB核心成员。
推荐阅读:
关注云加社区,回复 3 加读者群
点击阅读原文,获取更多技术干货!
以上是关于涨知识!腾讯云数据库内核揭秘TXSQL Internals@2018的主要内容,如果未能解决你的问题,请参考以下文章