网易云对象存储系统架构实践

t945in03 8年前
   <p>   10年存储老兵,对分布式文件系统、同意存储等存储产品有深入研究,曾任中科院、中科曙光等企事业机构。</p>    <p><strong>一、对象存储应用场景</strong></p>    <p>IT时代产生的大部分数据都是没有固定大小限制、没有固定格式的非结构化数据(图片、视频、 文件、归档备份数据)等,面对如此庞大的数据量,时常需要专业的云存储平台帮助解决一站式全方位的需求。</p>    <p>针对存储系统在扩展性、 可用性、可靠性上的担忧,我们通过开发的全方位的SDK,快速提供了一种理想中的非结构化数据一站式解决方案。以下为几种典型的引用场景:</p>    <p><strong>1、资源分发下载</strong></p>    <p>可以使用NOS并结合网易CDN服务实现一站式的数据上传、存储、下载分发服务,其对象包括:</p>    <ul>     <li> <p>网站、APP需要存储、上传和分发视频(视频网站、朋友圈);</p> </li>     <li> <p>存储、上传和分发图片(电商网站);</p> </li>     <li> <p>发布APP安装包等。</p> </li>    </ul>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/20753767722ae7e8fece08ae285e7f8b.png"></p>    <p><strong>2、UGC业务场景</strong></p>    <p>网易对象存储提供边缘节点上传加速功能,其优势为:</p>    <ul>     <li> <p>在不暴露NOS A/S KEY的情况下,让移动端直接将数据上传到NOS</p> </li>     <li> <p>利用分布全国的边缘加速节点,更快的将数据上传到NOS中,提高终端用户上传体验</p> </li>    </ul>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/a83b703e37514613cfc3b7c171a1f44c.png"></p>    <p><strong>3、企业网盘</strong></p>    <p><strong>4 、云端数据处理</strong></p>    <p>上传文件到NOS后,可以很轻松地进行图片处理服务和视频处理服务。</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/b6b6bc69d6cd09a12482ef57cb3e9932.png"></p>    <p><strong>5、网站/应用动静分离</strong></p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/600627aa49a373973736611f1658ec43.png"></p>    <p>简单管理网站上的图片,脚本,视频等静态资源,通过BGP网络或者CDN加速的方式,提供用户就近访问,有效降低WEB服务器负载,提升用户体验。</p>    <h2><strong>二、网易对象存储核心竞争力</strong></h2>    <p><strong>1、DDB分布式数据库系统</strong></p>    <p>分布式数据库系统(Distributed DataBase,简称DDB)是网易杭研后台技术中心研发的分布式关系数据库平台。</p>    <p>在NOS中用于元数据存储,主要用于解决如下问题:</p>    <p>1)海量结构化数据存储</p>    <p>2)高并发高吞读数据访问</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/845638b6f3c681077c01c3520bcff0e2.jpg"></p>    <p>均衡字段:用于计算哈希值的字段</p>    <p>两级映射:结合哈希的高效性和路由表的可管理性</p>    <p>2 <strong>、DFS分布式文件系统</strong></p>    <p>与之对应的,分布式文件系统(Ditributed FileSystem,简称DFB)是杭研后台技术中心研发的分布式非结构化数据存储平台。</p>    <p>主要用于解决如下问题:</p>    <p>1)海量非结构化数据存储</p>    <p>2)高并发吞吐数据访问</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/838a7db4578cbab8ca8edc2ffb8fabce.jpg"></p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/c405d948e78469092c1176c24d51c307.jpg"></p>    <p><strong>3、富媒体服务</strong></p>    <p><strong>(1)概述</strong></p>    <p>当前NOS承载着几乎所有网易互联网产品blob数据的存储,图片、视频、附件等是最常见的应用场景,而其中很大一部分数据为图片数据,比如网易lofter、网易云音乐、网易考拉海淘、易信朋友圈都有非常多的图片应用场景。几乎所有的这些产品都会大量得使用到NOS提供的图片处理服务。</p>    <p>NOS图片处理服务从2013年上线到现在已经上线差不多快3年半的时间, 图片处理服务器从几台扩容到几十台;系统负载tps从几百tps上升到现在的2w+tps,近上百倍负载增长。功能从简单的裁剪缩略到提供丰富的图文水印、链式处理等功能,已能满足专业的lofter图片处理的需求。</p>    <p>架构不断演变以适应更多的功能、性能、扩容性等各方面的需求。</p>    <p>以下为NOS图片系统发展的timeline。</p>    <p><img src="https://simg.open-open.com/show/e4a8a15d9d24686b1379329bd67d6f43.jpg"></p>    <p>接下来我会从几个方面介绍NOS图片处理解决方案:</p>    <ul>     <li> <p>图片核心处理单元</p> </li>     <li> <p>数据的获取nosfs</p> </li>     <li> <p>系统过载控制</p> </li>     <li> <p>图片处理架构</p> </li>    </ul>    <p><strong>(2)图片核心处理单元Tobie</strong></p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/b1b2fcecb5ffa47b92d3036b490011e0.jpg"></p>    <p>分治永远是解决所有复杂问题的解决方案,在计算机科学中体现的尤为明显。如上为一个基本的图片核心处理单元。主要分为以下几个层次接口层、并发层、处理层、数据层。</p>    <ul>     <li> <p>接口网络层</p> </li>    </ul>    <p>接口层向上层调用者提供HTTP RestFul Service,如下为对存储在nos的一张图片资源 Koala.jpg 执行简单的缩略操作。</p>    <p>接口层为基于Libevent实现的 C++ http服务。Master负责网络层的处理,包括接收来自客户端的请求,进行合理解析分发到任务队列,以及接收来自worker的处理结果并返回给客户端。Master基于libevent实现Non-Blocking的网络IO处理,所以基本单线程能够hold住整个图片处理单元的网络负载。</p>    <ul>     <li> <p>并发处理层</p> </li>    </ul>    <p>并发层worker从任务队列中获取请求并进行实际的图片处理工作,并发层Processor为通用的数据处理单元,当前已经整合Grapbic Magic 图片处理单元以及ffmpeg视频处理单元,后续如果有新的处理服务也可以非常方便的整合实现其它的处理功能。同时Processor也实现了Lua 扩张功能,可以非常方便的进行外部命令调用,从而非常快速的整合新的处理功能。</p>    <ul>     <li> <p>数据接口层</p> </li>    </ul>    <p>数据层实现了内存的数据接口以及本地文件系统的POSIX访问接口。数据资源可以是本地资源,也可以是来自网络资源。本地资源提供内存和File接口是非常直接的,网络上的资源是(对于我们来说主要也是通过网络方式来获取NOS上的资源)通过基于nosfs模块实现将NOS HTTP Rest API接口到Posix接口的转换。</p>    <h3><strong>(3)nosfs</strong></h3>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/ccbffecd7e5b57dac233b166488bb616.jpg"></p>    <p>NOS提供的是标准的HTTP Restful API,而某些图片或者视频处理库的只提供了基于本地文件的处理接口;所以面对这样的场景我们基于fuse(用户态文件系统开发框架)实现了nosfs,将NOS上的资源以文件系统中文件的 方式暴露给上层用户。</p>    <p>NOFS的基本框架如上图所示。APP(Tobie) 使用 open、read、write等文件系统POSIX API接口读取文件内容,陷入内核后,Fuse 内核模块会将用户的调用请求转发给上层我们基于libfuse实现的NOSFS模块,NOSFS 将文件系统形式Read、Write 调用转化为NOS HTTP PUT GET 请求实现协议的转换和数据的读取和写入。</p>    <p><strong>(4)处理单元的过载控制</strong></p>    <p>1 <strong>)过载与排队</strong></p>    <ul>     <li> <p>过载问题与解决方案</p> </li>    </ul>    <p>对于时延敏感的服务(同步调用),当外部请求超过系统处理能力,如果系统没有做相应保护,可能导致历史累计的超时请求达到一定规模,像雪球一样形成恶性循环。由于系统处理的每个请求都因为超时而无效,系统对外呈现的服务能力为0,且这种情况下不能自动恢复。</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/46d121ddac598c72075e5b51399424b7.jpg"></p>    <p>对于图片处理系统来说,是典型的CPU消耗性业务,往往32核机器对外只能提供几百的TPS的服务能力。如果系统在高负载情况下CPU成为瓶颈而请求还是在不断累积,那么很容易造成恶性循环。</p>    <p>NOS图片服务刚上线的时候就因为此类问题吃过不少亏,下图简要说明了图片服务刚上线之前的构架。逻辑层(tomcat)是统一的,不仅承担了用户数据的读写,还要转发处理图片服务请求。某次系统发生局部故障,Tobie处理集群中的某台机器处理能力降低不能快速进行图片处理,但是tobie的IO线程并没有block,还可以正常得进行请求得接收,从而导致请求积压,这不仅仅导致我们Tobie做了很多无用功(处理队列中已经超时的请求),更重要的是导致上层调用方(诸业务服务器)等待在这个故障图片处理节点上等待图片处理结果,而不能处理其它包括文件读写等核心业务。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/ac04d02a64ae0f5cf40ae5bf52178f10.jpg"></p>    <p>所以事后,我们做的第一件事情是核心服务的拆分,将上传下载、图片处理业务逻辑隔离开来。并且后续又针对图片处理核心模块系统层次的做了深层次的梳理,包括操作系统层次,保留libevent网络库层次,应用层次等。</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/3e8c750288326f67081908f90db28939.jpg"></p>    <p>如上图所示,从服务端收到客户端发送的Sync信号连接,连接进入Sync-Received队列,到三次握手完成进入Establish队列之后;再到上传网络库libevent通过epoll多路服用方式将底层的连接Accept放入event队列;直到连接上接收到一个完整的HTTP请求之后,IO线程回调上层应用的回调函数将HTTP请求插入请求队列,最后worker从请求获取请求进行处理。</p>    <p>当然系统层次或者libevent层次我们能够控制的余地较小,在底层做控制也不是非常优雅和通用,所以我们通过在应用层对请求队列做了一些控制,比如限制队列的长度,超过队列长度的时候直接拒绝请求;又比如每个请求插入队列的时候打上时间戳,worker取请求的时候发现已经等待很长时间了直接丢弃请求返回错误等等。另外我们结合nginx的健康检查机制,在服务已经过载情况下自动将请求调度到其它节点。</p>    <p>总结来说,以下几点为我们实践过程中总结出来的构架设计的关键点:</p>    <ul>     <li> <p>分布式系统中一个节点过载可能导致整个服务不可用,(tomcat类同步调用框架尤为容易受影响)</p> </li>     <li> <p>核心服务的隔离,拆分</p> </li>     <li> <p>前端不能信任后端, 所以第其他模块调用必须设置合理超时、一定的保护后端的责任</p> </li>     <li> <p>后端应该尽力而为,服务不了果断拒绝,SLA</p> </li>    </ul>    <p>2)图片处理架构</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/cdd30a34031b6d54483b0c285617a741.jpg"></p>    <p>如上为NOS图片处理的整体框架,Nginx将图片请求转发到NosMeida,NosMedia层次的功能主要为图片协议正确性检查,调用NosAuth对用户的请求进行认证。ATS(apache traffic server)缓存集群用户缓存图片处理结果(当前NOS使用的是代理缓存的模式),tobie处理集群氛围大集群以及小集群,小集群用户处理较小的图片资源的处理,大集群用户处理超大图片、以及针对视频的操作。</p>    <p><strong>(3)NCAN上传加速</strong></p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/0786e750223cba7d9b10bcea9d2f8e34.jpg"></p>    <ol>     <li> <p>客户端到基站的丢包率非常高</p> </li>     <li> <p>基站到数据中心的RTT也比较高</p> </li>    </ol>    <p>导致客户端到数据中心的网速较低,上传文件失败率较高。</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/dd041d1cb16bf5111347c33377ebcb38.jpg"></p>    <p>将上传文件分为过程一分为二:</p>    <ol>     <li> <p>客户端到基站的带宽低,但是rtt较低</p> </li>     <li> <p>Rtt较高,但是带宽较高</p> </li>    </ol>    <p>我们将边缘节点部署到离用户最佳的地方。</p>    <p>针对两个阶段分别进行优化,加速上传优化。</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/45ae611f152ca6d1a93dd37598d94a74.jpg"></p>    <p>NOS在全球各地部署了上传加速节点,帮助用户以最快的速度上传数据。上传加速节点数量和线路在持续增加和优化。</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/a5cdd6e5e1a523d6e78f34661ddcef7a.jpg"></p>    <p>关键技术点:</p>    <p><strong>1)上传协议</strong></p>    <p>传统标准OSS上传协议:</p>    <ul>     <li> <p>分块上传、最小分块5M</p> </li>     <li> <p>为服务端设计</p> </li>    </ul>    <p>NOS直传协议:</p>    <ul>     <li> <p>支持任意大小分片</p> </li>     <li> <p>分片append协议</p> </li>    </ul>    <p>自定义的上传协议,提高文件上传的成功率。</p>    <p><strong>2)移动端上传优化</strong></p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/e377df42abc38c14b537e5ca748e327b.jpg"></p>    <p>在一个TCP链接上并发发送数据,充分利用广域网带宽,提高上传速率,Pipeline测试结果如下:</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/13c9bb855202381897ed7a6086ebaef2.jpg"> <img src="https://simg.open-open.com/show/bed854f791d677669edcbddeadc64ad3.jpg"></p>    <p>Pipeline能够大幅度提高上传速率。</p>    <p><strong>3)广域网TCP、HTTP优化</strong></p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/4d0a8bd52262df1bba8b96808fa3cde0.jpg"></p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/bffef4c5df293f2c0bb2d5296408be86.jpg"></p>    <p>边缘节点及时提供响应,在上传完成之后,边缘节点和中心机房进行一次同步即可,有效率用客户端到边缘节点&边缘节点到中心机房两段带宽。</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/8b7922c2705691c7b1c0a6de64958cdc.jpg"></p>    <p>对边缘节点到中心阶段之间网络进行优化(客户端到边缘节点的网络不在可控范围之内),主要是TCP send buffer的调优,使buffer不成为上传速度的瓶颈,在不使用专线的情况下达到最优效果。</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/c52786593af8068e03cd65ea5139c014.jpg"></p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/ba9d5b98693ce35e32b9bc9907ec0733.jpg"></p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/0865f8b1af71539510141e6624e38179.jpg"></p>    <p>最下面一条线是杭州中心机房的base数据,我们对蓝线代表的边缘节点进行了优化,并对未进行优化的边缘节点进行了对比测试,相应时间差距可达到70ms以上。</p>    <p>Q&A</p>    <p><strong>Q1:</strong> Lua 的作用是什么?</p>    <p><strong>A1:</strong> Lua的作用是用来做图片处理在数学上的一些换算工作,在测试等阶段可以做到不用重新编译可以对一些裁剪缩略的规则进行直接的调整。</p>    <p><strong>Q2:</strong> golang 是用来做哪一层的?</p>    <p><strong>A2:</strong> golang 其实在我们系统里面很多地方用到,比如替换tomcat 这样的thread base web server的,实现更高的并发性,比如上面提的图片处理进来之后的接口层次的服务处理都是用golang 做的。</p>    <p><strong>Q3:</strong> 视频处理方面的,有没有检测视频质量或者被人为修改的检测算法?</p>    <p><strong>A3:</strong> 没有,整合视频服务这块,当前PPT里提到的,我们的功能比较简单,主要是一些视频云信息的获取一集截图之后结合图片处理的一整个流程的传来服务,比如打水印的,缩略啊,转格式啊等等,你说的检测视频质量这没有做。其他比如分布式转码等功能,不在今天的分享范围内,后续可以再约。</p>    <p><strong>Q4:</strong> 存储用ceph?</p>    <p><strong>A4:</strong> 存储是自行开发的分布式文件系统,对小文件存储做了大量的优化。</p>    <p> </p>    <p> </p>    <p> </p>    <p style="text-align:center"> </p>    <p> </p>    <p>来自:https://mp.weixin.qq.com/s?__biz=MzI4NTA1MDEwNg==&mid=2650757065&idx=2&sn=d462bec566d832e3a71a4a8b53d2e800&chksm=f3f9e25cc48e6b4a0a4d17a5b0a78197116f903031b62d809d806f614ceea31a6f1f0ac07338&scene=0&key=&ascene=7&uin=&devicetype=android-23&version=26031b31&nettype=WIFI</p>    <p> </p>