2.7. CRUSH 规则
CRUSH 规则定义 Ceph 客户端如何选择 bucket 以及其中的 Primary OSD 来存储对象,以及主要 OSD 选择存储桶和次要 OSD 以存储副本或编码区块的方式。例如,您可以创建一个规则,为两个对象副本选择由 SSD 支持的一对目标 OSD,以及另一规则为三个副本选择由 SAS 驱动器支持的三个目标 OSD。
规则采用以下格式:
- id
- 描述
- 用于标识规则的唯一整数。
- 用途
- 规则掩码的组件。
- 类型
- 整数
- 必需
- 是
- 默认
-
0
- type
- 描述
- 描述存储驱动器复制或退出代码的规则。
- 用途
- 规则掩码的组件。
- 类型
- 字符串
- 必需
- 是
- 默认
-
复制
- 有效值
-
目前仅能为
replicated
- min_size
- 描述
- 如果池形成的副本数少于这个数目,则 CRUSH 不会选择这一规则。
- 类型
- 整数
- 用途
- 规则掩码的组件。
- 必填
- 是
- 默认
-
1
- max_size
- 描述
- 如果池形成的副本数超过这个数目,则 CRUSH 不会选择这一规则。
- 类型
- 整数
- 用途
- 规则掩码的组件。
- 必填
- 是
- 默认
-
10
- 步骤使用 <bucket-name> [class <class-name>]
- 描述
- 取 bucket 名称,然后开始迭代树。
- 用途
- 规则的一个组件。
- 必填
- 是
- 示例
-
step take data
step take data class ssd
- 步骤选 firstn <num> type <bucket-type>
- 描述
选择给定类型的 bucket 数量。数字通常是池中副本数量(即池大小)。
-
如果
<num> == 0
,选择pool-num-replicas
bucket(所有可用的)。 -
如果 &
lt;num> > 0 && < pool-num-replicas
,请选择这个数量的存储桶。 -
如果
<num>
< 0,则表示pool-num-replicas - {num}
。
-
如果
- 用途
- 规则的一个组件。
- 前提条件
-
按照步骤
执行
或步骤选
。 - 示例
-
步骤选 firstn 1 类型行
- 步骤选择leaf firstn <num> type <bucket-type>
- 描述
选择一组
{bucket-type}
的存储桶,然后从 bucket 集合中的每个 bucket 的子树中选择树叶节点。集合中的 bucket 数量通常是池中副本数量(即池大小)。-
如果
<num> == 0
,选择pool-num-replicas
bucket(所有可用的)。 -
如果 &
lt;num> > 0 && < pool-num-replicas
,请选择这个数量的存储桶。 -
如果
<num> &
lt; 0,则表示pool-num-replicas - <num>
。
-
如果
- 用途
- 规则的一个组件。使用方法不再需要选择使用两个步骤的设备。
- 前提条件
-
接下来
步骤取
或步骤,选择
。 - 示例
-
步骤选择leaf firstn 0 type row
- step emit
- 描述
- 输出当前值并模拟堆栈。通常在规则末尾使用,但也可能用于从同一规则中的不同树提取。
- 用途
- 规则的一个组件。
- 前提条件
-
跟随
step choose
。 - 示例
-
step emit
- firstn 与 indep
- 描述
-
控制 OSD 在 CRUSH map 中被标记为 down 时使用 replacement 策略。如果此规则将与复制池一起使用,则它应当是
firstn
,并且它用于区块编码的池,则应该位于dep
。 - 示例
-
您有 PG 存储在 OSD 1、2、3、4、5 上,其中 3 个出现故障。在第一种场景中,使用
firstn
模式,CRUSH 会将其计算调整为选择 1 和 2,然后选择 3,但发现它已关闭,因此它重试并选择 4 和 5,然后进入 以选择新的 OSD 6。最后的 CRUSH 映射更改为从 1, 2, 3, 4, 5 到 1, 2, 4, 5, 6。在第二个情景中,在一个纠删代码池中使用indep
模式,CRUSH 会尝试选择失败的 OSD 3,再次尝试并选择 6 用于从 1, 2, 3, 4, 5 到 1, 2, 6, 4, 5 的最终转换。
可以将给定的 CRUSH 规则分配给多个池,但单个池无法具有多个 CRUSH 规则。
2.7.1. 列出规则 复制链接链接已复制到粘贴板!
要从命令行列出 CRUSH 规则,请执行以下操作:
ceph osd crush rule list ceph osd crush rule ls
ceph osd crush rule list
ceph osd crush rule ls
2.7.2. 转储规则 复制链接链接已复制到粘贴板!
要转储特定 CRUSH 规则的内容,请执行以下操作:
ceph osd crush rule dump {name}
ceph osd crush rule dump {name}
2.7.3. 添加简单规则 复制链接链接已复制到粘贴板!
要添加 CRUSH 规则,您必须指定规则名称、要使用的层次结构的根节点、您要复制到的存储桶类型(例如:"rack'、'row' 等等),以及选择存储桶的模式。
ceph osd crush rule create-simple {rulename} {root} {bucket-type} {firstn|indep}
ceph osd crush rule create-simple {rulename} {root} {bucket-type} {firstn|indep}
Ceph 将创建具有您指定的 类型选择leaf
和 1 存储桶的规则。
例如:
ceph osd crush rule create-simple deleteme default host firstn
ceph osd crush rule create-simple deleteme default host firstn
创建以下规则:
2.7.4. 添加复制规则 复制链接链接已复制到粘贴板!
要为复制池创建 CRUSH 规则,请执行以下操作:
ceph osd crush rule create-replicated <name> <root> <failure-domain> <class>
# ceph osd crush rule create-replicated <name> <root> <failure-domain> <class>
其中:
-
<name
> :规则的名称。 -
<root
> : CRUSH 层次结构的根部。 -
<failure-domain>
: 故障域。例如:host
或rack
。 -
<class
> : 存储设备类。例如:hdd
或ssd
。
例如:
ceph osd crush rule create-replicated fast default host ssd
# ceph osd crush rule create-replicated fast default host ssd
2.7.5. 添加 Erasure Code 规则 复制链接链接已复制到粘贴板!
要添加与纠删代码池一起使用的 CRUSH 规则,您可以指定规则名称和纠删代码 profile。
语法
ceph osd crush rule create-erasure {rulename} {profilename}
ceph osd crush rule create-erasure {rulename} {profilename}
示例
[ceph: root@host01 /]# ceph osd crush rule create-erasure default default
[ceph: root@host01 /]# ceph osd crush rule create-erasure default default
其它资源
- 如需了解更多详细信息,请参阅 Erasure 代码配置集。
2.7.6. 删除规则 复制链接链接已复制到粘贴板!
要删除规则,请执行以下内容并指定 CRUSH 规则名称:
ceph osd crush rule rm {name}
ceph osd crush rule rm {name}