十年•杭研技术秀 | “网易云存储服务”从0到1发展之路

社区编辑2018-05-15 17:49

2016年对于网易杭州研究院(以下简称“杭研”)而言是重要的 – 成立十周年之际,杭研正式推出了网易云。“十年•杭研技术秀”系列文章,由杭研研发团队倾情奉献,为您展示杭研那些有用、有趣的技术实践经验,涵盖云计算、大前端、信息安全、运维、QA、大数据、人工智能等领域,涉及前沿的分布式、容器、深度学习等技术。正是这些宝贵的实践经验,造就了今天高品质的网易云产品。本文的分享来自网易杭州研究院云计算平台产品部,翔实地描述了网易云存储系统从无到有以及一路披荆斩棘不断完善的历程。

 

一、从0诞生

 

2012年云计算在业界已经风起云涌,其为企业带来的价值为世界所认同,按需提供的计算、存储、网络等底层IaaS基础设施,以及丰富的PaaS和SaaS服务,为IT公司产品的开发、运营和快速可持续发展提供了强有力的支撑。云计算犹如肥沃的土壤,让各种产品和idea犹如雨后春笋般在清新的空气和阳光中快速成长。

 

同样地,网易杭州研究院也早已蓄势待发,准备捋起袖子大干一场,如同追风少年,驰骋于时代浪潮之巅。

 

其中后台技术中心存储平台开发组NOS(NetEase Object Storage)团队在紧锣密鼓地打造面向整个公司的云存储服务,希望更好地整合底层的存储资源并以开放协议(HTTP RestFul)提供给网易的各个开发团队使用。

 

巧妇难为无米之炊,而对于NOS团队来说,米缸里的米俨然已经准备好。在其他互联网企业高呼去IOE之前,网易杭州研究院早在2006年就已经开始打造分布式文件存储服务和分布式数据库服务来满足公司当前和未来业务的发展,这两个系统分别是DFS(Distribute File System)DDB(Distribute Data Base)。DFS的目标是整合诸多服务器的存储资源为上层应用提供海量的存储系统,支撑横向按需扩容。DDB的目标是整合底层的关系型数据库服务,为上层服务提供海量的数据库服务。DFS和DDB的设计都秉承了“Keep it Simple”的系统设计理念,对于大型分布式系统来说,简单尤为可贵,简单意味着可控、不易出错和强大的生命力。

 

图1为DFS的基本设计架构图。每个对象有一个全局唯一的64位文档ID号,按照24+10+10+10+10切分为四段,分别代表桶号、目录结构和文件名(避免本地文件系统单目录下元数据的限制), 每个SN管理多个磁盘,多个SN上的磁盘做成磁盘对,桶建在磁盘对上,桶和SN的最终映射关系缓存于客户端。客户端FSI直接根据缓存的映射关系写多份副本。

 

图1  DFS的基本设计架构

 

