ceph将cluster map与placement rule合并为一张表称为crush map,作为集群表的一部分。cluster map定义了存储集群的物理拓扑描述placement rule完成数据映射,即决定一个PG的对象副本如何选择的规则,用户可自定义副本在集群中的分布。
placement rule模板如下
rule <rulename> {
id [ a unique whole numeric ID ]
type [ replicated / erasure ]
min_size <min-size>
max_size <max-size>
step take <bucket-name> [ class <device-class> ]
step [ choose / chooseleaf ] [ firstn / indep ] <number> type <bucket-type>
step emit
}
placement rule示例及字段含义如下
rule data {
ruleset 1
type replicated
min_size 1
max_size 10
step take default
step chooseleaf firstn 0 type host
step emit
}
字段含义
ruleset为该条placement的编号
type选择是replicated多副本类类型还是erasure纠删码类型
min_size副本最小个数
max_size副本最大个数
step take选择一个级别的桶作为输入(即寻找该桶下的osd存储数据),应用这条rule的都把数据写在该桶下
[choose|chooseleaf]:choose操作有不同的选择方式
1.choose选择出num个类型为bucket-type的子bucket
2.chooseleaf选择出num个类型为bucket-type的子bucket,然后递归到叶子节点选择一个osd设备
firstn多副本,indep纠删码
type故障域的类型,如果为rack,保证选出的副本都位于不同机架的主机磁盘上,如果为host,则保证选出的副本位于不同主机上。
step emit输出将要分布的节点列表
placement rule执行流程
ceph是分布式存储,每个数据块的数据备份是3份,3份数据如何分布?ceph的placement rule就是解决数据分布规则的问题。
应用端直接使用的是池pool,pool是由存储的基本单位pg组成,pg分布在磁盘逻辑单元osd上,osd对应一块物理硬盘,osd分布在物理主机host,host分布在机架rack中,机架rack分布在机柜阵列raw中,层级结构为->pdupod->room->datacenter 。其中host/rack等等在ceph属于中叫做bucket(桶)。 如果每个数据块的备份是3份,3个基本数据单元需要存放到3个pg中,这个时候就需要根据使用的rule,即确定使用哪3个pg。cursh算法依赖straw2算法实现对pg的映射,输入pg_id、cluster map、placement rule,与随机因子经过哈希计算,输出一组osd列表,即该pg要落在的osd编号。当选出的osd有出现冲突或过载时,需要舍弃并重新选择。
冲突:指选中条目已经存在于输出条目中,如osd.10已经存在于输出列表中,下一个经计算同样选出了osd.10,此时需要调整随机因子,再次计算进行选择。
过载或失效:指选出的OSD无法提供足够的空间来存储数据,crush算法理论上可以让数据在所有设备(磁盘)中均匀分布,但实际并没有这么理想:小规模集群的pg数量较少,则crush输入的样本容量不够,导致数据计算分布不均匀;同时crush自身对于多副本模式数据均匀分布做的不够完善。ceph引入过载测试reweight可人工干预对osd的选择概率,reweight的值设置的越高,被选中的概率越高,因此可以通过降低过载osd的reweight和增加低负载osd的reweight来使得数据均衡。
常用命令
创建placement rule
ceph osd crush rule create-simple <rule_name> <root_name> <type_name> <mode_name>
示例ceph osd crush rule create-simple newRule default host firstn
显示rule
ceph osd crush rule dump