TcaplusDB 10周年 风雨兼程破浪行 自研存储见成长

Easter79
• 阅读 603

从找不到需求险些被叫停,到支撑亿级DAU的数据库行业标杆,腾讯云数据库TcaplusDB在风雨中走过了整整10年。辉映日月破风浪,十年一剑破九天。百万行代码就像淙淙流淌的数据溪流,终于在十年后汇成不可逾越的护城河。

出发

2010年前后,QQ空间很火,带动了基于SNS互动页游(WebSNS)的火爆,腾讯内部开始考虑怎么做页游。也开始建设页游基础技术体系,其中最重要的产出是研发自己的分布式数据库TcaplusDB。与MMOG游戏不同,通常WebSNS游戏是全区全服的,数据集中存储;而其游戏逻辑服务器是对等的,web客户端通过短连接与服务器进行通信,也就是说玩家游戏过程,后端交互的逻辑服务器随时会变动;这些特性导致在逻辑层不方便对用户数据做缓存。 此外,WebSNS游戏基于玩家之间社会关系的互动场景非常多,玩家的一个互动操作,需要读取和修改与此关联的其他多个玩家的数据;这意味着web游戏中数据读写访问频率高于同时在线数,其访问频率实际上是在线数的N倍;假如某个100万在线的web游戏,平均每个玩家有50个好友,如果同时有1%的玩家触发一个好友动作,则可能会触发50万次数据访问。也就是说,基于这样的场景,web游戏的数据库层需要支持比传统MMOG游戏大的多的访问频率,如果仍然采用传统的数据库管理系统(如MySQL),要支持这么大的访问频率,其代价非常大。 因此,在游戏逻辑层和传统数据库管理系统之间架设高速的缓存系统,对web游戏来说至关重要。 当时业界已经有比较多的提供高速数据访问的NoSQL产品,不可否认,这些NoSQL产品在一定场景下使用是很优秀的,但在部分场景或需求下存在不支持或不够出色的情况——比如全内存带来的成本问题或对异步数据读写支持不够等。 2011年起,腾讯内部开始着手研发一款自己的分布式游戏数据库系统——TcaplusDB。这是个很美好的愿景。但从零开始自己研发一款数据库又谈何容易?2009 年开始,大量新的NoSQL数据库涌现,在整个行业掀起了一场NoSQL 革命,如今赫赫有名的 Redis、MongoDB 皆诞生于那一年。研发TcaplusDB是高楼万丈平地起的事情,我们一边调研外部产品,一边抓住游戏行业特定的场景和需求,做最小化的产品验证。经过不断的验证,第一个版本在2012年初终于出炉。

时机

2012年4月,TcaplusDB首次正式提供服务,支持腾讯自研的页游《夜店之王》。《夜店之王》是腾讯自主研发的一款以时尚夜店为题材,以夜店经营为核心,融入吸血鬼元素的模拟经营类社交游戏。 TcaplusDB 10周年 风雨兼程破浪行 自研存储见成长

当时的游戏,大部分是“分区分服”的形式,每个区域内的玩家自己玩。但基于社交场景的WebSNS需要所有的好友在一起玩。《夜店之王》就是这样典型的场景,TcaplusDB的高性能和低成本赢得了项目组的青睐。由于采用了包括 TcaplusDB 数据库在内的新技术,《夜店之王》通过“全区全服”,让玩家在一个池子里“大乱斗”并通过实时派对邀请好友体验。《夜店之王》通过QQgame游戏大厅、空间、游戏人生、朋友等诸多渠道进入取得了相当不错的成绩。 发展过程中,挫折并不是没有,2013年9月腾讯移动游戏《天天酷跑》火爆公测,开启QQ、微信双平台登陆,随时与QQ、微信好友一起玩。上线后,在不到一天的时间内就迅速登上了苹果App Store畅销榜第一位。 TcaplusDB 10周年 风雨兼程破浪行 自研存储见成长

当初公测的时候,内部霸气地给《天天酷跑》这款新游戏配了100台服务器,对于一款新游戏,这显然是一个很充裕的配置。然而谁都没想到《天天酷跑》会这么火爆,准备的100台服务器很快就要高容量了。最后,在多部门的协同下,扩容的50台服务器快上架。硬件上架、网络打通、操作系统安装妥当,TcaplusDB的系统软件也很快部署完成。 但接下来就要通过部分数据的搬迁来实现数据库承载能力的扩容。按照正常逻辑,哪怕是停服维护,通常的扩容都有一个提前准备的过程,这次来得实在太快了,眼看旧数据库在逼近存储极限,那边不断涌入的玩家还在不断地制造新数据,搬迁的速度必须足够快,才能避免数据库爆仓。当时在业内深耕多年的大牛苦笑着说:“按照当前的情况,24小时后数据库就会崩溃,游戏只能暂时停服。” 谁都不敢面对这样的结局。 24小时很短,也能做很多事情,一个字,干! 于是,我们和当时酷跑的业务团队一起挺身而出,背水一战,连夜调试搬迁工具,在凌晨紧急上线,硬是抗住了一波又一波海量的用户访问冲击。有了这次的经历,我们下定决心,我们要做得更好。之后的几个月,我们都在重复一件事——一行一行地码代码,看得最多的是星夜、喝得最多的是咖啡,终于把这套数据库的自动扩容系统打磨得稳定高效。

成长

2014年2月,TcaplusDB已经深度优化了存储引擎,推出全托管的分布式存储服务。 但还不够,远远不够。 还记得上面说的《夜店之王》吗?经过2年多的发展,此时的《夜店之王》已经是排名第一的经营类社交游戏。而《夜店之王》使用的却还是TcaplusDB的老版本。TcaplusDB的全托管版本,性能得到了较大的提升,在服务上给项目组带来了较大的便利性。因此,将《夜店之王》TcaplusDB切换到全托管版本被提升日程。 TcaplusDB 10周年 风雨兼程破浪行 自研存储见成长

