CRUSH 图主要有 4 个主要段落
设备 由任意对象存储设备组成,即对应一个 ceph-osd 进程的存储器。 Ceph 配置文件里的每个 OSD 都应该有一个设备。
桶类型: 定义了 CRUSH 分级结构里要用的桶类型( types ),桶由逐级汇聚的存储位置(如行、机柜、机箱、主机等等)及其权重组成。
桶例程: 定义了桶类型后,还必须声明主机的桶类型、以及规划的其它故障域。
规则: 由选择桶的方法组成。
规则格式如下:
rule {
ruleset
type [replicated | raid4 ]
min_size
max_size
step take
step [choose | chooseleaf] [firstn|indep ]
set emit
}
ruleset
Description: 区分一条规则属于某个规则集的手段。给存储池设置规则集后激活。
Purpose: 规则掩码的一个组件。
Type: Integer
Required: Yes
Default: 0
type
Description: 为硬盘(复制的)或 RAID 写一条规则。
Purpose: 规则掩码的一个组件。
Type: String
Required: Yes
Default: replicated
Valid Values: Currently only replicated
min_size
Description: 如果一个归置组副本数小于此数, CRUSH 将不应用此规则。
Type: Integer
Purpose: 规则掩码的一个组件。
Required: Yes
Default: 1
max_size
Description: 如果一个归置组副本数大于此数, CRUSH 将不应用此规则。
Type: Integer
Purpose: 规则掩码的一个组件。
Required: Yes
Default: 10
step take
Description: 选取桶名并迭代到树底。
Purpose: 规则掩码的一个组件。
Required: Yes
Example: step take data
step choose firstn {num} type {bucket-type}
Description: 选取指定类型桶的数量,这个数字通常是存储池的副本数(即 pool size )。
如果 {num} == 0 选择 pool-num-replicas 个桶(所有可用的);
如果 {num} > 0 && < pool-num-replicas 就选择那么多的桶;
如果 {num} < 0 它意为 pool-num-replicas - {num} 。
Purpose: 规则掩码的一个组件。
Prerequisite: 跟在 step take 或 step choose 之后。
Example:
step choose firstn 1 type row
step chooseleaf firstn {num} type {bucket-type}
Description:
选择 {bucket-type} 类型的一堆桶,并从各桶的子树里选择一个叶子节点。集合内桶的数量通常是存储池的副本数(即 pool size )。
如果 {num} == 0 选择 pool-num-replicas 个桶(所有可用的);
如果 {num} > 0 && < pool-num-replicas 就选择那么多的桶;
如果 {num} < 0 它意为 pool-num-replicas - {num} 。
Purpose: 规则掩码的一个组件。 它的使用避免了通过两步来选择一设备。
Prerequisite: Follows step take or step choose.
Example:
step chooseleaf firstn 0 type row
step emit
Description: 输出当前值并清空堆栈。通常用于规则末尾,也适用于相同规则应用到不同树的情况。
Purpose: 规则掩码的一个组件。
Prerequisite: Follows step choose.
Example: step emit
Important: 把规则集编号设置到存储池,才能用一个通用规则集编号激活一或多条规则。
某一Ceph 客户端读写数据时,总是连接 acting set 里的主 OSD (如 [2, 3, 4] 中, osd.2 是主的)。有时候某个 OSD 与其它的相比并不适合做主 OSD (比如其硬盘慢、或控制器慢),最大化硬件利用率时为防止性能瓶颈(特别是读操作),你可以调整 OSD 的主亲和性,这样 CRUSH 就尽量不把它用作 acting set 里的主 OSD 了。
ceph osd primary-affinity
主亲和性默认为 1 (就是说此 OSD 可作为主 OSD )。此值合法范围为 0-1 ,其中 0 意为此 OSD 不能用作主的, 1 意为 OSD 可用作主的;此权重小于 1 时, CRUSH 选择主 OSD 时选中它的可能性低。