正文
Directory模块
Directory是wos的中枢模块,负责文件元信息的存储以及数据的智能调度功能。Directory同样无状态,易于横向扩展,文件元信息存储在58自研的分布式kv存储系统wtable中。写请求到来时,Directory为该请求通过调度算法分配数据将要存入的store和volume,同时,将调度信息以及文件元信息存入wtable;读请求到来时,directory根据文件查找数据存入的store及volume并交给proxy进行后续处理。
调度算法的设计是分布式存储系统的关键,它涉及到数据的分布策略,后期运维成本等。在设计WOS的调度算法时,我们调研业界流行的分布式存储系统的调度算法, 一致性hash算法是常用的数据分布算法,这种技术对比传统hash算法,虽然可以减少设备增减时移动数据的量,但还是需要进行相应的数据移动;而且这些算法通常不能将机器的当前状况作为调度参考因素。我们希望能够将机器的磁盘容量,写入延时等信息作为算法的参考,同时在增减机器时不要引起原有数据的迁移,在这种情况下,我们重新设计了WOS的调度算法,以volume为单位进行分配,根据store以及volume的实时状态计算出每个volume的权重,根据权重大小进行调度,具体的调度算法我们参考了nginx的平滑加权轮询算法实现,防止新加入的Volume被立刻调度到大量请求而导致负载瞬间增大。
Detector模块
Detector模块用于探测集群内所有store以及store下所有volume的状态,这些状态包括store是否可以读写,volume是否可读写, store下所有volume的剩余容量,写入次数以及写延时等信息,detector将这些信息写入到etcd的相关目录,是directory模块调度算法的数据来源。
二.
让数据飞——WOS“秒传”功能设计
由于某些业务的应用场景,会存在以下情况:
-
上传的文件在内容上有很多都是相同的;
-
文件上传过程由于网络等原因中断后需要重新上传。
针对以上情况,我们设计了WOS“秒传”功能,给客户端提供的sdk中增加precheck接口,同时在服务端增加引用计数功能,具体方案如下:
客户端实现