微博图床多机房部署架构

微博图床架构揭秘

图片作为微博的核心内容元素,一直在微博内容战略中占有非常重要的地位,特别是近几年高质量移动拍摄终端的普及,越来越多用户倾向于用图在微博上表达自己的心情,态度和观点。微博的日发博量中,带图微博已接近60%。去年5月,随着微博多图功能上线,进一步强化了多媒体内容分享的用户体验。

微博图床作为整体承载微博图片内容的大规模技术平台,担负着微博图片上传,处理,存储,下载等核心业务逻辑功能。图床每日接收的用户图片上传已经超过3000万,总图片数已经超过100亿,并持续保持一个高速增长的态势。

 跨IDC的分布式存储系统

微博图床平台是一个跨IDC的大规模分布式对象存储系统,也是新浪第一个实现跨IDC多主写入容灾,以实现全网服务可用性的技术平台。跨IDC多主写入意味着任意一个数据中心故障,就可以快速切换容灾至其他可用数据中心。我们使用了一种内部叫做BOR的基于业务对象的复制协议,内部的最终一致性与实时代理结合,以实现用户端的强一致性。

微博图床跨IDC分布架构

图片的上传

当用户上传一张图片时,接收图片的首先是我们的Upload API服务单元,与Facebook等公司做法一样,为保证常用图的显示性能,我们对常见的图在这阶段做了预压缩,然后各种预压缩尺寸的图片会被保存到一个叫做iCache的高速缓存中。iCache是新浪自主研发基于SSD的持久化文件存储高速缓存缓冲系统,通过两个一致性哈稀环实现缓存的高可用。保存iCache成功后,同时同步写入相关异步消息语义,以实施异步的存储Checkin和远程的Replication。最终,图片数据会被存储到我们永久的存储单元,并复制到远端的异地数据中心永久存储。存储单元使用的是新浪自主研发的notfs用户态小文件存储系统,以解决传统文件系统目录索引查询带来的额外的磁盘IO开销,吞吐是传统方案的3倍,并能获得一致的常量低延迟访问。

图片的下载

用户端图片的显示有一个庞大的全球分布的CDN网络协助分发到用户的最后一公里,所以图床的图片下载部分实际上面对的是CDN网络的回源。当一张图片在CDN缓存miss的时候,请求就会落到图床的Download API服务单元。首先,iCache会被检查,如果存在,即可快速输出。然后是存储,如果存储亦不存在,意味着复制的图片还没有到位,会通过专有链路代理从图片的上传地取得图片。这样就保证了用户图片上传即可见的强一致性。当图片被取回后,配合业务端的呈现需求,部分图片仍然会被实时压缩成所需要的格式。

马年春节的挑战

30倍的突发峰值

微博与春晚的合作,不仅仅给网友带来线上线下多屏互动、红包飞的新年,给图床系统也是带来前所未有的挑战。根据业务值测算,图床峰值上行压力会达到日常峰值的30倍!对于一个可扩展系统而言,扩容是不二的选择,但对于一个已然超过1000个节点以上的大规模系统,扩容30倍,所投入的服务器绝对不是一个小数目,即使可扩,OP层面也会是一个庞大的工程。所以,首要的是短期内架构层面改进的空间。

压还是不压

通过模型和数据测算,要应对如此规模的上行压力,首先要解决的图片压缩的瓶颈。图片压缩的过程是一个CPU和内存消耗性的耗时逻辑,如果上传环节取消压缩,那自然是最优的方案,可问题是多屏时代,不同的渠道需要不同适配,对不同尺寸的需求是满足用户体验的关键。上传环节不压缩,意味着下载环节将承担更多的实时压缩负载,一个典型的两端平衡问题,压或不压都不能解决实际问题。

流水线式处理

对于大部分的互联网公司,传统的实时压图方案基本上都是Apache Prefork下用PHP的ImageMagick实时压缩,整个过程IO和压缩是在一个同步的周期内处理,导致CPU和内存资源都不可控,在高并发的情况下,压图效率急剧下降。为此,我们设计了一个基于流水线的在线图片处理系统webpress。webpress的基本原理是把图片压缩分stage,把图片的读取和输出这些可以异步化的IO操作与同步的压缩过程分离开,压图过程的CPU和内存资源得以量化控制和分配。从我们的测试数据看,高并发的时候采用webpress的方案,延迟保持基本稳定,而传统的方案会有一个大幅的延迟升高,性能下降明显(见下图)。

 

小而美的图像处理库

对压图这个重型逻辑本身的优化,也是整体得以提升的关键。开源的ImageMagick作为一款通用图像处理软件库,天生不是为了web应用而设计的。繁复的代码,臭名昭著的内存和临时文件泄漏问题,简陋的异常处理机制等等,当然还有性能问题。为此,我们重新设计了一个轻量级的图像压缩库webimg,利用延迟解码,JPEG预先重采样,加法替乘法,SIMD指令优化等手段和技术,压图性能比ImageMagic有近4倍的提升。同时webimg没有内存泄漏等问题,适合长期驻留在webpress进程中运行。webimg未来会增加对GPU CUDA的支持,并考虑FPGA集成的可能,目标成为一款互联网海量图片处理适用的图像压缩库。

结束语

微博春节的技术保障是一个系统工程,涉及到从基础设施到平台到业务的各个层面。对于微博图床而言,架构方面的优化和提升,可以帮助我们在短期资源受限的情况下高效的实现业务目标,而长线上是用户体验的提升和成本的降低。

— 新浪研发中心 微博图床团队 朱鑫(@stvchu)