CRUSH(Controlled Replication Under Scalable Hashing)
它是一种基于伪随机控制数据分布、复制的算法。
数据分布式算法的要求:
数据分布和负载均衡
首先要让数据分布均匀,使数据能均匀的分布在各个节点和磁盘上。其次是负载均衡,使数据访问(主要是读写操作)的负载在各个节点和磁盘上的负载均衡。
灵活应对集群伸缩
系统可以方便的增加或者删除存储设备(包括节点和设备失效的处理)。当增加、删除存储设备后,能自动的实现数据均衡,并且迁移的数据尽可能的少
支持大规模集群
为了支持大规模的存储集群,要求数据分布算法维护的元数据相对较小,并且计算量不能太大。随着集群规模增加,数据分布算法的开销比较小。
基本原理
CRUSH算法根据种每个设备的权重尽可能概率平均地分配数据。分布算法是由集群可用存储资源以及其逻辑单元的map控制的。这个map的描述类似于一个大型服务器的描述:服务器由一系列的机柜组成,机柜装满服务器,服务器装满磁盘。数据分配的策略是由定位规则来定义的,定位规则指定了集群中将保存多少个副本,以及数据副本的放置有什么限制。例如:可以指定数据有三个副本,这三个副本必须放置在不同的机柜中,使得三个数据副本不公用一个物理电路。
给定一个输入x,CRUSH 算法将输出一个确定的有序的储存目标向量。当输入x,CRUSH利用强大的多重整数hash函数根据集群map、定位规则、以及x计算出独立的完全确定可靠的映射关系。CRUSH分配算法是伪随机算法,并且输入的内容和输出的储存位置之间是没有显式相关的。可以说CRUSH 算法在集群设备中生成了“伪集群”的数据副本,集群的设备对一个数据项目共享数据副本,对其他数据项目又是独立的。