由于《夜店之王》是线上业务,且此次切换TcaplusDB不能停服,还得解决新老协议不同、落地数据格式不同、数据分布不同等问题。对于任何一个团队,都是一个很大的挑战。 最终,在跟《夜店之王》团队的联合攻坚之下,我们通过数据双写、增加协议转换层、数据一致性校验工具等工作。最终完美实施了服务的迁移,在这个时期积累的数据迁移方案,也为后续TcaplusDB在无损水平扩展、无损数据迁移能力的产品化打下了坚实的基础。

2015年年底《王者荣耀》正式公测。这款游戏的火爆程度又一次突破了大家的想象力,这个游戏就像一个永远不能满足的巨兽,势不可挡地吞噬着各种后台资源。在打破各种游戏记录的同时,这个逆天的游戏每一秒钟都在创造数据库的新纪录。最疯狂的游戏浪潮,一般出现在周末。回想那个时候,一到周末,我们就在家盯着电脑,看着各种数字疯狂飙升。前期的技术积累终于派上了用场,严阵以待的技术人也终究见证了历史。几千台服务器在预先设定好的统一调度机制下不停服自动扩容,完美扛过流量高峰。同年,TcaplusDB又相继推出故障自动恢复、不停服升级、不停服扩缩容功能,成功支持了《天天爱消除》、《全民飞机大战》、《全民突击》、《CF手游》和《火影忍者手游》等游戏。2016年,TcaplusDB陆续推出细粒度备份回档、软硬件升级、机房裁撤搬迁、软硬件故障对业务无损等核心能力。同时优化单业务海量数据访问能力,提供稳健高性能的数据存储服务。 2017年元宵晚会,在春晚小品《回家》中,主持人提到了《王者荣耀》,这让团队即紧张又兴奋。接着,又是一路不断飙升的QPS陪伴着我们度过一个不眠之夜,好在最后又是有惊无险。 同年,TcaplusDB支持protobuf数据格式定义及访问,协议更加开放,兼容行业使用习惯。 2018年,TcaplusDB将高可用、无损扩缩容做到极致,深度优化性能降低成本,提升Api多语言、多平台、多模式、易使用的能力,陆续为《QQ飞车》、《无限法则》等游戏提供高品质数据存储服务。

开放

2019年凭借多年的积累和在游戏分布式系统情景中适配能力,TcaplusDB做为腾讯完全自研的NoSQL数据库,正式成为腾讯云Tcaplus,通过腾讯云对外提供服务。结合了腾讯云的优势后,腾讯云Tcaplus又在多租户、安全性、开放API和多语言SDK等方面有了极大的提升。 2020年NEXON、上海盛趣等游戏厂商开始选择腾讯云TcaplusDB做为游戏的核心数据库支撑业务。根据客户的测试与使用反馈,TcaplusDB的毫秒级时延、千万级QPS、无限水平扩展无需分库分表、细粒度回档、合服和无损弹性变配等能力能够实实在在的帮助到游戏业务。 腾讯云TcaplusDB的核心能力得到了客户的认可的同时,不得不提一提我们强大的迁移服务。当时上海盛趣使用的是DynamoDB,上海盛趣的技术团队需要解决开发者不熟悉腾讯云TcaplusDB的用法和已有代码迁移的问题。通过沟通,腾讯云TcaplusDB的接口的易用性得到了客户的充分认可,重点转移到了已有代码如何迁移到腾讯云TcaplusDB 接口上。经过双方技术团队的沟通,上海盛趣的架构中有一个数据访问适配层,所有的数据库访问均通过该适配层,问题一下变得清晰和简单了起来。腾讯云派出技术专家驻场,仅仅用了两周时间就和上海盛趣的研发团队一起完成了代码迁移的工作。 至此,TcaplusDB开始全面为公有云客户提供服务。 TcaplusDB 10周年 风雨兼程破浪行 自研存储见成长

2020年12月14日,中国信息通信研究院官方权威公布第十一批大数据产品能力评测结果,腾讯云TcaplusDB成为首批通过键值型内存数据库功能评测的分布式NoSQL数据库产品。 2021年1月,TcaplusDB社区上线,这标志着TcaplusDB将通过和广大的用户及行业合作伙伴进行交流和共建,持续推动国产分布式NoSQL数据库生态的繁荣。

下一个十年:为行业提供更多助力

自诞生以来,腾讯云TcaplusDB就以服务更多开发者为目标,面向拥有使用高性能数据库的研发人员,分享经过腾讯内部检验的存储研发经验、工具和行业资源。而在未来,腾讯云TcaplusDB还将以国产数据库领航者的身份,在这条道路上走得更远,根据行业动态为平台引入更多元化的功能。同时,腾讯云TcaplusDB将和行业合作伙伴一起,继续分享腾讯分布式数据库方面的经验,并将积极投入基于多模和多负载能力的一站式低成本数据处理能力的研发;满足基于全球分布式能力,助力企业解决业务出海、全球同服/多活、跨域数据迁移等关键业务领域需求。 在下一个十年,诞生于游戏的TcaplusDB,还将继续为更多行业优化数据服务能力,贡献自己的力量。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
3年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Java修道之路,问鼎巅峰,我辈代码修仙法力齐天
<center<fontcolor00FF7Fsize5face"黑体"代码尽头谁为峰,一见秃头道成空。</font<center<fontcolor00FF00size5face"黑体"编程修真路破折,一步一劫渡飞升。</font众所周知,编程修真有八大境界:1.Javase练气筑基2.数据库结丹3.web前端元婴4.Jav
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k