DFS分布式文件存储系统在邮箱大附件和网易网盘业务中得到了非常成功的应用,承担了所有网易邮箱附件存储服务,存储规模早已达到PB级别,为网易邮箱的快速可持续发展提供了强有力的支撑。DDB分布式数据库架构这里不再赘述,感兴趣的读者可以参阅DDB架构实践(复制到浏览器查看:http://tom.nos-eastchina1.126.net/DDBDesign.pptx)。

 

当时,这些基础组件,如DFS分布式存储系统,使用模式为一个产品部署一套,譬如邮箱网盘、大附件、相册、网易博客等都会单独部署一套。由于网易新产品层出不穷,这种模式就导致了大量的运维工作,并形成非常多的资源孤岛,多个产品不能融合共用资源,造成大量的资源浪费。

 

随着时间的发展,云服务的思维方式慢慢深入人心。团队决心改变这种模式,在这样的背景下,NOS立项,基于DFS和DDB,8人团队用1年多的时间成功打造了一款功能媲美AWS S3的云存储系统,于2012年10月30日成功上线,如图2所示。NOS呱呱坠地意义重大,伴随着其它云计算产品陆续完成上线,网易正式进入云计算新时代

 

图2  2012年的云存储服务

 

二、成长之痛

 

如同婴儿诞生,NOS上线之初,经历短暂平静后便开始摸爬滚打,一路荆棘一路坎坷,不断成长。

 

2012年上线之后,接入NOS的第一个产品是网易云课堂,承载课堂上的所有图片和视频;后续不断有网易公开课、网易云音乐、有道云笔记、网易云阅读、网易花田、印象派、网易游戏官网等网易互联网产品的接入。上线之初,产品的架构能够很好地满足当时的系统负载,顺风顺水度过了半年的时间。

 

和其他互联网产品一样,NOS作为面向开发者(同时也直面用户请求)的产品,技术上的短板和流程上的缺陷随着越来越多产品的接入及产品自身的发展壮大不断凸显。

 

2013年,IM大战爆发,微信、来往之外,网易和电信公司联合推出易信,希望能在IM领域占得一亩三分地。技术上,易信UGC数据(语音、图片、视频等)的上传、存储、访问和处理基本全部使用NOS。NOS和其他网易云计算服务保障了易信产品在短期内快速发布上线。

 

但是上线之后的大规模推广给NOS系统带来了数十倍于往常的压力,UGC产品带来的线上增量是NOS团队未曾预料到的。

 

2013年5月的一天,阳光明媚一如既往,但就在16:20,NOS团队的上空飘来了一片阴云:NOS一台服务器意外挂掉,随后产品方反馈NOS服务很慢,团队排查发现此时NosProxy(NOS对外业务逻辑服务模块)使用的servlet容器Tomcat的连接数从往常的100、200上升到5000以上,对于Tomcat 这样的线程并发模型服务器(Thread Based concurrey Servlet),底层需要一个线程处理一个用户请求,而依赖组件的过载和超时的不合理设置直接导致了处理线程一直被后端依赖组件block。16:32,连接数再一次恶化,NOS对外提供的所有接口和服务陆陆续续不可用,用户请求的不断到达和后端依赖模块的过载,直接导致系统发生了雪崩效应。事态严重,NOS团队立即对线上服务模块进行重启并启动扩容计划,开始调集公司力量增加新服务器进行线上扩容

 

此时丁老板办公室外面的易信团队异常骚动,问候NOS爹娘的声音此起彼伏。到了下午17时多,NOS又一次出现故障,新机器还没ready,团队所能做的就是重启重启再重启,突然,NOS负责人后面出现了一个高大而又陌生的身影,丁老板穿着拖鞋下来了,直接彪了一句“Tomcat怎么能这么用”(你没听错,丁老板是技术出身的)。记忆中,这是我们头一次离老板这么近,近在咫尺,丁老板在背后看着我们处理线上问题,更多的细节伴随着颤抖着的小手敲着键盘的声响已经记不太清了。

 

成长的代价很沉重,但收获是沉甸甸的。此次重大事故后,团队进行了全方位的总结,技术方面的改进很多,主要包括:

 

  • 服务拆分:子系统过载会级连导致整个系统的过载,对关键服务模块进行了拆分和隔离。
  • 过载保护:对所有子系统的调用设置合理的超时,避免持续等待,并且进行了完善异常验证测试。
  • 尽力而为:子系统过载服务不过来的时候直接拒绝服务,尽力而为,并且拒绝做无用功(客户端已经超时的请求直接丢弃)。
  • 高可用:避免系统单点,使用Nginx健康检查、VIP、自动切换脚本等机制自动屏蔽故障节点,保障线上服务持续可用。
  • 故障隔离:对图片、上传下载服务器进行物理机器的隔离,物理隔离代价较大,在实践上还要在逻辑上对不同业务进行一定隔离,比如进程隔离、业务隔离等等,避免一个篮子里所有的鸡蛋都出问题。

 

三、快速发展

 

技术和构架上的改进基本能够保障系统宏观上跟得上业务的发展。而如何在产品快速发展过程中保持持续稳定,是我们这5年来遇到的一个很大的难题。

 

首先看一个概念,对于云服务而言,评估一个服务是否稳定有一个很重要指标,即可用性或者说可用率,该指标具体量化了系统或者服务的稳定性特性,如表1所示。


表1 云服务可用率指标

 

详细可参看:如何打造高可用系统(复制到浏览器查看:http://www.bitstech.net/2015/12/18/high-availablity-system/)。

 

在NOS产品的不断发展中,除了需要持续维护系统稳定的运行,还需要不断开发新功能,并进行构架的调整。如何在大大小小的关节点和振荡期持续对外稳定输出服务,维持高水准的稳定性和可用性? 这个问题的解决,需要长时间的积累以及团队的坚持履行,甚至涉及到团队文化的建设,远比绝大部分技术上的调整艰难得多。下面我们具体来看NOS团队在这方面的实践经验和取得的成绩。

 

表2为团队在高速发展的2年中记录的NOS实际线上可用率数据。


表2 NOS可用率提升历程

 

在这两年时间,NOS服务普遍做到了3个9,甚至4个9以上的可用率。在2016年上半年,NOS系统达到了5个9的可用率,唯一发生的故障为线上数据库服务器故障,自动化脚本在3分钟的时间内自动完成故障探测和备份节点切换,实际造成的影响不到3分钟。期间伴随着诸多新功能的上线和构架调整,如图3所示,2016上半年,NOS组件数量到达41个,版本发布多达42次,涉及15个功能组件,上线次数30次(不包含灰度发布),每周都要进行好几次上线,开发语言包括Java、C++、Golang、Python、Objective-C等。

 

图3 2016年上半年的NOS

 

同时相比于2015年底,2016年上半年新增存储容量达到历史总量的70%,系统压力增加50%,系统的横向水平扩展能力很好地满足了业务快速增长的需求。据不完全统计,NOS当前为网易负载数一数二的大系统。

 

在产品推广使用上面,2014~2016年 NOS发展迅速,成为网易内部及合作伙伴云存储产品的首选。图4列举了当前使用NOS的一些产品。NOS提供的非结构化数据解决方案为大型互联网、社交通信、电商、移动、支付理财、SaaS等诸多领域的产品提供了稳定的服务。


图4 使用NOS的网易产品

 

回过头来我们来回答“NOS如何在大大小小的关节点和振荡期持续对外稳定输出服务,维持高水准的稳定性和可用性?”这个问题。在将近5年的时间内,NOS团队基于无数次的讨论、实践和血泪教训,不断总结和完善“NOS稳定保障流程体系”。

 

简而言之,我们从定义、规划、实施、测试、上线、运维、事故等7个大方面“确保提早发现问题,缩小问题产生的代价,快速进行恢复,从而最大限度减小损失”,如图5所示。


图5 NOS稳定保障流程体系

 

流程看起来很重,其实并不是所有大小功能的上线工作都需要全面执行该流程,但是关键的流程都要覆盖到,大型架构的改动则会严格执行完整的流程。客观现实要求团队必须如履薄冰,一步一个脚印踏踏实实,用完善的流程来避免人为引入的不可靠因素,因为NOS云存储服务是给大量产品提供7×24小时在线服务,出问题的代价太沉重。

 

当然,NOS云服务的快速健康发展,原因有很多,除了提供了“稳定的基础服务”,我们还提供了“贴近用户的增值服务(如丰富的图片和音视频服务、直传加速服务)”和“口碑坚挺的技术支持(开发会投入1/3时间接待客户,帮助客户更快更好地使用NOS)”。稳定是基石,增值服务能吸引更多的用户,口碑坚挺的技术支持更帮助产品团队实现客户留存和良好口碑传播。NOS通过这三方面更好地支撑各个产品稳定服务,从而反过来促使NOS产品自身不断发展壮大。

四、星辰大海

 

数据存储是企业持续发展不可或缺的土壤,并且企业对数据存储的需求会越来越多,量也会越来越大。NOS团队会一直致力于打造一流的存储服务以及基于存储的富媒体和上下行加速服务,一站式解决非结构化数据管理难题,助力产品方实现最佳用户体验。


图6 NOS的定位

 

2016年,网易公有云计划正式启动,NOS和所有的其它网易云产品一样,踏上了新的征程,将19年的技术积累全面开放,赋能给所有IT企业,为企业用户插上一双网易云的翅膀,共同创造美好的未来。

 

图7 截至目前的网易云产品矩阵

——孙建良

网易杭州研究院云计算平台产品部