2.3. CRUSH 中的 Ceph OSD
具有 OSD 的 CRUSH 层次结构后,将 OSD 添加到 CRUSH 层次结构。您还可以从现有层次结构中移动或移除 OSD。Ceph CLI 用法具有以下值:
- id
- 描述
- OSD 的数字 ID。
- 类型
- 整数
- 必填
- 是
- 示例
-
0
- name
- 描述
- OSD 的全名。
- 类型
- 字符串
- 必需
- 是
- 示例
-
osd.0
- Weight
- 描述
- OSD 的 CRUSH 权重。
- 类型
- 双
- 必填
- 是
- 示例
-
2.0
- root
- 描述
- OSD 所在的层次结构或树的根存储桶的名称。
- 类型
- 键-值对。
- 必填
- 是
- 示例
-
root=default
,root=replicated_rule
, 等
- bucket-type
- 描述
- 一个或多个 name-value 对,其中 name 是存储桶类型,值是存储桶的名称。您可以在 CRUSH 层次结构中为 OSD 指定 CRUSH 位置。
- 类型
- 健值对。
- 必填
- 否
- 示例
-
datacenter=dc1 room=room1 row=foo rack=bar host=foo-bar-1
2.3.1. 在 CRUSH 中查看 OSD
ceph osd crush tree
命令在树视图中打印 CRUSH bucket 和项目。使用此命令来确定特定 bucket 中的 OSD 列表。它将输出类似于 ceph osd tree
。
要返回附加详情,请执行以下操作:
# ceph osd crush tree -f json-pretty
该命令返回一个类似如下的输出:
[ { "id": -2, "name": "ssd", "type": "root", "type_id": 10, "items": [ { "id": -6, "name": "dell-per630-11-ssd", "type": "host", "type_id": 1, "items": [ { "id": 6, "name": "osd.6", "type": "osd", "type_id": 0, "crush_weight": 0.099991, "depth": 2 } ] }, { "id": -7, "name": "dell-per630-12-ssd", "type": "host", "type_id": 1, "items": [ { "id": 7, "name": "osd.7", "type": "osd", "type_id": 0, "crush_weight": 0.099991, "depth": 2 } ] }, { "id": -8, "name": "dell-per630-13-ssd", "type": "host", "type_id": 1, "items": [ { "id": 8, "name": "osd.8", "type": "osd", "type_id": 0, "crush_weight": 0.099991, "depth": 2 } ] } ] }, { "id": -1, "name": "default", "type": "root", "type_id": 10, "items": [ { "id": -3, "name": "dell-per630-11", "type": "host", "type_id": 1, "items": [ { "id": 0, "name": "osd.0", "type": "osd", "type_id": 0, "crush_weight": 0.449997, "depth": 2 }, { "id": 3, "name": "osd.3", "type": "osd", "type_id": 0, "crush_weight": 0.289993, "depth": 2 } ] }, { "id": -4, "name": "dell-per630-12", "type": "host", "type_id": 1, "items": [ { "id": 1, "name": "osd.1", "type": "osd", "type_id": 0, "crush_weight": 0.449997, "depth": 2 }, { "id": 4, "name": "osd.4", "type": "osd", "type_id": 0, "crush_weight": 0.289993, "depth": 2 } ] }, { "id": -5, "name": "dell-per630-13", "type": "host", "type_id": 1, "items": [ { "id": 2, "name": "osd.2", "type": "osd", "type_id": 0, "crush_weight": 0.449997, "depth": 2 }, { "id": 5, "name": "osd.5", "type": "osd", "type_id": 0, "crush_weight": 0.289993, "depth": 2 } ] } ] } ]
2.3.2. 将 OSD 添加到 CRUSH
在可以启动一个 OSD(为 up
和 in
)且 Ceph 为 OSD 分配放置组前,将一个 Ceph OSD 添加到 CRUSH 层次结构中是最终的步骤。
您必须将 Ceph OSD 添加到 CRUSH 层次结构前,您必须准备 Ceph OSD。部署实用程序(如 Ceph 编排器)可以为您执行此步骤。例如,在单个节点上创建 Ceph OSD:
语法
ceph orch daemon add osd HOST:_DEVICE_,[DEVICE]
CRUSH 层次结构不同,因此 ceph osd crush add
命令允许您在您想要的 CRUSH 层次结构中添加 OSD。您指定的位置应反映其实际位置。如果您至少指定了一个存储桶,命令会将 OSD 放置到您指定的最特定的存储桶中,并将该 存储桶移到您指定的任何其他存储桶下。
将 OSD 添加到 CRUSH 层次结构:
语法
ceph osd crush add ID_OR_NAME WEIGHT [BUCKET_TYPE=BUCKET_NAME ...]
如果您只指定 root 存储桶,命令会将 OSD 直接附加到 root。但是,CRUSH 规则预期 OSD 在主机或机箱内,主机或机箱 应位于 反映您的集群拓扑的其他 bucket 内。
以下示例将 osd.0
添加到层次结构中:
ceph osd crush add osd.0 1.0 root=default datacenter=dc1 room=room1 row=foo rack=bar host=foo-bar-1
您还可以使用 ceph osd crush set
或 ceph osd crush create-or-move
将 OSD 添加到 CRUSH 层次结构。
2.3.3. 在 CRUSH 层次结构内移动 OSD
如果存储集群拓扑发生变化,您可以移动 CRUSH 层次结构中的 OSD 来反映其实际位置。
在 CRUSH 层次结构中移动 OSD 意味着 Ceph 将重新计算哪些放置组分配给 OSD,可能会导致大量重新分发数据。
在 CRUSH 层次结构内移动 OSD:
语法
ceph osd crush set ID_OR_NAME WEIGHT root=POOL_NAME [BUCKET_TYPE=BUCKET_NAME...]
您还可以使用 ceph osd crush create-or-move
来移动 CRUSH 层次结构中的 OSD。
2.3.4. 从 CRUSH 层次结构中移除 OSD
当您想从集群中删除 OSD 时,从 CRUSH 层次结构中删除 OSD 是第一步。从 CRUSH map 移除 OSD 时,CRUSH 重新计算 OSD 获取放置组和数据相应地重新平衡。如需了解更多详细信息,请参阅添加/删除 OSD。
要从正在运行的集群的 CRUSH 映射中删除 OSD,请执行以下操作:
语法
ceph osd crush remove NAME