拥抱社区,放飞开源梦想
本文由腾讯游戏 DBA 团队撰写,并从原文翻译而来。
腾讯游戏 DBA 团队(简称 DBA 团队)多年来一直服务于游戏业务。DBA 团队的使命是为腾讯游戏提供稳定高效的在线存储服务。随着游戏业务存储需求的不断演变,我们不断扩展数据库功能并提升其性能。我们不遗余力地提供可靠、可伸缩且高性能的数据库解决方案。
我们目前维护着几款产品
- TenDB: DBA 团队维护的 MySQL 分支。它具有单机性能改进以及对游戏业务至关重要的核心功能,例如 InnoDB 的即时添加列(Instant Add Column)。
- TenDB Cluster: 一个基于 TenDB 和 Spider 存储引擎的 MySQL 集群解决方案。它可以在性能方面提供线性可伸缩性(CPU/MEM/IO)。其高可靠性已在众多热门腾讯游戏中得到验证。
- Tendis: 一个基于 RocksDB 和 Twemproxy 的 Redis 集群解决方案。它提供高性能、线性可伸缩且持久化的缓存服务。
DBA 团队的开源梦想
我们使用 MySQL 已经超过 10 年,可以追溯到 4.0.12 版本。现在我们维护着数万个 MySQL 实例。随着实例数量的增长,我们在 MySQL 数据库管理和维护方面积累了大量经验。此外,我们能够掌握并修改 MySQL 源代码。
我们团队的所有 DBA 都靠维护 MySQL 数据库及其他开源软件为生。官方的 MySQL 服务器,以及我们的 TenDB 和 TenDB Cluster,对腾讯游戏业务的巨大成功做出了不可忽视的贡献。
因此,我们真诚地希望为 MySQL 社区做出贡献。我们梦想着与 MySQL 社区一起发展壮大。“我们有一个梦想”!这个信念已经持续了十年。
在将这个梦想变为现实的过程中,如何回馈社区的困惑不时困扰着我们,但我们越来越坚定。“独特且大规模使用的创新是对开源社区的最佳贡献!” 我们高级经理崔晓春的这句话,澄清了我们的愿景,并鼓励我们追求梦想。受此启发,经过十年的探索,我们终于开启了开源梦想的崭新篇章。
追逐梦想,克服困难
有三种方法可以为开源社区做出贡献
- 作为 MySQL 用户:报告我们在测试和生产环境中发现的 bug,并反馈业务所需的新功能。
- 作为 MySQL 传播者(evangelists):分享大规模使用 MySQL 的技术,从而推广 MySQL 的普及。
- 作为 MySQL 贡献者:向官方 MySQL 团队提交已在大型产品环境中验证的新功能,并推动其进入即将发布的官方版本。
经过 10 年的参与,我们在生产环境中维护着数万个 MySQL 实例,积累了大量高效使用 MySQL 的经验。更进一步,我们甚至修改了 MySQL 源代码,并开发了业务急需且大规模使用的新功能。
近年来,我们积极参与技术大会,包括中国 MySQL 用户组 (ACMUG) 和 DTCC,分享我们的经验和技术。我们正在成为一名 MySQL 传播者。
现在我们已经准备好实践第三种方法。我们知道这可能极具挑战性,但也是最有价值的。我们将我们的经验和功能贡献回社区,让所有 MySQL 用户受益,就像过去 10 年我们从社区中受益一样。
事实上,早在 2012 年 12 月,我们在 Github 上开源了 TenDB1.1 中的 InnoDB 即时添加列(Instant Add Column)功能。但由于工作太忙,没有足够的时间,我们逐渐停止了在 Github 上维护代码和社区。我们决定将我们的功能提交给官方 MySQL 团队。
与 MariaDB 一起梦想成真
MySQL 生态系统中的 DBA 非常幸运。我们有很多选择,无论是作为 MySQL 用户还是提交者。目前,我们有甲骨文公司的官方 MySQL,Monty(Michael Widenius)的 MariaDB,以及 Percona Server 等第三方分支。只要整个社区能从我们的工作中受益,我们都乐于尝试。事实上,我们已经做出了许多努力。
在 2015 年 8 月,我们向 MySQL 复制团队和 MySQL 邮件列表提交了两个关于复制(Replication)的功能。官方 MySQL 团队给了我们积极的反馈,并将我们的功能视为缺失的默认功能。然而,由于多种因素,这些功能尚未合并到主分支。我们将尽最大努力与官方团队合作,实现我们的梦想。
在 2016 年 7 月,在中国 MySQL 用户组 (ACMUG) 主席周岩伟以及 MariaDB 基金会成员彭立勋的帮助下,我们有幸见到了 MySQL 和 MariaDB 的创建者 Monty。Monty 当时正在开发他的新项目 MariaDB。我们花了一整个下午向他解释腾讯游戏的业务场景,以及为游戏业务定制的数据库产品 TenDB 和 TenDB Cluster 的设计和核心功能。Monty 向我们展示了即将发布的
MariaDB 版本、开发里程碑,以及 MariaDB 基金会的运作方式。
那个下午的场景基本上是这样的:一位白发苍苍的程序员认真倾听几位年轻工程师解释设计和功能。当由于语言障碍出现歧义时,他们就转向白板,画一些图表进行说明。甚至,他们打开终端,直接讨论代码。Monty 会指出特定行代码的问题。如果你在场,难道不会被感动吗?
最后,我们表达了我们的愿望:将 TenDB 和 TenDB Cluster 的一些功能提交到 MariaDB 的主分支。Monty 对此表示支持,并鼓励我们为社区做出贡献。之后,我们遵循了 MariaDB 的代码规范,并向 MariaDB 在 Github 上的仓库提交了 pull request。我们的梦想开始实现。
MariaDB 10.2.3 发布!
到目前为止,我们已经向 MariaDB 提交了三个 pull request。MariaDB 10.2.3 已经合并了其中的两个:(上图突出显示)
- 限制从 Master 读取 binlog 的速度
https://github.com/MariaDB/server/pull/246 - 压缩二进制日志
https://github.com/MariaDB/server/pull/247
此外,至于 InnoDB blob 数据的透明压缩,MariaDB 正在考虑一种与存储引擎无关的实现方式,同时保持 InnoDB 行格式与 TenDB 兼容。 - 大列压缩(innodb)
https://github.com/MariaDB/server/pull/261
非常感谢 Sergey Vojtovich 和 Kristian Nielsen 对我们的代码进行评审并提供改进建议。
未来与 MariaDB 的进一步合作
1. 将 TenDB 的独特功能 InnoDB 即时添加列(Instant Add Column)合并到 MariaDB 主分支
关于 InnoDB 即时添加列(Instant Add Column)功能,我们通过邮件以及在 JIRA issue MDEV-11369 上与 MariaDB 的 Marko Mäkelä 进行了全面讨论。此外,我们在 2017 年 10 月的 MariaDB 开发者大会(非正式会议)上进行了面对面讨论。最终,双方同意 MariaDB 10.3 将集成 TenDB 的 InnoDB 即时添加列(Instant Add Column)功能。我们将很快向 MariaDB 提交 pull request。
2. 推动 MariaDB 发布 Spider 存储引擎的 GA 版本
Spider 存储引擎是由日本数据库专家 Kentoku Shiba 开发的一个分布式存储引擎,旨在解决 MySQL 的可伸缩性问题。它自 10.0 版本以来已集成到 MariaDB 中,但仍处于 gamma 阶段(非成熟阶段)。
在 2014 年初,腾讯游戏 DBA 团队从 Spider 3.1 开始开发了一个高度定制的版本,经过三年的迭代,演变为 TenDB Cluster。TenDB Cluster 解决了原始 Spider 中的许多性能和稳定性问题,并增加了连接池、全局自增 ID、并行查询、查询条件下推等功能。TenDB Cluster 已广泛应用于腾讯游戏的关键在线存储服务中。
目前我们正与 Kentoku 密切合作,将包括连接池和强制索引下推在内的一些功能以及一些 bug 修复集成到 Spider 3.3 中。未来,Spider 存储引擎将作为稳定版本包含在 MariaDB 10.3 中。Kentoku 在 MariaDB M|17 会议上分享,如下图所示:
参考 腾讯补丁合并到 Spider 的状态 查看已合并功能的详细信息。
3. 在中国大陆推广 MariaDB,帮助更多 MySQL DBA 了解和使用 MariaDB,并为 MariaDB 带来更多贡献者。
腾讯游戏 DBA 团队将继续努力,将已在游戏业务生产环境中得到广泛验证的功能源代码贡献给 MariaDB。我们期待更多 MariaDB 用户从这些代码和功能中受益。同时,我们将在生产环境中积极使用 MariaDB 社区的优秀功能。通过与 MariaDB 社区的密切合作,我们希望探索并解决核心数据库中遇到的挑战性问题
在游戏业务运营中的问题。
捐赠给 MariaDB 基金会
MariaDB 基金会的使命是为 MariaDB 项目、用户和开发者社区提供基础设施支持。同时,它增强数据库技术,包括标准实现以及与其他数据库的交互。
自 2016 年 8 月以来,腾讯游戏 DBA 团队一直是 MariaDB 基金会的铜牌赞助商(bronze sponsor)。我们是第一家赞助该基金会的中国组织。
为什么要捐赠给 MariaDB 基金会?
在 2016 年 7 月,当 MySQL & MariaDB 之父 Monty 访问腾讯时,他解释了 MariaDB 基金会的运作方式;MariaDB 基金会是一个非营利组织。为了吸引来自世界各地的优秀代码和功能,MariaDB 基金会需要雇佣工程师来评审社区的代码,确保它们遵循代码规范,并为这些代码编写严格的测试,以确保新功能足够稳定。Monty 希望从 MariaDB 开源社区中受益的公司向 MariaDB 基金会捐赠,以维持其运作。我们强烈认同 Monty 的想法和 MariaDB 基金会的使命,所以我们团队很快就进行了首次捐赠。在不久的将来,我们将增加捐赠金额,成为 MariaDB 基金会的黄金会员(gold member),以便与 MariaDB 社区更紧密地合作。
常见问题
读完整篇文章后,您可能仍然有些疑惑,为什么我们这样做。
问:为什么要基于 MySQL 开发定制版本?
答:腾讯开发或发行的游戏在存储层严重依赖 MySQL Community Server。几年前,我们在生产环境中的 MySQL 实例数量就已超过 1 万。在享受 MySQL 的简洁性和灵活性的同时,我们也清楚地知道,MySQL 的功能集不如一些商业数据库产品丰富。通常可以通过购买商业服务来克服这个缺点,但这每年将花费数百万美元。我们当然
不会这样做(购买商业服务)。相反,我们采用了许多其他大型互联网公司已经实践过的策略:维护一个定制版本,并开发能够解决游戏业务中普遍出现的问题的功能。我们可以从这个策略中受益匪浅。一方面,通过这些内部开发的功能,我们可以从根本上解决一些长期存在且对我们影响很大的问题;另一方面,我们可以培养能够掌握开源数据库内部原理的工程师,他们能够解决随着腾讯游戏业务发展不断出现的各种问题和挑战。
问:为什么要开源代码并与 MariaDB 合作?
答:有几个因素促使我们开源代码。首先,GPL 许可证强制要求,基于 GPL 许可的项目开发的代码也必须开源。其次,通过参与一个有影响力的社区,我们可以帮助更多人或公司从我们的工作中受益。除此之外,我们希望通过开源来解决维护定制版本的困难。由于资源限制,我们希望节省将社区的重要功能合并到我们分支的工作量,或者开发社区中已经存在的类似功能。如果我们的代码被社区合并,那么每当社区发布一个主要的 GA 版本时,我们就可以快速从整个社区的贡献中受益,并且不会丢失对我们业务很重要的独特功能。从长远来看,我们就不必解释 TenDB 是什么,也不需要说服游戏开发者使用 TenDB,而他们坚持使用 MariaDB 或官方 MySQL,因为它们几乎是同一个东西。
问:为什么选择在存储引擎层面解决 MySQL 的可伸缩性问题?
答:互联网业务的高速发展要求数据库层能够快速伸缩
快速伸缩,理想情况下,伸缩过程对应用是透明的。近年来出现了许多旨在满足此类需求的 NoSQL 或 NewSql 产品。然而,对于游戏业务而言,大多数开发者仍然选择兼容 MySQL 协议的数据库。RDBMS(如 MySQL 和 MariaDB)的严谨性和稳定性,以及 SQL 协议的灵活性,是游戏开发者在选择存储产品时特别关注的两个主要因素。在存储层实现数据分片使游戏开发者在使用 TenDB Cluster 时大多数情况下无需修改一行代码,这使得游戏能够非常快速地部署到生产环境,并且随着业务的高速发展,容量或性能可以快速扩展。
问:Ten 系列产品在腾讯游戏以外的其他业务中应用有多广泛?
答:在 TenDB Cluster 覆盖了大部分热门手游后,我们在一次公司内部技术活动中分享了使用 TenDB Cluster 的经验。财付通(腾讯在线支付业务)的 DBA 们表现出兴趣,因为他们当时正在研究 MySQL 的可伸缩性解决方案。很快,他们在许多读多写少的生产环境中部署了 TenDB Cluster。除了财付通,腾讯在线媒体业务也是 TenDB Cluster 的重度用户。在 2016 年末的 ACMUG 活动中,他们了解了 TenDB Cluster。经过全面评估,他们发现 TenDB Cluster 非常适合腾讯视频(腾讯的在线流媒体视频业务)的日志存储,特别是 TenDB Cluster 使 DBA 能够采用对应用透明的分片解决方案,这彻底将数据库伸缩与应用程序代码分离。这种透明性使得 DBA 能够在业务爆发式发展时独立扩展数据库并提供更具响应性的服务。
问:Ten 系列产品会长期积极维护吗?
答:当 Ten 系列产品被考虑作为
腾讯内部其他业务线的候选解决方案时,这是一个重要的问题。在 2011 年 12 月,腾讯游戏 DBA 团队开始维护一个独立的内部 MySQL 分支,即 TenDB 1.0。我们将 TenDB 1.0 迭代到今天的 2.x。目前,TenDB 完全兼容 MySQL 5.5 和 MySQL 5.6。至于 TenDB Cluster,其开发和运营可以追溯到 2014 年。我们将 TenDB Cluster 从 1.0 迭代到今天的 1.9,并持续开发业务所需的新功能和修复 bug。现在我们正在努力将这两款产品的核心功能推送到 MariaDB 主分支。我们将产品命名为“Ten”,源自 Tenable,意为可持续的存储产品。