A-A+

社区初鸣,梦想始兴 – 腾讯游戏DBA携手MariaDB开源起航

2017年05月31日 Default, TenDB, TenDBCluster 暂无评论

腾讯游戏DBA团队一直致力于为游戏提供稳定、高效的在线数据存取服务,这是我们团队的使命;我们根据腾讯游戏的业务需求,不断改进数据库和提升性能,提供高性能、可扩展、稳定可靠的数据库解决方案,目前有几个产品:

TenDB: 基于MySQL官方版本的一个分支,提升了单机数据库的性能,并增加业务所需的功能特性,如快速加字段等核心功能

TenDB Cluster: 基于TenDB及Spider引擎的分布式MySQL集群, 实现了性能(CPU/MEM/IO)的线性扩展, 并具备高可靠性

Tendis: 基于RocksDB及Twemproxy的Redis集群,提供高性能、可线性扩展、数据可落地硬盘的Cache集群服务

腾讯游戏DBA的开源梦

我们用了10多年的MySQL,从4.0.12版本开始进行MySQL的管理和维护工作,管理着成千上万的数据库服务器,我们逐步积累了丰富的MySQL运维经验技术和源码能力;

我们所有的DBA都通过维护和管理MySQL及其他开源软件挣钱,不过分地说,MySQL的官方版本、我们的定制单机MySQL版本(TenDB)和分布式MySQL版本(TenDB Cluster)一定程度帮助了腾讯游戏取得了较大的成功。

我们很想为MySQL社区做一点贡献。我们梦想着有一天,我们能与MySQL的开源社区共同成长。“We have a dream!”,这句话我们萦绕于心十年之久。

我们在工作中迷茫过,但换来的是更多的坚定。“自己有产出并被大量使用才是对开源社区最大的贡献和回馈”,我们的老板威哥(崔晓春)的这句话总会在关键时刻激励我们继续前行。正是基于此,我们十年一路走来,今天终于翻开了我们开源梦的新篇章。

为了梦想,知难而进

回馈开源社区,有很多种做法:

  1. 做MySQL的使用者,通过自己的线下测试和生产使用,反馈存在的问题和新的技术需求;
  2. 做MySQL技术的布道者,分享MySQL海量运营的技术及使用场景,让MySQL技术更加普及;
  3. 做MySQL开源的贡献者,向官方提交经过大量生产环境检验的新功能特性,并集成到官方新的release版本中;

经过十年历程,我们实现了第一条,在生产环境中有上万台MySQL,在使用过程中我们积累了丰富的经验,也根据业务需要定制了很多新的功能特性,并广泛使用。

近年来,我们积极参与包括中国MySQL用户组(ACMUG)和DTCC在内的各种技术大会,分享我们的经验技术,我们正在MySQL布道者的道路上不断前行。

现在,我们决定践行这萦绕于心的第三条。我们知道,做起来会很难,充满挑战。当然我们也认为它价值最大:从开源社区中来,再把我们的经验和成果回馈到社区去,让广大MySQL使用者和爱好者可以更加放心地使用我们的功能特性。

事实上,2012.12月我们已经在github上开源了TenDB1.1的版本代码,将InnoDB快速加字段这个核心功能对外开放。后期由于公司业务繁忙,并且github直接开放源代码这种方式需要很多时间及精力投入做运营,我们团队随后放弃了github的代码维护和社区运营,并且决定采用向官方提交功能特性的方式来回馈开源社区。

为了梦想,我们知难而进。

梦圆MariaDB

置身在MySQL的生态圈是所有DBA的人生幸事。因为我们的选择很多,不管是使用MySQL数据库,还是成为开源的Committer,当前有Oracle官方的MySQL分支,还有MySQL之父Monty创办的重要分支MariaDB,以及类似Percona这样优秀的第三方分支。只要有利于开源和社区发展,我们都愿意尝试。事实上,我们也做了很多。

2015年8月,我们将Replication的两个功能提交给MySQL的复制团队及MySQL邮件组,得到了MySQL官方团队的积极认可,他们甚至认为这是MySQL默认应该有的功能特性。但可惜的是,鉴于Oracle公司或流程或制度上过于严谨的考虑,这些功能迄今还未能落地,我们会尽力配合MySQL官方,期待梦想早日实现。

2016年7月,在中国MySQL用户组(ACMUG)主席周彦伟先生及MariaDB基金会成员彭立勋先生的支持下,我们有幸见到了MySQL和MariaDB的创始人Monty先生,他正在为他的新理想MariaDB而努力。我们花了一整个下午给他分享了腾讯游戏的业务场景及定制化的两个产品TenDBTenDB Cluster的设计和功能特性,同时Monty也给我们讲了MariaDB新版本的新特性,开发的里程碑以及MariaDB基金会的运作情况。

