根据阿里云《分布式文件存储系统技术及实现》整理而成。
1 分布式存储的客观需求
- 存储容量大
考虑对1PB数据进行排序,输入输出都需要1PB,算上中间临时数据,总共需要3-4PB。考虑多用户使用,则集群需要的总的存储空间大于100PB。
-
高吞吐量,如1PB数据排序需要在2小时内完成,每秒需要几十GB
-
数据可靠性,在数据规模增长时,降低数据丢失
-
服务高可用,99.95%意味着每年每年只有4-5小时不可用
-
高效运维,将日常硬件处理做成流程化,对监控报警要有完善支持
-
低成本,保证数据安全,正确服务稳定前提下,降低成本,才是分布式存储的核心竞争力
2 小概率事件对分布式系统挑战
单机系统下很少发生的事件,在大规模分布式系统中就会经常发生。
可能发生的小概率问题有:
1 磁盘错误
单机下运行稳定,集群下可能出现频繁。要考虑如何发现慢节点自动规避,发现机器宕机自动绕过。
2 Raid卡故障
发生在高可用节点上的事件。Raid卡是带有电池的缓存块,写入速度很快,能够在断电时保存数据。利用raid卡先缓存数据,之后再写入磁盘中。
3 网络故障
网络架构是一种树形结构,通过顶层交换机连接下层交换机,交换机下连接多台机器。
当上连交换机节点出错时,一部分主机将与其他主机分离,无法发挥作用。
可以将关键角色分布在不同的交换机下,将数据存储多份,某些机器失效时还可以访问到数据。
4 电源故障
由于在数据存储时为了保证速度,通常会先把数据写入MemCache中,然后返回OK响应。但是此时数据并没有持久化存储,当断点故障发生时,需要保证数据能够存储下来。丢失后如何修复也是问题。
5 数据错误
可能出现在磁盘,网络,内存保存过程中等。
可以用CRC校验等方式提供校验手段,保证数据正确性。
6 系统异常
Linux系统时钟每台机器不同,需要NTPserver来进行同步,但是在同步过程中,机器上可能出现时钟跳变,对数据造成异常。
Linux将所有设备抽象为文件,当某个磁盘出错,会影响到网络,内存等各个设备
7 热点
当某个用户使用某个资源很满时,会使机器负载很高从而可能宕机,并且热点是可能不断迁移的。
8 软件缺陷
如果软件设计时没有考虑分布式系统特点,可能造成问题。
如当进程失败时或出错重试时,切换文件,会造成Meta Server中的Meta越来越多,造成内存溢出。
当Data Server重启时会向Meta Server进行Block Report数据汇报,当多台机器人同时重启时,会造成Meta服务不可用等问题
将分布式系统当做单机系统可能会造成服务不可用
9 误操作
人为的操作失误等
3 常见分布式系统
HDFS
开源架构,分三个模块。
nameNode,存储meta信息,存储了文件名,文件长度,位置信息等
datanode,保存实际的数据,集群模式
client端,提供appendonly协议,稳定性比较好
namenode只传输控制信息,流量小,DataNode流量大,但是是分布式集群的
Ceph
用于块存储的架构。
osd是对象存储单元,monitor是监控单元,当osd发生故障时,monitor会发起数据复制。
上层有mds模块,用于存储对象的meta信息,对外呈现文件系统。在Linux内核开发了专门的模块,并提供了rest接口,有自己的gateway,能够很好地访问。
没有中心节点,稳定性比较好。
Pangu
阿里云开发
架构和hdfs相似,但是namenode是集群的,具有很多特性
安全访问认证
Checksum
配额管理和审计
数据多备份
异常恢复机制
磁盘自动上下线
回收站
热升级
动态扩容/缩容
数据聚簇
流控和优先级
在线监控离线分析
热点和慢盘规避
混合存储
4 分布式存储设计要点
1 写入流程
链式写入
client端发送写请求到master,master返回写入地址数组。client向第一个写地址节点写入数据,第一个节点再向后继续传输,到达最后一个节点后,向前返回写入OK响应,最终回到client端,写入结束。
可以充分利用网络流量,适合从集群外导入数据。但是延迟会比较大。高吞吐量,高延迟。
链式异常写入
在链式传输中,节点2故障,导致节点1无法向下传输,此时可以采用
- 跳过节点2,直接传给节点3,减低数据安全性,提高传输成功率
- 新增节点4,传给节点3之后传给4,提高数据安全性,减低传输成功率
- seal and new,重新从master获得新的地址列表,向新的地址列表传输,但是chunk长度不定,meta增多等
主从模式
使用星型辐射方式传输,从primary CS向多个Replica CS传输,所有Replica写入成功后,primary CS返回成功响应。
减少了延时,但是网络利用率低,对流量较高的应用不合适。网络链路短。
2 读流程
-
向mater获取读取的节点列表,每个节点都是数据的一个副本,读取任意一个成功即可。如果失败,则尝试下一个节点。延迟会比较大。
-
backup read 同时访问返回的所有副本节点,收到一个成功返回后,发送cancel命令,终止其他请求。可能造成IO浪费。
-
建立响应时间列表,估算每个节点的返回时间。从master获得列表后,先选择时间最短的节点访问,如果失败或超时,继续下一个最短的,成功之后更新响应时间列表。能够找到最优节点,绕开热点。
3 QoS
多用户下的QoS保证
将用户请求放入不同优先级的队列中,从不同队列中取出请求进行处理。
在同一个队列中,不同用户发起请求的数量不同,此时通过记录请求数量设计平衡方法,避免同一个用户占满队列。
4 checkSum
每一段数据会生成一个三元组,包括数据buffer,length,CRC值。
在网络传输时进行分包,每个分包也会生成一个三元组,在保存到磁盘时也会保存CRC值。在各个阶段都保证校验机制。
CRC可以和数据存储在一起,访问速度快,但可能同时出错,相互验证。
分离存储,需要两次访问磁盘。
5 Replication
防止机器损坏时,数据备份不够丢失。需要在磁盘错误时及时复制数据。对于出错机器上的数据快速恢复。查找所有可复制的源,向尽量多的目的复制,充分利用每台机器的流量。数据复制时,根据数据丢失的危险性设置不同优先级。
在复制数据过程中,需要流量控制,避免因为复制数据造成集群不可用,引起更大问题。
trunk server ———盘古master之间用心跳机制
6 Rebalance
数据均衡和数据备份的区别在于,数据安全性。
新增机器,负载不均衡。
需要充分利用多台机器的带宽,复制要有优先级,流量控制要严格。
7 GC
什么时候需要垃圾回收?
-
数据被删除时,通常采用异步方式,被删除数据要垃圾回收
-
数据写入失败,脏数据留在磁盘上,数据版本升级后,存在的旧版本需要回收
-
机器宕机,发现数据拷贝数不够,数据恢复后数据拷贝数量多
8 Erasure Coding
数据压缩
对于m份用户数据,计算出n份编码块,总共占用存储空间m+n,存储效率优于多份复制的效率
并且m+n份数据中,允许n份数据全部丢失,安全性更高。丢失的数据可以通过相邻的数据块和编码块进行恢复。一般用于冷数据存储中。
5 元数据的高可用和拓展性
1 高可用性方案
主从方式
一个主服务器,其他为从服务器,通过锁互斥技术进行选举
数据一致性通过共享存储,主节点将数据更改日志保存到共享存储,从节点根据协议进行更新
主从方式需要依赖其他模块,如分布式锁
盘古采用主从模式,通过选举方式确定主节点
Ceph也是处从模式,通过心跳进行切换,自身具备共享存储能力
分布式协议
Paxos/Raft协议,完成切换和状态同步,不依赖其他模块,能够自包含
Paxos协议的关键点
-
大多数协商一致
-
两阶段协商协议
-
协议号递增且需要持久化
proposer接收用户请求,发起prepare请求到acceptor,如果大多数节点同意请求,则返回成功。
Paxos协议很复杂,很少使用。Raft协议是对Paxos的简化。
2 可拓展性
HDFS NameNode可拓展性
通过对目录树的切换,使各个目录树之间隔离,从而进行拓展
Ceph MetaData Server
基于MDS切换,有效解决了元数据水平拓展能力。实际使用较少
6 混合存储
不同介质的存储特性
磁盘 | SSD | 内存 | |
---|---|---|---|
容量 | 1-4TB | 400-800GB | 24-128GB |
延时 | 10ms | 50-75us | 100ns |
吞吐 | 100-200MB/s | 400MB/s | 20GB/s |
成本 | 低 | 中 | 高 |
本地存储加内存来实现最高的性能
HDFS的混合存储
DataNode将本地的SSD和SATA磁盘会区分开,暴露给用户磁盘信息,用户可以选择数据存储在不同的介质上。
NameNode上会划分不同的volume,对应不同的存储介质
盘古混合存储
用户存储直接缓存到SSD,后台再拆分存储到不同介质上,用户感知不到磁盘介质
RAMCloud
用户存入内存直接返回,对内存建立索引,数据连续存储到内存中,异步进行持久化。读取根据内存索引。
来源:CSDN
作者:伊库塔花花
链接:https://blog.csdn.net/chinamen1/article/details/103647512