意义

Rules set 用以确定一个存储池里数据的归置。对大型集群来说,会创建很多存储池,且每个存储池都有它自己的 CRUSH 规则集和规则。例如为了区分不同存储介质的 Pool 分别将数据存放到 SSD 跟 SAS 的介质磁盘。或者创建一条规则用以选择一对目的地做双路复制等。

格式

rule <rulename> {
        ruleset <ruleset>
        type [ replicated | erasure ]
        min_size <min-size>
        max_size <max-size>
        step take <bucket-type>
        step [choose|chooseleaf] [firstn|indep] <N> <bucket-type>
        step emit
}

字段解析:

字段 描述 类型 默认值
ruleset 区分一条规则属于某个规则集的手段。
给存储池设置规则集后激活。
int 0
type 规则类型,仅支持 replicatederasure str replicated
min_size 选择此规则的存储池最小副本数 int 1
max_size 选择此规则的存储池最大副本数 int 10

后面的是 select 语句:

  • step take <bucket-name>:选取起始的 bucket 名,并迭代到树底
  • step choose firstn {num} type {bucket-type}:选取指定类型 bucket 的数量
    • {num} == 0 选择 pool-num-replicas 个(所有可用的)
    • {num} > 0 && < pool-num-replicas 就选择 {num}
    • {num} < 0 选择 pool-num-replicas - {num}
  • step chooseleaf firstn {num} type {bucket-type}:选择 {bucket-type} 类型的一堆 bucket,并从各 bucket 的子树里选择一个叶子节点(OSD)
    • {num} == 0 选择 pool-num-replicas 个(所有可用的)
    • {num} > 0 && < pool-num-replicas 就选择 {num}
    • {num} < 0 选择 pool-num-replicas - {num}
  • step emit:输出当前值并清空堆栈。通常用于规则末尾

例如:

选择 ssd bucket 下面存储池副本数个 host 类型下的各一个 OSD。

step take ssd
step chooseleaf firstn 0 type host
step emit

选择 ssd bucket 下面存储池副本数目个 rack 类型下的各一个 host 下的一个 osd。

step take sas
step choose firstn 0 type rack
step chooseleaf firstn 1 type host
step emit