那天下午的场景基本是这样的:一个头发花白的老coder,认真聆听年轻人给他讲feature,说不清的地方,大家在白板上边写边画着交流,也会直接pc上拿出来代码来讨论,Monty会直接提出某一行代码的不足。如果你置身其中,你会感动么?!

最后我们表达了我们的希望:把TenDBTenDB Cluster的部分功能特性提交给MariaDB,集成到MariaDB的主干代码。Monty非常支持我们向MariaDB提交代码,也鼓励我们向开源社区贡献力量。

于是我们按照MariaDB的代码规范,在github上提交了我们的pull request,我们开始圆梦了。

MariaDB 10.2.3版本发布了!

迄今为止,我们在MariaDB里边提交了3个pull request,目前MariaDB 10.2.3版本已经合入了的两个功能特性:

上述红框内关于复制相关的两个功能,对应是github的两个pull request:
        1. Restrict the speed of reading binlog from Master:

https://github.com/MariaDB/server/pull/246
        2. Compressed binary log:

https://github.com/MariaDB/server/pull/247

此外,InnoDB的大字段透明压缩功能,MariaDB官方考虑使用存储引擎无关的实现,但在InnoDB的存储行格式方面将保持与TenDB兼容:
        3. Big column compressed(innodb):

https://github.com/MariaDB/server/pull/261

在此非常感谢帮我们review代码及给出改进建议的Sergey Vojtovich和Kristian Nielsen。

未来与MariaDB深入合作

1.将业界首创的TenDB快速加字段功能合入MariaDB的主干版本。

关于InnoDB快速加字段的功能特性,前期我们通过邮件及jira网站的Issue MDEV-11369 跟MariaDB的Marko Mäkelä进行了广泛的交流,并且在4月10日的MariaDB开发者大会上,我们与Marko及Monty进行了面对面深入的讨论:

最终双方确定MariaDB 10.3版本将集成TenDB快速加字段的功能实现,我们近期将给MariaDB提交pull request。

2.促进MariaDB发布Spider存储引擎的GA版本。

Spider引擎是日本数据库内核专家Kentoku SHIBA为解决DB扩展性问题而自主研发的分布式存储引擎,MariaDB10.0版本开始集成该引擎,但一直都是gamma版本。

腾讯游戏DBA团队以Spider3.1版本为基础,从2014年初开始深度定制和不断迭代出了TenDB Cluster,解决了原Spider引擎许多性能和稳定性问题,以及增加了诸如连接池、全局自增ID、并行查询、查询条件下推等功能特性,并且大量使用在腾讯游戏核心在线数据存取的场景。

当前我们跟kentoku紧密合作,将TenDB Cluster的连接池特性、force index下推等功能及几个bug fixed合并到了Spider3.3,后续Spider引擎将会以stable的稳定状态出现在MariaDB 10.3版本中。下图是kentoku在MariaDB M|17大会的分享:

关于Spider代码合入的详细功能请查看链接<The status of Tencent patches into Spider>

3.在中国大陆范围内广泛推广MariaDB,让更多的MySQL DBA了解和使用MariaDB,让更多的人为MariaDB贡献力量。

未来,腾讯游戏DBA团队将会持续努力向MariaDB社区贡献我们在游戏生产环境经过长时间检验过的Feature代码,期待这些代码和功能特性可以让更广大的MariaDB用户受益;同时,我们也将会积极地从MariaDB中吸取社区贡献的优秀特性为腾讯游戏使用;期望通过与MariaDB社区更加紧密合作,一起探索解决游戏业务核心数据库运营中遇到的更具挑战的问题。

关于捐赠MariaDB基金会

MariaDB基金会旨在为MariaDB项目、用户和开发者社区提供基础的架构支持,同时,交流数据库技术,包括标准的实现,和其他数据库之间的互操作性和桥梁建设。

早在2016年8月,腾讯游戏DBA团队就成为了MariaDB基金会的铜牌会员,这是首个国内赞助该基金会并成为会员的公司或团队。

那么我们为什么要做捐赠?

MySQL创始人,也是MariaDB基金会创始人Monty先生2016年7月来到腾讯交流时候,最后讲解了MariaDB的运作方式:MariaDB基金会是非营利组织,为了能够吸纳全世界范围贡献的优秀代码和功能特性,基金会需要雇用人力Review及审核社区贡献的代码,以保证新代码符合规范,同时也需要严谨的测试来保证新功能的稳定性,他期望各大公司在使用开源成果的同时,可以适当捐赠,以保证社区持续运营。我们深刻理解并认同Monty所讲,认同MariaDB基金会在MariaDB开源项目上的运作方式,我们快速以团队的名义进行了第一次捐赠,我们期望以微薄之力从行动上支持开源社区的发展。接下来我们还将进一步提升捐赠金额成为基金会的金牌会员,保持与MariaDB社区更紧密的合作。

