[ceph学习-7]crush算法(2)

层次化的Cluster Map:

Cluster Map由设备(device)和桶(bucket)组成,他们都有数值型的标识符(id)和权重(weight value)。bucket可以包含任意数量的devices或者其他buckets,使他们形成存储的树状结构中的内部节点,device总是这个树结构的叶子节点。管理员对存储设备赋予权重,控制该device的相对数据的存储能力。尽管一个大型系统往往包含了存储能力和性能特点不尽相同的设备,但是随机的数据分布,在统计意义上将device的使用情况与负载(load)关联起来,可以将设备的负载占总体的比例保持在平均的水平上。这就使得这个描述数据放置规则的权重是取决于设备容量的。而bucket的权重则是其包含的所有项(item)的权重之和。

bucket 可以以任意形式组织成树型结构来描述可用的存储结构。数据通过类似伪随机的散列函数递归选择嵌套项目,将数据放到层次结构中。在传统的散列技术下,任何目标设备数量的改变,都会导致一次很大规模的数据迁移,相比,CRUSH以及四种不同的bucket type。每种有不同的选择算法,来解决增删device时导致数据移动和总体计算的复杂度。

副本分布策略
CRUSH的设计使得数据均匀的分布在带有权重的device上,在统计意义上保持了device和bandwidth(带宽)的均衡,副本在树形结构的存储device的分布影响着数据的安全。通过对于系统本质的物理结构的映射,CRUSH能够建模,从而定位潜在的相关设备的故障源。典型的故障源包括物理位置上接近、共享电源、共享网络。通着将这些信息反映给Cluster Map中,CRUSH placement policies (位置策略)能够将对象副本发布在不同的区域(故障域)中,同时维持预期的数据分布形式。例如,为了应对出现并发故障的可能性,也许会需要确保数据副本在不同的机架、机柜、电源、CPU、位置的device上。
CRUSH可以被用于不同的数据副本策略和不同的硬件配置下,为了适应这样的场景需求,CRUSH为其适应的每个副本策略或placement policies 定义placement Rule.以保证系统或管理员可以确切的指定副本如何定位。
每条规则包含用户简单执行环境的用户树形结构的指令序列,这些操作包括:
tack(a).选择一个item(a),一般是bucket,并返回bucket所包含的所有item。这些item是后续操作的参数,这些item组成向量i;
select(n,t);迭代操作每个item(向量i中的item),对于每个item(向量i中的item)向下遍历(遍历这个item所包含的item),都返回n个不同的item(type为t的item),并把这些item都放到向量i中。
select函数会调用c(r,x)函数,这个函数会在每个bucket中伪随机选择一个item.
emit:把向量i放到result中。

存储设备有一个确定的类型,每个bucket都有type属性值,用于区分不同的bucket类型,如(“row”,”rack”,”host”等。type也可以自定义)。rules可以包含多个tack和emit语块,这样就允许从不同的存储池中选择副本的存储目标。

发表评论

您的电子邮箱地址不会被公开。