2019年9月,腾讯云数据库正式按地域发布TXSQL 5.7-201908版本,该版本主要实现写性能提升,新增功能特性和内核参数,为MySQL提供更稳定、高效的性能和服务能力。其中,新增特性包括DROP大表操作异步化、GTID复制功能扩展、隐藏主键功能、非 Super 权限用户 Kill 链接的功能等。另外,在新的TXSQL内核版本中,可以通过内核参数来指定事务调度算法。下面将为大家详细解读。
TXSQL的演进之路
相信大家对腾讯云数据库TencentDB for MySQL已不陌生, TXSQL是腾讯数据库内核团队独立维护的MySQL 分支,对外通过TencentDB for MySQL服务提供给客户。TXSQL是内核,也是底层提供数据服务的位置,毫不夸张的说,TXSQL是TencentDB for MySQL服务平台的核心引擎,地位堪比威力巨大的核弹头。
TXSQL 自2015年5月份正式立项以来,在近5年的时间里对 MySQL 的读写性能、强同步、大并发量访问和稳定性等方面做了大量改进工作,读写性能在并发上升到一定程度时具有成倍的性能提升,同时在 TXSQL 的版本发展过程中修复了多个影响线上稳定性的 bug(如 redo 死锁,实例异常关闭、字符集引起的主备异常等),在保证了内核稳定的同时,对TencentDB for MySQL的稳定性提供了有力的保障。
TXSQL内核发布过的经典特性有以下:
1. 性能改进特性:
Redo log group commit (组提交)
Redo log 双缓冲区
Read view 活跃事务集合 调度的深度优化
并行复制优化等
2. 打造企业级特性
TXSQL审计
TXSQL线程池
TXSQL新版本大揭秘
TXSQL5.7_ 201908版以 MySQL 5.7.18 为基准版本进行 5.7 版本的内核开发与支持,新增功能特性如下:
1. DROP大表操作异步化
在日常运维过程中,当删除一个大表时(如一个20G的ibd文件的大表),在删除这个大文件的过程中,文件系统IO达到峰值,持续好几秒,这样会导致文件系统无法响应其他数据库实例的IO请求,对上层应用表现为数据库无法响应。
在有些业务中,如果有好几秒数据库没有响应,就是很严重的事故。为了让删除大文件的IO更平滑,TXSQL内核实现了异步删除表的功能。
实现原理如下:
1)将ibd文件名重命名为临时文件名
2)在后台线程中逐步truncate .ibd文件(固定截断,每次128M)
3)当文件size足够小的时候,终将.ibd文件删除
4)新内核TXSQL_5.7_201908版本中drop大表异步化相关参数已支持动态设置, 无须重启实例
具体使用:
1)设置异步删除大表的配置路径参数
2)设置打开异步删除大表控制参数
2. GTID复制功能扩展
官方MySQL 5.7的GTID复制并不支持CTAS(Create Table AS Select XXX)这样的语句,在GTID环境下执行CTAS会遇到1786错误:
ERROR 1786 (HY000):Statement violates GTID consistency: CREATE TABLE ... SELECT.
这种情况下,对于业务逻辑中有使用定期复制数据创建表或创建临时表的场景,就不太友好了。
TXSQL在新版本中改进了这点,支持gtid模式下复制支持create as select,create/drop temporary table, 同时能更新事务表和非事务表等语句。
开启这个内核特性也很简单,把TXSQL的相关参数开关设置为on即可开启。
TXSQL内核GTID复制扩展功能适用场景:
1)CTAS操作频繁场景,无法优化CTAS 为 先建空表,再Insert的业务场景
2)大量使用临时表场景。
3)更新MyISAM表场景 无法使用GTID问题。
4)内核层级新增参数来控制开关。
3. 隐藏主键功能
很多TencentDB for MySQL客户在设计之初遗漏了给表建立主键,当数据量增长到一定程度后,无主键表会导致很多性能问题:
影响大的就是主从复制问题,InnoDB引擎表在无主键情况下(同时binlog为row模式),主从延迟的风险会无限放大,导致主从数据不一致,对客户的业务造成困扰。
TXSQL针对这个场景,对于没有主键的表,会自动增加一个虚拟隐藏列主键。
具体功能说明如下:
目标用户表指:没有主键(primary key),且没用索引(unique 可以),且没有自增列和对应索引(auto increment column/index),该功能围绕以上表进行
分区表不支持上述特性,分区表的无主键分区行为和以前保持一致
只支持innodb存储引擎
之所以叫隐藏主键,是因为TXSQL还可通过内核新增参数来控制是否隐藏系统添加的隐藏列,默认为OFF,表示隐藏,不给show出隐藏列。另外一个参数为是否打开隐藏主键功能参数,默认为ON,表示打开。
隐藏主键的功能好处不用多说,但是底层确实增加了字段,如何来确保用户的业务访问逻辑不受这个新增字段的影响呢?
TXSQL在create,insert,select,show,alter 等语句均作出了适配,对于无主键表,如果已经添加了隐藏列,都对普通用户保持透明。
其中alter table语句更做了很多细节上的优化:
如果对于目标表,用户添加了用户自定义的主键或者索引,或者自增列,则在alter的时候,drop掉原有的系统添加的隐藏列和索引;
评估alter table之后的结果(主要是drop column或者drop index);
如果drop 之后没有主键或者索引或者自增列,添加一个隐藏列;
如果参数开关关闭之后,对于新增过隐藏列的表进行alter操作,drop掉隐藏列和相关索引。
这些细节的把控也体现了TXSQL内核团队的功力。
无主键表开启隐藏主键功能后,还是会有功能代价,每一行数据将会多存一个8字节的隐藏列,额外存储空间 = 8bytes * row,例如一千万行数据,理论上需要额外80MB的存储空间,以及对应二级索引的存储空间。
当然,这里并不建议大家在使用TencentDB for MySQL的时候,都不用去创建主键了,primary key在设计的时候仍然是必须的,毕竟InnoDB引擎表本身就是聚集索引表结构,性能上很依赖主键。
TXSQL的隐藏主键是作为一个兜底的方案,在大家不小心遗漏的时候,继续为TencentDB for MySQL 保驾护航。
4. 非 Super 权限用户 Kill 链接的功能
之前的TencentDB for MySQL版本中,出于安全考虑,产品控制台一直没有开放授权Super权限给用户,这导致了没有Super权限,即使是root帐号也无法KILL掉其他用户的连接,这给运维管理上带来了很大的不便。
TXSQL 5.7-201908版本中,改进了这个问题。可以通过设置内核参数为'test22@10.0.0.100',则用户 test22在指定 IP(10.0.0.100)的机器上可以 Kill其它用户的链接,“%”所有 IP,即允许非 Super 用户拥有 Kill Process 的权限。
5. 其他优化特性
除了上述几个大的内核功能点,TXSQL 5.7-201908版本还进行了很多特性优化,比如:
1)内核级别允许MySQL5.7版本的gtid与MySQL5.7版本的非gtid 建立主从关系,非gtid5.7事务同步到gtid 5.7实例上生成匿名事务,这个特性目前限于DTS迁移过程中使用,大大方便自建环境迁移上云。
2)添加以资源为优先级的锁调度方式
添加CATS(Contention-Aware Transaction Scheduling)锁调度方式,提升并发更新性能。
CATS算法的详细介绍可参考此链接:https://mysqlserverteam.com/contention-aware-transaction-scheduling-arriving-in-innodb-to-boost-performance/
在新的TXSQL内核版本中,可以通过内核参数来指定事务调度算法。
其中,算法有三种:
auto:自动,根据当前系统状况自动调整。当锁等待线程数超过32个时采用CATS调度算法,否则采用FCFS算法。
fcfs:先来先服务算法。
cats: 冲突感知调度算法。
FCFS与CATS的性能测试数据:
可以发现,CATS 算法在数据量增加到一定程度后,高并发更新能力大于官方默认的FCFS算法。
TXSQL的未来发展
TXSQL的研发和迭代脚步一直稳健且高效,是因为TXSQL的背后有一个强大的数据库专家内核团队。
TXSQL 内核团队全方面负责TencentDB For MySQL的内核研发和运维工作,包括数据库性能调优;对内核进行深度改造,满足应用需要的性能要求,在活动促销时需要保证数据库的平稳;提供业务需要的各种功能需求;实现资源管理需要内核支持的功能;MySQL DBA在运维过程中需要的诊断相关的功能;MySQL在运行过程中存在的问题定位并修复影响系统运行的 Kernel Bug;保证数据库系统的安全,保证云上用户数据的安全等。
腾讯TXSQL内核专家团队成员简介:
张青林 腾讯云专家工程师,腾讯数据库内核团队负责人
王少华 腾讯云专家工程师,ACUMG主席团成员
赖铮 腾讯云专家工程师,腾讯数据库团队架构师
正是有了这批专家们的存在,TXSQL才能成为一颗宛如威力巨大的核弹头,轻松应对TencentDB For MySQL遇到的性能、功能和稳定性等各种高难度挑战。
在腾讯云数据库刚步入商业化的自研云原生数据库CynosDB For MySQL中,也使用TXSQL作为内核来支撑这款集成了这款云原生、存储与计算分离的新兴数据库。
在未来的发展过程中, TXSQL仍然会以用户需求为导向,在保持稳定性、性能调优和功能实现的基础上,从智能化、分布式、新硬件、存储计算分离等方面不断的进行改进和迭代,打造的MySQL内核。