让人感动的腾讯游戏DBA的开源梦----Monty中国行之腾讯交流

注:本文已获得周彦伟先生授权转发。


我在ACMUG上海站的活动上主持大会的时候,开场说:我们要特别感谢阿里和腾讯的DBA同行们,是他们对MySQL或者MariaDB卓越贡献,让Monty先生对中国的技术氛围和在开源数据库上的影响力刮目相看,同时我们的开源和奉献精神也让这位MySQL和MairaDB的创始人感动得一塌糊涂。


Monty中国行我们安排了两个重要的行程,分别是去深圳腾讯的内部交流和杭州阿里的集团范围内部的技术大会,在阿里的大会多达上千人的报名。在腾讯,我有幸参与了Monty跟腾讯游戏DBA团队的小范围内部交流,参与交流的还有来自阿里云的著名数据库源码专家彭立勋,腾讯游戏DBA团队负责人RobinCui,FelixLiang和他们的小伙伴们以及微信金融运维的负责人DenielCheng。腾讯游戏DBA团队打算把他们这么多年积累的对MySQL的源码的改进,修复的补丁,以及自己实现一些其他特有的功能全部开源给MariaDB,并请Monty现场逐个审核。


是的!你没看错,他们要开源自己所有的成果。这里是腾讯。

按照Felix现场发言的说法:

    我们这多年来一直在使用MySQL和开源软件,

    我们通过MySQL及其他开源软件挣钱,也助力腾讯游戏业务取得成功,

    我们有一个梦,我们可以加入到开源中来,

    我们期待能为开源数据库做出自己的贡献。

同时,Robin还表示,他们还愿意为捐赠MariaDB做出努力。


在这次交流中,由负责源码开发的陈福荣同学负责主讲,他首先介绍了Tencent Game的特点,当然,实例数,数据量,机器数都多得吓吓吓人。


这种的环境下,他们为满足业务的需要,调研了很多种MySQL运维方案,其中最重要的有三种:

  • Galera Gluster:这是我这几年一直在推广的方案,没想到腾讯的兄弟们也在看,他们最终没有选择这个方案。不过,这次交流之后,在我的游说下,他们也表示需要继续跟进。

  • Proxy:他们也有打算写一个自己的proxy,并在这个方向上研究了很多很多。

  • Spider:他们最终选择了基于MySQL插件式引擎的spider,并在此上花了巨大的精力,很巧合的是,Monty本人也在研究Spider,并对此相当的精通。


腾讯自己维护了一个Spider的分支版本TSpider,现在已经发展到第9个版本了,在功能上也做了非常大的扩展。


优化一:对Auto-increment的改进。通过在spider的每个分片上加入step,来保证每个分片的自增id都是唯一的。



优化二:对复杂查询SQL的拆分,会根据SQL直接在每个分片中查询全部条件,减小查询次数和数据merge的压力



优化三:对limit n,m分页的优化,TSpider里面会先计算每个分片的数据范围,然后动态的去确定需要取哪些数据,而不是传统的都取一次,然后合并,消重。


优化四:性能优化

    对链接池的优化,可以通过 spider max_connections指定链接池的大小,按需分配内存,LRU的算法回收链接,等等。


    对并行查询的优化,在多分片上的查询性能提升4-12倍。


    动态开启事务的功能,他们通过修改源代码,实现了可以可以在执行的session级别,主动的动态去打开或者关闭事务支持,性能提升30%。当然在这点上,Monty说他有更牛的实现方法,在新版的MariaDB里面,可以语句级别的实现这个功能,更方便,更高效。


优化五:对于 insert on duplicate key update这样的语句,现有的MySQL版本可能存在bug,导致执行结果不对,腾讯的兄弟们对此作了修定。

另外,还有大篇幅的介绍TSpider上的补丁的修复和运维的经验以及周边工具的总结,这里就不详细介绍了。


还有个重要的部分是Tencent TMySQL的介绍,TMySQL 是他们自己维护的一个MySQL版本,在过去的几年里,腾讯在这个上面做了大量的工作,开发很多新的功能。


功能一:在线快速添加字段。

通过引入新的row_format=gcs,实现了在线快速添加字段而不影响线上业务。这里有个细节是,通过在InnoDB 的数据文件的记录头里面添加Field Count(1-2bytes),记录每条记录的字段数,并在metadata中记录所有的字段信息,以实现在新增字段的时候,只修改metadata和新增数据,旧数据不变的功能。




功能二:大字段压缩

在innodb上,TMySQL实现了在Background针对blob、text等字段的压缩功能,并在字段定义的时候引入“compressed”定义,这样在插入数据的时候,有此定义的字段都会执行压缩算法。通过这个算法,可以把原来51GB的表压缩到7.3G。

当然,在这里,Monty也提出了在MariaDB新版本里面的动态定义字段的概念,他可以把对字段的定义的接口抛出来,使用者可以随意定义自己对字段的需求,这包括加密,压缩等等。MairaDB的这个功能基本覆盖了压缩。让我们一起期待。


功能三:binlog的压缩

为了解决大数据量的问题,腾讯根据现实的业务需求,做了binlog的压缩,添加了几种binlog events,可以做到42%-70%的压缩比。实现的伪代码如下:




功能四:IO Thread的限流

同样为了解决大数据量,以及运维DBA中普遍碰到的在start slave的时候,IO Thread可能流量过大的问题,通过修改IO Thread的代码,把流量峰值磨平。在这里Monty提了一个很尖锐的问题:你们是怎么实现限流的,在哪个层面做到的。最后我们一起把源代码搬出来,Monty一眼就看出来这个实现有点小问题:代码如下,你看出来了吗?大神用了一秒钟,试试看,你可以多久。



还有很多很多的功能,限于篇幅,不再介绍了。腾讯的兄弟们表示愿意把所有代码贡献给MariaDB,让我们一起期待在未来的版本中看到Tencent。


我觉得这事儿一定能实现。


另外,报告一下上篇调查的结果,截止到目前为止:

39%的朋友认为MariaDB新功能很多,值得尝试。

32%的朋友觉得还会坚持用MySQL。

28%的朋友觉得无所谓,二者可能都会尝试一下。


最后,同样的送上几张现场的照片,面对大神Monty,我们其实平时都是毕恭毕敬的,但在讨论问题的时候,也可以脸红脖子粗,这是技术人员的本性吧。






盐味只发自己写的,转载请征得本人同意,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值