【混合存储】

混合存储原因是要根据不同存储介质合理使用,提高存储系统性能的同时又不会太大的增大成本。
例如,
(1)HDFS中可以将一个副本放在SSD中,其他副本放在磁盘上。
(2)阿里的盘古文件系统中,后台程序定期将SSD上记录的多次随机写合并成一次批量写,将数据写入到HDD的chunk replica文件中,这样能在一定程度上降低写的延迟。
(3)RAMCloud内存存储方案同盘古的混合存储方案比较接近,最明显的不同点是将SSD换成了内存存储。 当数据写入是,所以数据均写入到内存,为了高效利用内存,采用了连续记录日志的方式将数据存放在内存中。同时将数据按照数据所属应用进行划分,分别建立索引,方便对数据进行随机访问。由于内存存储的易失性,所以需要将内存中的数据以异步方式保存到磁盘中。 这种实现策略非常适用于分布式的cache服务,可以充分利用内存的高带宽和低延迟,但是在分布式环境中需要同时配备高速网络,否则其威力得不到发挥。
从上面的例子可以看到,混合存储技术基本是利用高性能小容量高成本的介质来作为低性能大容量低成本的cache来满足业务需求。

Posted in BigData

【元数据管理的高可用性和可扩展性】
(1)高可用:单个节点出现问题,服务仍旧可以用。
(2)可扩展:分布式做法线性提高扩展能力。

通常的做法是可以将这些节点做成多个备份,保证在一个备份出现问题的时候,仍然可以提供服务。但是多个备份间需要维护数据一致性,防止服务切换造成的数据不一致或者丢失。

【高可用性方案】

方案一:
HDFS中元数据的高可用性方案是引入了分布式锁服务ZooKeeper,每个NameNode的FailoverController来维护分布式锁状态,在出现锁丢失的情况下,触发主备切换。主NameNode将操作日志写入到共享数据存储的设备上,这样的设备可以是有DRBD功能的磁盘或者NFS系统。
这个实现方案相对简单,因为较复杂的功能都放到了锁服务和共享存储系统中。这样的做法也是非常经济实惠的,复杂性均由分布式系统的单个模块来维护,其他服务进行依赖,这种做法降低了软件的实现难度和维护工作量。

方案二:
阿里的盘古分布式文件系统Meta server之间采用了Paxos的特化Raft实现数据选举和同步,可以存在多个master的备份。

方案三:
在Ceph系统的元数据管理模块MDS从原理上来说使用了共享存储,每个MDS有一个Standby进程作为热备。但是其独特之处在于是利用了OSD同Ceph monitor组成的RADOS最为共享存储,这样的实现方法即保证了元数据管理的高可用,又提供了无限可扩展的能力,同时可以不依赖于其他系统做到了独立自包含。

【可扩展性方案】
方案一:
HDFS的可扩展性,Namespace切分的Fedeation。在HDFS Federation中NameNode的扩展性依赖于目录树的静态切分,每个目录子树被称为一个Volume,并将切分后的Volume分配到不同的NameNode上。DataNode则作为数据存储池,被所有的NameNode共享使用。为了让客户端可以找到某棵树中的节点,在client端需要加载ClientSideMountTable,这里记录了目录树同NameNode的对应关系,用户使用文件名访问元数据时,客户端首先用文件名从MountTable中获取NameNode的服务端口后,再发送元数据请求。
Federation的这种做法简单高效,静态划分的方法需要提前对各个NameNode未来元数据量有比较准确的估计,否则很容易造成各个NameNode间元数据的不平衡,给整个存储系统带来瓶颈。 盘古系统采用了同HDFS一样的解决方案,在实现过程中对应每个HDFS中的NameNode会部署一组盘古多master。盘古Federation除了用MountTable让用户透明访问系统外,还提供了新的访问方式。用户可以在文件名前指定Volume名称,这样可以绕过mount table的访问直接请求到某组盘古master上,这个功能可以有效防止集群中大量进程短时间启动时集中获取mount table带来的流量冲击。为了应对元数据不均衡的问题,盘古提供了在两个Volume间的元数据迁移工具。

方案二:
Ceph系统的MDS的扩展性用动态分裂功能实现,分裂依据是目录或者文件的请求频率。当用户请求某个路径的时候,将路径中的每个目录以及最终末端的节点或者目录上的请求统计值增加,然后通过定期来计算每个MDS中目录的请求频率来决定是否已经超过了MDS的负载而需要动态分裂。分裂过程中源MDS会元信息发送给目标MDS,并分别记录迁移日志。
这种动态分裂的方式可以有效解决局部访问热点带来的性能瓶颈,在元数据规模和处理能力方面都做了扩展,是比静态划分方法更好的设计和实现方式。

Posted in BigData

【Erasure Coding编码】
多拷贝存储:存储多份。恢复代价低,存储代价高
Erasure Coding编码(纠删码):多个数据块和编码块。恢复代价高,存储代价低。

Posted in BigData

【数据正确性 checksum】

在集群中网络、内存、磁盘和软件都有可能导致数据错误,那么在分布式存储系统中如何保证海量数据中没有任何数据错误呢?
(1)数据应该给全程保护,否则任何一个环节出现问题导致数据错误未被检查到,都可能会导致数据出错。
(2)被保护的数据至少应该具有数据、数据长度和CRC校验值这样的三元组,而且在任何后续的处理中,都应该先对数据进行处理后,再校验这个3元组的一致性,来保证刚被处理过的数据是正确的。

在数据进入系统前,有checksum保护。否则数据在系统内部传输,则可能出现错误。

【数据可靠性 Replication】

(1)当机器/磁盘出现异常,通过其它副本快速恢复。
(2)充分利用多台机器的复制带宽。
(3)实际系统中,应考虑复制的优先级以及复制的流量控制。
通常会按照数据的剩余拷贝来计算复制的优先级。
剩余拷贝数量越少的数据应该优先被复制。
优先级高的数据流量复制也不能超过复制流量限制。

【数据均衡 Rebalance】

(1)当有新的机器/磁盘上线时,迁移数据保证负载均衡。
(2)充分利用多台机器的复制带宽。
(3)实际中,也需要考虑控制因为负载均衡而导致复制优先级和流量控制。

【垃圾回收 Garbage collection】

两种情况垃圾:
(1)用户数据删除,遗留在系统中的垃圾。脏数据,异步逐步回收。
(2)用户写入过程异常,或系统复制数据异常,导致多余数据产生。

Posted in BigData

【IO QoS】(服务质量)

问题:当多个用户访问存储系统时如何保证优先级和公平性
阿里盘古文件系统中采用的方案:
(1)将IO请求按优先级分成多个类别,每个类有相应的权重表示该类请求占用IO带宽的比例
(2)IO请求根据分类放入相应的队列,队列内根据队列限制和任务做调度和丢弃
(3)调度器根据相应权重从队列取出请求进行调度

Posted in BigData