一、Swift的存储服务框架
- Swift的目标
(1)保证数据存储的持久性、安全性与可靠性
(2)处理来自客户端的请求
(3)存储系统的管理 - 核心算法
(1)就是一致性Hash算法,主要根据目标存储机器排成的队列,由客户端根据一致性hash算法来考虑文件的存储地址
(2)我们忽略了文件的大小因素
(3)实际执行中,我们抽象了存储节点的名字,转化为文件的存储路径、具体的磁盘目录,都可以作为我们寻址的关键。 -
Swift的节点部署
(1)我们一般将Swift划分为代理节点Proxy Node 与存储节点Storage Node
(2)两类节点可以混合部署,也可以独立部署,非常灵活
(3)我们将负载均衡器指向代理节点,由代理节点分派存储路径
- Swift的局限性
(1)他类似网盘,读写、存取数据都是通过网络进行
(2)不支持实时的读写、编辑功能
可以理解为只是提供上传下载功能。
二、Swift存储服务的原理
- 原理剖析
(1)就是一致性HASH算法的应用的几个阶段 - 简单应用举例:
(1)找10个存储节点,按照编号排列好
(2)对存储的文件名对10取余,得出的结果就是要存储的节点,然后在节点上按照目录进行二次位置设定
(3)问题点:当新增一个节点的时候,按照同样的算法,数据必须迁移才能将正确的存储与取回数据。而且会涉及多个节点的数据迁移 - 中级应用举例
(1)找10个存储节点,按照环形排列,每两个节点之间设定存储文件的范围
(2)对存储的文件、服务器取得hash值,将HASH值取模,映射到圆环中,这样按照顺时针选择节点存储即可
(3)新增节点时,只需要以新增服务器为节点,逆时针出发,将遇到的存储数据迁移到新节点上,直到遇到其他存储节点,大大规避了大量数据迁移
(4)问题点:各节点存储文件的大小不可控,有可能不是均匀分布的 - 高阶应用举例
(1)继承环形的hash算法,打造一层虚拟节点。
(2)通过虚拟节点映射实体存储节点
(3)效果:数据到虚拟节点的路径很少发生变化,但是虚拟节点到实际节点的映射经常变化。有效的降低了数据迁移量及数据的存储均衡性 - 扩展
(1)一般会对数据存储采用3份的方式,防止单点故障的产生,保障系统性能
(2)将存储节点的大小转化为权重,按照权重的方式划分区间
三、总结
- 一致性hash算法很简单,我们需要解决的是增加节点后的数据迁移量问题以及数据的存储均衡性问题
- 最终的策略还是建立一个虚实映射的节点策略,并引入权重,保证数据的迁移量与存储均衡性问题
- 开源的分布式存储很多,例如淘宝的tfs与fastdfs都是类似的策略
(1)有的对于文件名做了限定,如文件名本身隐含了存储的服务器、以及磁盘目录
(2)配合nginx等应用服务器,就可以有效的组成一个高性能的图片存储服务了