分布式存储入门

不想你离开。 提交于 2019-12-21 23:37:23

根据阿里云《分布式文件存储系统技术及实现》整理而成。

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

用户存入内存直接返回,对内存建立索引,数据连续存储到内存中,异步进行持久化。读取根据内存索引。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!