FAQ

看完这篇文章,读者的内心可能还存在一些疑问,下面尝试列举了几个常见问题以及给出我们的思考,希望能对读者有所帮助。

1问:为什么要做源码定制?

答:腾讯自研及代理游戏大量使用MySQL社区版本作为底层存储软件,因为业务快速发展,生产环境在很多年前已有过万MySQL实例;MySQL作为开源软件,相比商业数据库产品,在部分功能特性上确实还存在不足;这些不足,也可以通过购买商业软件或通过购买商业服务来弥补,但这会带来巨额的每年过亿成本开销;所以,我们采用类似大多数大的互联网公司一样的策略,我们基于游戏场景,游戏业务需要进⾏功能定制,来解决业务长久以来的难题,同时,培养可以掌握开源数据库内核的人才,持续去解决腾讯游戏不断向前发展过程中所遇到的挑战及问题。

 

2问:为什么要做代码开源以及跟MariaDB合作?

答:最重要的,GPL协议本来就要求这样做的,不应该视而不见;我们希望自己微不足道的工作,可以通过参与到更大的社区,惠及更多人更多公司;同时,在资源有限的情况下,我们希望社区有新的大版本GA的时候,我们既可以及时收获来自于整个社区的贡献,也可以减少自己定制的功能在新的版本,做进一步Merge和迭代投入的时间以及人力。最近恰好有个新的国外游戏,交给腾讯运营时候,游戏开发商特别希望仍然使用MariaDB,我们预期因为跟MariaDB甚至MySQL官方的良好合作,未来我们不用纠结是否应该说服新的游戏去使用TenDB,因为我们看重的大多数的功能点,在TenDB,MariaDB,MySQL中会同时存在。

 

3问:为什么选择在存储引擎层来解决MySQL的扩展性问题?

答:互联网业务的快速发展需要存储层具备快速的、透明的扩缩容能力,所以这几年业界出现了很多NoSQL或NewSQL产品。然而,对游戏业务场景而言,我们看到了公司代理大量移动游戏,外部游戏开发公司、开发者仍然会选择使用MySQL协议的数据库。关系型数据库(以MySQL及MariaDB等为代表)的严谨性及稳定性,以及SQL协议灵活性,是游戏开发商存储技术选型的非常关注的因素。在MySQL存储引擎层实现透明分库分表和动态伸缩,代理游戏开发商几乎不需要修改一行代码就可以接入TenDB Cluster集群,满足了代理游戏尤其是移动游戏快速接入,以及上线后快速发展,快速扩缩容的需要。

 

4问:Ten系列产品在腾讯内部其他业务线的使用情况如何?

答:TenDB Cluster在覆盖了一大部分核心的移动游戏以后,我们在内部分享交流平台做了一些技术分享,恰好公司财付通的DBA也正在研究DB扩展性的方案,因而对TenDB Cluster产生了兴趣,随后他们便开始在读多写少的业务场景广泛使用。在2016年底ACMUG的技术分享上,腾讯网络媒体的DBA了解到了TenDB Cluster,他们评估之后发现这个分布式方案对于腾讯视频日志流水的场景非常合适,特别是TenDB Cluster透明扩缩容的特点能够在业务迅猛发展时使得DBA不再依赖开发同学进行水平或垂直的库表拆分,DBA对业务开发侧具备更好的支持能力了。

 

5问:很多项目做了一段时间就会“自然”消亡了,Ten系列产品的可持续性如何?

答:其实这个问题是公司内部其它业务线评估使用Ten系列产品的时候,提出来的问题。腾讯游戏DBA团队从2011年开始在内部维护着独立的MySQL分支,从TenDB1.0版本迭代到当前的2.x版本,实现完全兼容MySQL5.5和MySQL5.6;从2014年开始研发及运营TenDB Cluster,版本迭代从1.0到当前的1.9,我们一直持续根据业务需要进行功能定制或者修复原有的BUG。目前我们也正在努力将这两个存储产品的核心功能特性集成到MariaDB的主干分支。取名Ten意为Tenable,意为可持续发展的存储产品。

原创文章,转载请注明: 转载自腾讯游戏DBA团队

本文链接地址: 社区初鸣,梦想始兴 – 腾讯游戏DBA携手MariaDB开源起航

文章的脚注信息由WordPress的wp-posturl插件自动生成

标签:
Copyright © 腾讯游戏DBA团队 保留所有权利.  

用户登录

分享到: