十年前在腾讯做技术,是一种什么样的体验?
那是2009年的一个周五晚上,Ben清楚地记得,那天一坐上公司班车就累得睡着了,直到一路被载到终点站,然后一脸懵逼下了车。在这之前,为了修复多个机房同时掉电对某国民级应用的影响,Ben和团队十几位小伙伴已经30多个小时没合上眼。
因为城市建设或自然灾害,机房掉电、电缆挖断这样的“黑天鹅”事件几乎每天都在发生。庆幸的是,腾讯技术团队在做好机房容灾的同时,对数据安全更是重视,除了在线多副本之外,早在那时就建立起了完备的数据灾备系统。
每一次的全力作战,换来的是对数据安全、技术升级愈加上紧发条。
每一项成功的业务背后,必然有一个成功的技术团队做支撑。21岁的腾讯,服务器总量超过了100万台,数据存储规模达到EB级别,带宽峰值达到了100T,在全球布局超过1300个加速节点……To C产品动辄数亿次的访问,To B业务安全、稳定的交付,都用到了海量的技术。
站在2019年的尾声,让我们来讲述一段关于腾讯技术的进化史。
1998-2005,海量之道
“化繁为简,好钢用在刀刃上”
QQ 是腾讯最早的核心业务,它的架构演变是腾讯技术发展和成长的一个缩影。
2004年,整个腾讯只有5000台服务器,那时3G时代还没有来临,却背负着QQ这一“甜蜜的负担”——QQ同时在线人数短短四年内增长了100倍,到2005年2月正式突破了1000万,在线人数每提升一个量级,技术难度也陡然上升。
2004年,QQ游戏也超过了100万在线,那是游戏行业黄金期的开启。随着QQ秀、QQ游戏、QQ空间等互联网增值业务的兴起,互联网世界正在向用户敞开大门。用马化腾的话说,那也是腾讯业务发展的海量时代。
社交加上大量日志、相册的存储,对当时腾讯的互联网基础设施架构提出了全新的挑战。
那时,中国互联网基础设施还不发达,很多用户都是拨号上网。北边是网通,南边是电信,分布过碎,成本会增加,数据一致性很难保证,用户体验会不好。于是,腾讯花了很大力气做三网融合,这在当时是一个很难的技术。
2005年推出的QQ空间是一个宽带应用,跟IM、QQ游戏这种窄带应用有很大差别,对网络等基础设施要求更高,用户的交叉访问也带来很大的技术挑战和难度。
面对海量服务,腾讯的方法是化繁为简。做海量业务的时候,技术难度就如同造房子,不光造得高,材料还要省,成本还要低,所以就得抓住关键技术支撑点,把好钢用在刀刃上。
在很多技术细节上,腾讯是精打细算的,主张将更好的技术资源节约出来留给关键使用场景,才能支撑QQ的整体上升。比如有很多场景未必要用通用的数据库来解决问题,用一些简单的数据技术处理方式,反而成本更低、效率更高;早期QQ有很多关于会员的标记,腾讯舍不得为每一个标记用1个字节(Byte),而用的是1个比特(Bit)。
这套基于“有损服务”、“动态运营”、“大系统小做”、“过载保护”、“柔性可用”、“先抗住再优化”等价值观和方法论的不断优化架构体系,被腾讯人称为“海量服务之道”。
为了推广这套理念,腾讯联合创始人、前CTO张志东亲自挂帅,在公司内部搞了一系列关于海量之道的面授课程。一时间,海量服务之道被腾讯后台和开发同学奉为圭臬。
“大师兄”张志东早期为QQ设计了整体架构,这个架构支撑着QQ业务从无到有,直到后来上亿用户同时在线。由于没有钱买那么多的服务器,反而迫使团队自身不断优化,从而奠定了腾讯在中国首屈一指的技术服务。
腾讯早年有很多业界领先的技术。比方说,QQ同时在线人数从10万到100万,单机处理能力已经超过同行业10倍以上。当时腾讯有一个重要的技术创新——PCT架构,它使得别人的一台机器只能做1000个在线连接时,腾讯能做到1万。
此外,QQ空间时期的支持LRU的sharememory cache,基于裸设备的file system等,对当时的腾讯甚至整个互联网行业来说都是拓荒者。
多年后,担任公司副总裁的姚星在内部交流时回忆,2004年他刚加入腾讯时,公司特别重视公共组件技术,当年就有一个著名的公共组件叫TLib,基本上覆盖了当时所有的BU(当时的事业部),很多代码也都是公司创立以来就有的,“只不过随着业务的演进,很多公共技术失传了”。
2006,互联网大爆炸
“业务越繁杂,意味着爆炸半径越大,技术难度越高”
腾讯技术体系经历了一个从即时通讯到社交图片、由窄带到宽带的“从瘦到胖”的过程,当时腾讯希望用很传统的Web型业务架构解决问题,而通过解决这些问题,最终在海量存储方面积累了丰富的经验。
这里,不得不提到一个对腾讯技术演进至关重要的应用——QQ相册。2005年开始,QQ空间大火,那时数码相机开始在国内兴起,QQ相册上线后,很快日均上传量超过1000万张,访问量级和用户规模与Facebook分庭抗礼。
从几百万到1000万,再到后来的一天1亿的上传量,对带宽、服务器消耗很大。当时,国内的存储服务器要么是原来的小型机,要么是磁盘柜或刀片机,性能和成本都遇到了非常大的挑战。
2006年,腾讯开始研究互联网场景下的海量存储架构,结合自身业务场景自研了分布式存储TFS(Tencent File System),支持了QQ相册每天亿级别的图片上传。
这是当时国内第一个真正意义上面向互联网海量数据存储的技术平台,大大推动了分布式存储技术的发展。
从2006年起至今,TFS作为数据存储的底层平台,一直承载着包括QQ相册、微云、微信朋友圈等业务的非结构化大规模数据,并在2013年以云服务的方式构建出最具代表性的对象存储等产品,对外提供安全可靠的高性能云存储服务。
2008年秋天,华中科技大学的毕业生Ben带着QQ后台开发的offer走进腾讯办公楼时,发生了一点小小的插曲。当年,遇上数据库这一块大量扩招,公司于是去其他部门拉来了一些应届毕业生,Ben很“不幸”地成为了其中之一。要知道,那时进QQ后台是多少人羡慕不来的工作。
塞翁失马,焉知非福。没想到这一脚,正好踏进了国产数据库发展的黄金十年。
数据库作为腾讯最核心最基础的后台服务之一,是存储QQ用户帐户信息和关系链信息的海量集群,它承载了百万级每秒的访问量、十亿级的账户数、百亿级关系链。
腾讯数据库的发展经过了几个阶段,在敏捷开发的Web时代,LAMP技术架构非常流行,以MySQL为代表的开源数据库成为首选。随着社交业务的迅猛发展,QQ活跃账户过亿,QQ空间访问峰值达到百万/秒,对数据库的性能、成本和扩展性挑战非常大,腾讯开始走上自研数据库的道路。
“计算机、互联网的世界里,有多少能真正被称为‘科学’的技术?数据库算得上一种。”说起来,Ben有些感慨。
2009年,QQ空间内嵌的“QQ农场”、“抢车位”等社交游戏开始流行起来。QQ农场创造了当时国民网游的峰值,根据当时的数据,QQ农场的月活跃用户达到了3.2亿,注册账号占到了中国人口的2/3。
一时间,“偷菜“风靡全国,成为社交最热的话题,更有甚者一个晚上设置两三个闹钟爬起来偷菜。然而每偷一棵菜,就要改写一下数据库,QQ农场跟相册的情况还不太一样,农场的访问量特别大,数亿用户守在电脑前,菜一熟立马就去摘,这样的高并发使得数据库团队猝不及防。
当时腾讯面向结构化存储的SQL/NoSQL数据库都是基于机械磁盘设计的,内存缓存部分数据,但机械磁盘的性能是有天花板的,光数据库就要耗上上万台机器,成本根本无法接受。
Ben和队友们想了个办法,借鉴关系型数据库的日志技术,实现了All DRAM的分布式存储系统,并在All DARM和All Disk两套存储系统之间通过一个调度系统,把访问最频繁的数据库放在内存里,每隔一段时间,内存再向硬盘同步这部分数据。根据访问规律,把数据在内存和磁盘之间做调度,这样一来成本就降低了。
经受过海量业务打磨的CDB(SQL)、CKV(NoSQL)后来也成了腾讯云数据库最早的一批种子产品。
技术的积累和前进需要有落地的应用场景。过去21年,腾讯是中国互联网服务面最广、场景最多、用户时长最长的公司,全业务性作战是腾讯的重要标签。当业务种类越繁杂,意味着爆炸半径越大,技术难度也越高。腾讯技术基础设施的建设就是在这个阶段快速累积和迭代。
创业初期,腾讯用的是主流市场通用的2U或者1U机架式服务器。2007年,腾讯定制了第一款Twins服务器,将机架上架密度提升了100%。在定制各类机型的同时,实现了一套大规模服务器上架和管理系统,具备一天内交付1000台以上设备的能力,保障了产品的快速增长。
2006年,整个公司的业务规模直线上升,腾讯已经没有更多场地去摆放支持业务增长的机架和服务器了,而光是租用数据中心成本控制力度并不够。因此,腾讯开始尝试自建数据中心。
到了2007年,腾讯第一个自建数据中心在深圳宝安落地,得益于自建数据中心的高度自主可控性,腾讯的第一个TMDC微模块数据中心也在此试验成功。这种成功的经验迅速在全国各地复制,腾讯落地于华南、华东、华北三个核心区域的数据中心,覆盖了至少9个城市。
2012,在微信红包种一棵“树”
“微信红包是什么?相当于天天秒杀”
腾讯内部有这样一个传统,一些快速成长的业务或遇到一些突发事件,公司内会快速集结一直技术团队来支援,这样的队伍被称为“特种部队”。
2014年冬天,Eric就加入了微信红包“特种部队”。2011年,微信上线,2014年,微信红包横空出世,那一年除夕夜,微信红包摇一摇总次数达到110亿次,峰值1400万次/秒。如何扛住海量数据、高并发的挑战?
在Eric看来,微信红包这个场景挺有意思,“电商有一个秒杀,微信红包是什么?相当于天天秒杀。”
单一的支付场景其实挑战不大,发一个红包到一个一两百人的群,可能几秒钟就被抢完,整个业务链完成后需要调用的数据库、存储,除了高并发下的平均延时要求是非常高,也需要非常低的尾延时。支付背后的金融属性又需要被严肃对待,一分钱都不能错。
在这个阶段,腾讯引入了一致性协议、广义事务(包括单机事务、多地多中心分布)等技术方案,保障了数据的可用性和一致性。
2012年是中国互联网的分水岭,手机QQ的消息数第一次超过了QQ,大多数用户的主要时间开始花在手机上。
2012年之前,腾讯几乎所有人都在做PC互联网,无线应用部门负责把公司所有的产品无线化。当用户都开始往手机上转移,各部门也纷纷醒悟过来。2012年,腾讯完成了大的组织变革和转型,开始全BU的无线化。
移动互联网对于技术的要求与PC互联网并不一样:首先,PC互联网是基于几乎全球唯一的Windows平台,移动互联网则要面对iOS、Android、WP、黑莓等多种系统平台,各类应用需要开发适配不同OS版本;其次,移动互联网的地盘面积是三到六寸大的移动终端屏幕,手机、平板电脑等算力较差,硬盘、内存、CPU型号等参差不齐,服务器就需要体现多样性。
微信的出现,帮助腾讯获得了第一张移动互联网时代的“船票”,同时也提出了新的挑战——比如需要在用户基数庞大的情况下处理高并发问题;社交关系链对数据库、存储调用的安全性和稳定性要求极高;每次微信版本更新都需要适配不同手机型号、不同操作系统。
为此,工程师们决定在数据库上种上一棵“树”,也就是在NoSQL数据库上实现关系数据库才有的树结构。
换句话说,整个数据库结构不再是一个统一的二机制数据了,而是一个关系型数据库的树枝状结构,这棵树分一、二、三、四级的分级,设置父节点、子节点、生枝节点,整个关系就出来了,当其中某一个枝节需要修改时,只需要改那个枝节,数据量就会减少很多。
“种树”还有一个好处,查询效率很高。例如抢红包这个场景,用户需要回去查询朋友圈抢红包的记录,按照以前的做法,需要把用户所有抢红包记录全都拉出来,数据量就很大了。而在“树”的结构中,当你发起一个查询时,只需要查一个节点就行,不需要把整个数据拉出来再往里面塞。
2009年至2012年,QQ的体量从1000万在线发展到1亿在线;2012年及随后的6年间,微信日活跃用户数从1亿发展到10亿。在姚星看来,腾讯贡献的最大价值其实是从1998年开始,经历QQ、QQ空间、微信积累的技术方法论:动态运营、云中成长、有损服务。
2012年还有一个重要节点——虚拟化技术的成熟。虚拟化的过程,是把物理机变成虚拟机的过程,这意味着在超大规模数据中心和高速互联网络的基础上提供云服务成为了可能,腾讯云主机管控平台Vstation做到了每分钟交付千台虚拟机的能力,使得一个中等规模公司的计算需求可以快速得到满足。
虚拟化是云计算区别于传统计算模式的核心特点,也见证着下一个时代的到来。
云潮涌来
“腾讯走向云的时代,是长期以来技术发展、演进的必然。”
为了支撑起QQ农场的正常运行,腾讯曾在短短一个月内额外采购与上架了几千台服务器到机房。这也让腾讯意识到,“流量到来前,如何设计一个高可用的IT架构”、“流量激增时,如何快速补充服务器资源”、“流量下降后,如何不浪费闲置服务器资源”是业界普遍存在的难题。而这正是腾讯多年服务海量用户所积累的能力。因此,腾讯要把这种能力通过腾讯云开放给合作伙伴。
许多人还记得2014年滴滴和快的之战。那个冬天,为了抢占市场,大量补贴像雪花般投放给用户,滴滴的订单量从十万快速增加到百万级别,每到早晚高峰,系统和程序员们不堪重负:
交易表庞大且订单量暴增,MySQL性能已跟不上;司机在线量上不去,管理在线的pushserver(司机在线系统)是用java编写的,LBS(周边检索系统)使用mongodb,稳定性和性能没人能搞定。
当滴滴创始人程维愁眉不展时,腾讯连夜调集了一支“精锐部队”前去支援。
正月的北京乍暖还凉,时任腾讯架构平台部负责人谢明博士赶到北京时,团队已连续救火多天。谢明和团队盘算了一下,随即做了这样几件事:
用腾讯自身的框架和协议重写了pushserver和LBS,替换了原有的java和php+mongodb实现,解决了接入上限的问题;与滴滴团队一起在打车业务逻辑中增加了几个关键的柔性降级开关,比如说超过警戒容量之后的订单丢弃和安抚通知。
因机房条件艰苦,中间同机房其他公司的产品发生疑似攻击的情况,把带宽打满了,一点小小的流量就可能将整个系统弄垮。于是,双方联合团队做出了一个艰难的决定——将滴滴的整个系统,平迁到腾讯内部机房。
几个月后的腾讯战略大会,邀请创业伙伴现场分享。程维分享滴滴打车经历多少次的九死一生时,眼圈红红的,最后特别提到了那一夜:2014年2月23日凌晨,滴滴打车的服务,成功的从滴滴自运营机房,迁移到腾讯深圳机房,几天几夜的不眠抢修,这一刻终于绽开笑颜。
现任腾讯TEG云架构平台部总经理的谢明2006 年加入腾讯,主要负责操作系统和芯片相关的计算、CDN和雾计算相关的接入、对象/块/数据库相关的存储技术研发和运营工作。
滴滴不是腾讯云的第一个客户,但是表明了腾讯做云的一个出发点。谢明说:“确实有很多创业公司没有精力或技术放在基础设施和业务发展上,有云的话情况会好很多。”
从2010年开始,QQ空间、相册、腾讯视频等一系列自研业务的打磨,帮助腾讯在视频、直播等领域积累了强大的整套解决方案和能力。于是在2015年,腾讯云顺利抓住了直播的风口,迎来了第一波大爆发。
对于直播而言,平时有明显的波峰、波谷效应,没有直播的时候流量不高,一旦有直播的时候有很大突发。今年S9,腾讯云为全网90%流量护航,直播流量承载将再创新高,考验的是云厂商智能调度CDN的能力、弹性伸缩的计算能力、支撑海量高并发的数据库能力,技术保障和护航的能力。
腾讯云过去使用的是第三方CDN厂商的服务,随着体量不断增长,许多技术需求、带宽压力以及成本问题都不是一家供应商能够解决的。因此,腾讯云走上了CDN的自研道路。
云时代面临许多新的场景,对技术体系构成了新的挑战。2015年前后,腾讯内部已经明显感觉到了这一变化,于是在网络设备、服务器等技术领域,腾讯加快了自研的脚步。
例如在存储上,云时代考虑的是如何利用好10G乃至100G网络,使得这一台的每一个服务器的计算和存储能力都能得到释放,于是腾讯研发了下一代存储系统,真正做到了按需扩容,利用率整体上可以达到90%以上,单集群可以管理百万级别节点,同时大幅降低了人工的运维成本。
数据库上,腾讯通过开源托管、商业合作、自研三线齐发,提供超过20 种数据库产品,以及数据备份、SQL 审计、数据管理、数据迁移等服务等生态工具,让用户获取最佳的上云体验。
网络方面,腾讯基于自研设备和SDN 来构建第四代网络架构。比如,在自研设备上,腾讯自研交换机TCS83支持单芯片100G端口,自研光网络设备OPC-4,单通道转发能力达到业界顶级600G水平。通过自研,网络设备TCO下降20%+。
产业互联网时代,各行各业对云计算有更高性能和稳定性诉求,腾讯通过DPDK、智能网卡等软硬件方案,将网络、存储等IO消耗卸载到硬件上,实现了虚拟机零损耗和虚拟机之间的零干扰。同时,在国内率先推出FPGA服务器、高性能GPU服务器等异构计算,满足各行业用户的不同需求。
今年10月29日,腾讯云正式对外发布的自研服务器“星星海”,是腾讯第一款真正为云而生的服务器。在设计过程中,结合数据中心实际部署环境要求,针对云端的计算、存储,网络等场景做了重点优化,能够有效满足腾讯云98%应用场景需求。同时,通过精细的硬件设计大幅度降低硬件成本和运营成本。
2018,腾讯930变革
“开源协同,自研上云。”
过往,产品和业务的成功是腾讯公司技术成功的先决条件,而每一个产品为了快速制胜,就要拥有一支只服务于自己的技术团队。
这也导致腾讯内部的许多业务都各自形成了一个技术闭环,每个业务事业群从逻辑层、数据层到后端的容器或虚机层,都是独立的一套技术框架和技术体系。
回到2013年甚至更早,腾讯开始做云业务时,马化腾就问过一个问题:“为什么不推动自研的业务上云?起码SNG的业务就该做示范去上云。”
当时,SNG内部做了一些上云的局部尝试,但并不太敢铺到全公司推广。过去,腾讯的基础架构经历过海量业务的百般挑战,如果把腾讯的自研业务当成一个公司来看,它可能是目前腾讯云最大的客户,也是最难服务好的客户。大家有很高的技术水平,要求也很刁钻。
腾讯技术全面走向开放“东风”,来自2018年的“930”变革。“930”之后,为了技术体系革新,腾讯内部成立技术委员会,启动“开源协同”和“自研业务上云”的两大战略方向。
“开源协同,自研上云”这两大革命,目标非常明确,就是要打造腾讯自己的技术图谱和开发武器库,同时为2万多名技术人员搭建一个无缝协同的工作机制,同时为全行业输出更多的云的经验。
以数据库为例,腾讯数据库目前提供了近二十款产品,开发者可以根据自己的需求取用,做电商的可以选用完全兼容MySQL的CDB,需要用到LBS能力可以选用完全兼容MongoDB的文档数据库,需要商业级数据库能力可以选用新的云原生数据库CynosDB。
腾讯自研操作系统、自研网络设备、自研交换系统是遵循协议的,协议上可以与其他运营商互联互通,T-Block数据中心在行业中也有联盟,通过联盟能够把技术和开发者共享,让大家都能从中获益。
腾讯业务量庞大,仅社交业务就包括QQ 和空间的体量有近二十万台服务器,分布在全国三地,要把如此庞大体积的业务搬到云上,无异于“把大象搬到云端”;同时,如何撬动体量、影响力比较大的项目进行开源协同,也面临着重重难关。
但是对于每一个身在其中的开发者而言,这是一个新世界的开始。
请关注「腾讯开发者 」公众号
专业的开发者都关注了 。