最近知乎上有个问题,分布式存储是什么?我做对象存储有一阵了,最开始只知道一些零散、分离的概念;随着开发、维护系统,慢慢的有了一些感觉,能在脑海中慢慢建立一些模型,将之前的了解的概念缀连起来;随着看的论文、开源系统越来越多,逐渐将这些连通分支勾连起来,形成一个小网。
总的来说,我们理解一个概念时,总会试图找到某个角度,并在脑中建立一个模型,以熟悉的模子去刻画他。下面以我一些浅薄的经验,从两方面来解释下分布式存储:用户侧和实现侧。因为在软件领域有个经典的拆解问题的角度:接口和实现分离。
用户侧
从用户侧来说,单个应用的数据越来越多,廉价商用单机存储难以满足。不断增大单机存储容量是一种思路,但是成本会成倍上升,而且总有上限。另一种思路就是集合很多机器对外提供服务。最传统的接口是文件系统和数据库,但其接口都较为复杂,实现不易。因此在分布式存储系统诞生之初,会寻求简化接口,以将精力放在处理分布式系统的带来的复杂性上。最早摸到数据存储瓶颈的大厂都有类似的选择,比如 Google 裁剪的文件系统 GFS,比如 Amazon 的对象存储 S3,比如 Facebook 的小文件存储 Haystack。随着分布式系统实践经验的不断累积,可以支持更复杂的接口实现,最近趋势是提供更丰富的接口以满足不同场景需求,比如满足缓存的分布式 KV(Tair,TiKV),满足通用需求的分布式文件系统(GlusterFS,CephFS,JuiceFS),满足关系存储的 NewSQL(TiDB,PolarDB)。
实现侧
从实现侧来说,数据如何分散到多机上去?最基本的分布式解决办法是将数据按一定尺寸进行分片(Partition),使得一个分片能被任何单机存下。当然在实现中,分片一般会更小。随着数据越来越多,分片会越来越多,需要的机器也就越来越多。但硬件有良品率和老化问题,单机发生概率虽然不大,但在海量机器的场景下就会成为问题。为了保障数据不丢,需要将每个分片做冗余处理,包括EC编码(纠删码)和多副本(replication)。多副本数据如何做同步,这又会引出分布式系统中经典的一致性问题。再展开就略晦涩了,有兴趣可以探讨。
小结
总结一下,从底层实现来看,分布式存储将数据存到多台机器上,并且解决可用性、可靠性和一致性等问题,近年来有很多实践经验,也慢慢沉淀出来了一些模式。以这些通用实现为底座,可以包装出不同的用户接口,比如文件系统,关系型数据库,对象存储等等,以满足不同用户海量数据的分布式存储、查询、处理等多元需求。
题图故事
2021 初春,北京居庸关隘,山桃盛开,粉团如雾