绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
腾讯黑科技:删大表不抖动,自动补充虚拟隐藏主键
2020-01-02 13:32:58

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内核。


分享好友

分享这个小栈给你的朋友们,一起进步吧。

腾讯云数据库
创建时间:2019-12-03 15:25:28
本栈主要分享云数据库技术前沿资讯、实战案例、数据库产品功能、应用场景和行业应用解读,帮助您根据实际业务需求进行数据库选型,更好的运维管理数据库。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • 腾讯云数据库
    栈主

小栈成员

查看更多
  • 栈栈
  • 小尾巴鱼
  • youou
  • ?
戳我,来吐槽~