zxshen 2019-11-18
在《从“软件”到“服务”——【对象存储】的发展历程(上)》中,我们和大家在对象存储大规模普及之前,大量的数据存储和处理是怎么实现的。但这些方案大都专注于解决其中一类问题,缺少足够的普适性。那么对象存储出现后,究竟解决了什么问题?优势又为何呢?
跟上一篇提到的各个软件相比,对象存储与之最大的区别不在于实现的机制,而在于形态从软件到服务的一个大飞跃。在这儿我想用一个可能不太恰当的比喻来说这事——传统的体重计。
不管是电子的还是机械的,他只是一个工具,我们评价的标准更多是价格、准确度、易用性、量程。而互联网的体重计,能帮你记录你的体重变化曲线,你关心的可能更多是数据联动、可视化、以及根据你的体重给出的建议。当然,如果你真的对减肥有强烈的需求,那么找一个合适的教练,由教练来指导你的减肥流程才合适,而互联网体重计只是教练手中的一个工具而已。
服务跟软件相比,有几个大的不同点:
作为一个部署在云端的服务,它的接口和实现是分离的,也就是说我可以在保持接口不变的情况下持续演化实现。我们可以想象一下第一次在 AWS S3 上传的数据还有一些直到今天也没有删除,但这些数据可能已经经历了很多代的硬盘(毕竟硬盘的寿命一般也就3-5年),以及很多代的存储引擎了。这也是与传统存储软件不同的地方,传统存储软件如果大幅度更改了架构,那么通常是以一个新的存储软件的形式来出现。
背后的原因至少有两点:
存储类的软件运维永远是一个问题,磁盘的寿命一般是3~5年,在3副本的情况下,1PB存储需要300块10TB硬盘,5年总共260周,也就是说,平均每周都要进行一次以上的硬盘更换操作。而采用对象存储,对应的麻烦一般交给服务供应商来解决。服务供应商一般会选择将坏盘留在机架上,等服务器到期后一次性销毁,来降低运维成本。此外,为了避免单机架、单AZ(Available Zone,可用区,一般一个AZ对应一个机房,两个AZ之间间距不低于20km,且不高于100km)故障导致数据不可用,一般还会采用一些反亲和策略,比如同一数据的多个副本,放在3个机架上,并且至少两个不同的AZ来存储。
跟运维相关的采购负担也是使用存储软件的一个大难题,在很多业务刚开始推广时,并不知道需要多少存储和上传带宽。如果按照上限准备,势必造成大量的浪费。如果准备不足,一旦存储用满,客户无法上传,就是影响运营的超大事故。而使用对象存储,这些问题都不再存在。
采用对象存储后,我们可以更方便地引入控制流和数据流分离。以一个UGC(User-generated content,用户生成内容,比如抖音、快手)类型的图片或者短视频网站为例,如果控制流和数据流不分离,那么为了提供用户访问网站的体验,我们需要租赁优质的多线BGP机房,这类机房的带宽成本非常昂贵,而图片和短视频的带宽需求巨大(主要是上传所需的带宽和CDN回源所需的带宽),造成总成本过高。如果把图片/短视频相关的上传和CDN都挪到对象存储服务商,只把控制相关的部分保留在昂贵的多线BGP机房。首先是上传基本免费,如果租赁同一个服务商的CDN,CDN回源费用也可以打折,而上传、下载的质量保证则由服务商去做保证,在获得足够质量的同时能大幅度节省费用。由于对象存储一般提供各类回调功能和转码功能,所以你原有的功能需求一般也能通过架构微调来满足。
除此之外,对象存储服务还能提供完全无缝的迁移方案,利用镜像存储等功能,可以做到在迁移时,终端用户完全无感知。比如从原始存储站点A迁移到对象存储B,一般步骤如下:
当然实际情况可能会更复杂,比如还涉及到图片转码等功能的迁移。
图片和音视频处理算是很有中国特色的一个对象存储的扩展了,这也跟中国的对象存储发展跟富媒体网站的兴起时间重叠有一定的关系。基于对象存储的富媒体处理的好处不仅仅在于简化了使用流程,免除了客户自己维护图片转码集群负担,还大幅度降低了图片相关的安全风险。众所周知,图片相关的 libjpeg, libpng 等库是安全漏洞的重灾区,UGC类的业务很难避免黑客上传恶意图片来攻击。对象存储的供应商能使用的手段也不仅仅是紧盯CVE及时升级,还包括了使用容器来加固转码引擎,定期清理容器来避免APT攻击等手段。
综上所述,采用对象存储,跟采用存储软件相比,最主要的收益来自于运维负担、采购风险转移给了对象存储供应商,其次的收益还包括更灵活的架构于使用方式。其实对象存储的功能还有很多,如果对象存储兼容常用的
S3 协议的话,对应的生态也很强大,不仅有大量的工具,常见的框架一般也有S3的支持。
从“软件”到“服务”——【对象存储】的发展历程(上)
*点击“免费试用”免费领取京东云10GB对象存储额度
欢迎点击“链接”了解京东云更多精彩
java的内存管理就是对象的分配和释放问题。但同时,它也加重了JVM的工作。因为,GC为了能够正确释放对象,GC必须监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等,GC都需要进行监控。