2.7. CRUSH 规则
CRUSH 规则定义 Ceph 客户端如何选择存储桶和它们中的 Primary OSD 来存储对象,以及 Primary OSD 如何选择 bucket 和次要 OSD 来存储副本或编码区块。例如,您可以创建一条规则,为两个对象副本选择由 SSD 支持的一对目标 OSD,另一条规则则为三个副本选择由 SAS 驱动器支持的三个目标 OSD。
规则采用以下形式:
rule <rulename> { ruleset <ruleset> type [ replicated | raid4 ] min_size <min-size> max_size <max-size> step take <bucket-type> [class <class-name>] step [choose|chooseleaf] [firstn|indep] <N> <bucket-type> step emit }
- ruleset
- 描述
- (已弃用)将规则归类为属于一组规则的方法。通过设置池中的规则集激活。RHCS 2 及更早版本支持.RHCS 3 及更新的版本不支持。
- 用途
- 规则掩码的一个组件。
- 类型
- 整数
- 必填
- 是
- 默认
-
0
- type
- 描述
- 描述存储驱动器(复制)或 RAID 的规则。
- 用途
- 规则掩码的一个组件。
- 类型
- 字符串
- 必填
- 是
- 默认
-
复制
- 有效值
-
目前仅
复制
- min_size
- 描述
- 如果池形成的副本数少于这个数目,CRUSH 不会选择这一规则。
- 类型
- 整数
- 用途
- 规则掩码的一个组件。
- 必填
- 是
- 默认
-
1
- max_size
- 描述
- 如果池形成的副本数超过这个数目,CRUSH 不会选择这一规则。
- 类型
- 整数
- 用途
- 规则掩码的一个组件。
- 必填
- 是
- 默认
-
10
- 步骤取 <bucket-name> [class <class-name>]
- 描述
- 取 bucket 名称,然后开始往下迭代树。可能会在 RHCS 3 及更高版本中使用设备名称。
- 用途
- 规则的一个组件。
- 必填
- 是
- 示例
-
step take data
step take data class ssd
- 步骤选择 firstn <num> type <bucket-type>
- 描述
选择所给类型的 bucket 数量。这个数字通常是池中的副本数(即池大小)。
-
如果
<num> == 0
,请选择pool-num-replicas
bucket(所有可用)。 -
如果
<num> > 0 && <pool-num-replicas
,请选择这个数量的存储桶。 -
如果
<num> <0
,则表示pool-num-replicas - {num}
。
-
如果
- 用途
- 规则的一个组件。
- 前提条件
-
按照
步骤或
步骤选择
. - 示例
-
步骤选择 firstn 1 类型行
- step selectleaf firstn <num> type <bucket-type>
- 描述
选择
{bucket-type}
的 bucket 集合,并从存储桶集合中的每个存储桶的子树中选择一个 leaf 节点。集合中的 bucket 数量通常是池中的副本数(即池大小)。-
如果
<num> == 0
,请选择pool-num-replicas
bucket(所有可用)。 -
如果
<num> > 0 && <pool-num-replicas
,请选择这个数量的存储桶。 -
如果
<num> <0
,则表示pool-num-replicas - <num>
。
-
如果
- 用途
- 规则的一个组件。使用方法不需要通过两个步骤选择设备。
- 前提条件
-
按照
步骤或
步骤选择
. - 示例
-
步骤选择leaf firstn 0 类型行
- 步骤发出
- 描述
- 输出当前值并清空堆栈。通常在规则末尾使用,但也可以用来从同一规则的不同树中进行选择。
- 用途
- 规则的一个组件。
- 前提条件
-
按照
步骤选择
. - 示例
-
步骤发出
- firstn 和 indep
- 描述
-
控制 CRUSH 当 OSD 在 CRUSH map 中标记为 down 时所使用的替换策略。如果要将此规则与复制池搭配使用,它应当为
firstn
,并且用于纠删代码池,它应当为indep
。 - 示例
-
您有一个 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、4、5 转换到 1、2、6、4、5。
给定 CRUSH 规则可以分配到多个池,但单个池不可能有多个 CRUSH 规则。
2.7.1. 列出规则
要从命令行列出 CRUSH 规则,请执行以下操作:
ceph osd crush rule list ceph osd crush rule ls
2.7.2. 转储规则
要转储特定 CRUSH 规则的内容,请执行以下操作:
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 将创建一个包含您指定类型的 select leaf
和 1 bucket 的规则。
例如:
ceph osd crush rule create-simple deleteme default host firstn
创建以下规则:
{ "rule_id": 1, "rule_name": "deleteme", "ruleset": 1, "type": 1, "min_size": 1, "max_size": 10, "steps": [ { "op": "take", "item": -1, "item_name": "default"}, { "op": "chooseleaf_firstn", "num": 0, "type": "host"}, { "op": "emit"}]}
RHCS 3 及更新的版本不支持该规则集
。它仅用于向后兼容 RHCS 2 及较早版本的 Ceph。
2.7.4. 添加复制的规则
要为复制池创建 CRUSH 规则,请执行以下操作:
# ceph osd crush rule create-replicated <name> <root> <failure-domain> <class>
其中:
-
<name>
:规则的名称。 -
<root>
:CRUSH 层次结构的根目录。 -
<failure-domain>
:故障域。例如:host
或rack
。 -
<class>
:存储设备类别。例如:hdd
或ssd
。仅 RHCS 3 及更高版本.
例如:
# ceph osd crush rule create-replicated fast default host ssd
2.7.5. 添加纠删代码规则
要添加用于纠删代码池的 CRUSH 规则,您可以指定规则名称和纠删代码 profile。
ceph osd crush rule create-erasure {rulename} {profilename}
2.7.6. 删除规则
要移除规则,请执行下列命令并指定 CRUSH 规则名称:
ceph osd crush rule rm {name}