第 4 章 为 Ceph 存储扩展集群
作为存储管理员,您可以使用 2 个站点集群输入扩展模式来配置扩展集群。
Red Hat Ceph Storage 能够因为网络和集群而丢失 Ceph OSD,这些 OSD 在 CRUSH map 中随机分布失败。如果有多个 OSD 关闭,剩余的 OSD 和 monitor 仍然管理才能操作。
但是,这可能不是一些扩展集群配置的最佳解决方案,其中 Ceph 集群的大量部分只能使用单个网络组件。这个示例是位于多个数据中心的单个集群,用户希望继续丢失完整的数据中心。
标准配置有两个数据中心。其他配置位于云或可用区中。每个站点都包含两个数据副本,复制大小为 4。第三个站点应具有 tiebreaker 监控器,与主站点相比,这可能是虚拟机或高延迟。如果网络连接失败,且两个数据中心都保持活动状态,则此监控器选择一个站点来恢复数据。
标准 Ceph 配置在网络或数据中心的很多故障中存活,永远不会破坏数据一致性。如果您在失败后恢复足够的 Ceph 服务器,它会恢复。如果您丢失数据中心,但仍然可以组成 monitor 的仲裁,并有足够的副本来满足池的 min_size
或 CRUSH 规则来再次复制以满足大小,Ceph 会保持可用性。
没有额外的步骤可以关闭扩展集群。如需更多信息,请参阅 关闭和重新引导 Red Hat Ceph Storage 集群。
扩展集群故障
Red Hat Ceph Storage 永远不会破坏数据完整性和一致性。如果网络故障或节点丢失,并且服务仍然可以恢复,Ceph 会自行返回到正常功能。
但是,在有些情况下,即使您有足够的服务器来满足 Ceph 的一致性和大小限制,或者意外不满足约束,也会丢失数据可用性。
第一个重要故障类型是由网络不一致导致的。如果有网络分割,Ceph 可能无法将 OSD 标记为 down
,以将其从操作放置组(PG)集中移除,尽管 Primary OSD 无法复制数据。发生这种情况时,不允许 I/O,因为 Ceph 无法满足其持久性保证。
第二个重要的故障类别是,当您显示数据在不同数据间复制数据时,但约束不足以保证这一点。例如,您可能具有数据中心 A 和 B,CRUSH 规则以三个副本为目标,并将副本放在每个数据中心,min_size
为 2
。PG 可能会活跃在站点 A 中有两个副本,而站点 B 中没有副本,这意味着如果丢失了站点 A,则丢失数据,Ceph 无法在其上操作。这种情形很难避免使用标准 CRUSH 规则。
4.1. 存储集群的扩展模式 复制链接链接已复制到粘贴板!
要配置扩展集群,您必须进入扩展模式。启用扩展模式时,Ceph OSD 仅在数据中心的对等点或您指定的其他 CRUSH bucket 类型时将 PG 视为活跃状态,假设两者都处于活动状态。池将大小从默认的三个增加到四,每个站点有两个副本。
在扩展模式中,Ceph OSD 仅允许在同一数据中心内连接监控器。在没有指定位置的情况下,不允许新的 monitor 加入集群。
如果同时无法访问数据中心中的所有 OSD 和监控器,则存活的数据中心将进入 degraded
扩展模式。这会发出警告,将 min_size
减小到 1
,并允许集群使用剩余的站点中的数据到达 活动状态
。
degraded
状态也会触发池太小的警告,因为池大小不会改变。但是,特殊的扩展模式标志可防止 OSD 在剩余的数据中心中创建额外的副本,因此仍然保留 2 个副本。
当缺少的数据中心再次变为可操作时,集群会进入 恢复
扩展模式。这会更改警告并允许 peering,但仍然需要来自数据中心的 OSD,而这始终为准。
当所有 PG 都处于已知状态且未降级或不完整时,集群会返回到常规扩展模式,结束警告,并将 min_size
恢复到其起始值 2
。集群再次需要两个站点来对等,而不仅仅是整个站点,因此您可以切换到其他站点(如有必要)。
扩展模式限制
- 输入后,无法从扩展模式退出。
- 您不能在扩展模式下使用带有集群的纠删代码池。您不能使用纠删代码池进入扩展模式,也不会在扩展模式处于活动状态时创建纠删代码池。
- 支持扩展模式,且不支持两个以上的站点。
两个站点的权重应该相同。如果没有,您会收到以下错误:
示例
[ceph: root@host01 /]# ceph mon enable_stretch_mode host05 stretch_rule datacenter Error EINVAL: the 2 datacenter instances in the cluster have differing weights 25947 and 15728 but stretch mode currently requires they be the same!
[ceph: root@host01 /]# ceph mon enable_stretch_mode host05 stretch_rule datacenter Error EINVAL: the 2 datacenter instances in the cluster have differing weights 25947 and 15728 but stretch mode currently requires they be the same!
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要在两个站点上实现相同的权重,部署在两个站点中的 Ceph OSD 的大小应该相等,即第一个站点中的存储容量等同于第二个站点的存储容量。
- 虽然它不强制执行,但您应该在每个站点上运行两个 Ceph 监视器,以及一个 tiebreaker,共 5 个。这是因为在扩展模式中,OSD 只能连接到自己的站点中的监控器。
- 您必须创建自己的 CRUSH 规则,在每个站点上提供两个副本,总计为在两个站点上共 4 个副本。
-
如果您有具有非默认大小或
min_size
的现有池,则无法启用扩展模式。 -
由于集群在降级时以
min_size 1
运行,因此您应该只使用 all-flash OSD 的扩展模式。这可最小化在连接恢复后恢复所需的时间,并尽可能减少数据丢失的可能性。
4.1.1. 为守护进程设置 CRUSH 位置 复制链接链接已复制到粘贴板!
在进入扩展模式前,您需要将 CRUSH 位置设置为 Red Hat Ceph Storage 集群中的守护进程来准备集群。有两种方法可以做到这一点:
- 通过服务配置文件引导集群,该位置作为部署的一部分添加到主机中。
-
在部署集群后,通过
ceph osd crush add-bucket
和ceph osd crush move
命令手动设置位置。
方法 1:引导集群
先决条件
- 对节点的根级别访问权限。
流程
如果要引导新存储集群,您可以创建服务配置
.yaml
文件,该文件将节点添加到 Red Hat Ceph Storage 集群,并为服务应该运行的位置设置特定的标签:示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
--apply-spec
选项引导存储集群:语法
cephadm bootstrap --apply-spec CONFIGURATION_FILE_NAME --mon-ip MONITOR_IP_ADDRESS --ssh-private-key PRIVATE_KEY --ssh-public-key PUBLIC_KEY --registry-url REGISTRY_URL --registry-username USER_NAME --registry-password PASSWORD
cephadm bootstrap --apply-spec CONFIGURATION_FILE_NAME --mon-ip MONITOR_IP_ADDRESS --ssh-private-key PRIVATE_KEY --ssh-public-key PUBLIC_KEY --registry-url REGISTRY_URL --registry-username USER_NAME --registry-password PASSWORD
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例
cephadm bootstrap --apply-spec initial-config.yaml --mon-ip 10.10.128.68 --ssh-private-key /home/ceph/.ssh/id_rsa --ssh-public-key /home/ceph/.ssh/id_rsa.pub --registry-url registry.redhat.io --registry-username myuser1 --registry-password mypassword1
[root@host01 ~]# cephadm bootstrap --apply-spec initial-config.yaml --mon-ip 10.10.128.68 --ssh-private-key /home/ceph/.ssh/id_rsa --ssh-public-key /home/ceph/.ssh/id_rsa.pub --registry-url registry.redhat.io --registry-username myuser1 --registry-password mypassword1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要您可以在
cephadm bootstrap
命令中使用不同的命令选项。但是,始终包含--apply-spec
选项以使用服务配置文件并配置主机位置。
方法 2:在部署后设置位置
先决条件
- 对节点的根级别访问权限。
流程
添加两个 bucket,以计划将非tiebreaker 监视器的位置设置为 CRUSH map,并将 bucket 类型指定为
datacenter
:语法
ceph osd crush add-bucket BUCKET_NAME BUCKET_TYPE
ceph osd crush add-bucket BUCKET_NAME BUCKET_TYPE
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例
[ceph: root@host01 /]# ceph osd crush add-bucket DC1 datacenter [ceph: root@host01 /]# ceph osd crush add-bucket DC2 datacenter
[ceph: root@host01 /]# ceph osd crush add-bucket DC1 datacenter [ceph: root@host01 /]# ceph osd crush add-bucket DC2 datacenter
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将存储桶移到
root=default
下:语法
ceph osd crush move BUCKET_NAME root=default
ceph osd crush move BUCKET_NAME root=default
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例
[ceph: root@host01 /]# ceph osd crush move DC1 root=default [ceph: root@host01 /]# ceph osd crush move DC2 root=default
[ceph: root@host01 /]# ceph osd crush move DC1 root=default [ceph: root@host01 /]# ceph osd crush move DC2 root=default
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 根据所需的 CRUSH 放置移动 OSD 主机:
语法
ceph osd crush move HOST datacenter=DATACENTER
ceph osd crush move HOST datacenter=DATACENTER
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例
[ceph: root@host01 /]# ceph osd crush move host01 datacenter=DC1
[ceph: root@host01 /]# ceph osd crush move host01 datacenter=DC1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.1.2. 进入扩展模式 复制链接链接已复制到粘贴板!
新的扩展模式旨在处理两个站点。在 2 个站点集群中,组件可用性中断的风险较低。
先决条件
- 对节点的根级别访问权限。
- CRUSH 位置设置为主机。
流程
设置每个 monitor 的位置,与 CRUSH map 匹配:
语法
ceph mon set_location HOST datacenter=DATACENTER
ceph mon set_location HOST datacenter=DATACENTER
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例
[ceph: root@host01 /]# ceph mon set_location host01 datacenter=DC1 [ceph: root@host01 /]# ceph mon set_location host02 datacenter=DC1 [ceph: root@host01 /]# ceph mon set_location host04 datacenter=DC2 [ceph: root@host01 /]# ceph mon set_location host05 datacenter=DC2 [ceph: root@host01 /]# ceph mon set_location host07 datacenter=DC3
[ceph: root@host01 /]# ceph mon set_location host01 datacenter=DC1 [ceph: root@host01 /]# ceph mon set_location host02 datacenter=DC1 [ceph: root@host01 /]# ceph mon set_location host04 datacenter=DC2 [ceph: root@host01 /]# ceph mon set_location host05 datacenter=DC2 [ceph: root@host01 /]# ceph mon set_location host07 datacenter=DC3
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 生成 CRUSH 规则,将两个副本放在每个数据中心中:
语法
ceph osd getcrushmap > COMPILED_CRUSHMAP_FILENAME crushtool -d COMPILED_CRUSHMAP_FILENAME -o DECOMPILED_CRUSHMAP_FILENAME
ceph osd getcrushmap > COMPILED_CRUSHMAP_FILENAME crushtool -d COMPILED_CRUSHMAP_FILENAME -o DECOMPILED_CRUSHMAP_FILENAME
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例
[ceph: root@host01 /]# ceph osd getcrushmap > crush.map.bin [ceph: root@host01 /]# crushtool -d crush.map.bin -o crush.map.txt
[ceph: root@host01 /]# ceph osd getcrushmap > crush.map.bin [ceph: root@host01 /]# crushtool -d crush.map.bin -o crush.map.txt
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 编辑解译 CRUSH 映射文件,以添加新规则:
示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意此规则使集群具有数据中心
DC1
的 read-affinity。因此,所有读取或写入都会通过位于DC1
中的 Ceph OSD 进行。如果这不是需要的,并且跨区平均分配读取或写入,CRUSH 规则如下:
示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在此规则中,数据中心会被随机选择,并自动选择。
有关
firstn
和indep
选项的更多信息,请参阅 CRUSH 规则。
注入 CRUSH map,使规则可供集群使用:
语法
crushtool -c DECOMPILED_CRUSHMAP_FILENAME -o COMPILED_CRUSHMAP_FILENAME ceph osd setcrushmap -i COMPILED_CRUSHMAP_FILENAME
crushtool -c DECOMPILED_CRUSHMAP_FILENAME -o COMPILED_CRUSHMAP_FILENAME ceph osd setcrushmap -i COMPILED_CRUSHMAP_FILENAME
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例
[ceph: root@host01 /]# crushtool -c crush.map.txt -o crush2.map.bin [ceph: root@host01 /]# ceph osd setcrushmap -i crush2.map.bin
[ceph: root@host01 /]# crushtool -c crush.map.txt -o crush2.map.bin [ceph: root@host01 /]# ceph osd setcrushmap -i crush2.map.bin
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您没有在连接模式下运行监控器,请将选择策略设置为
connectivity
:示例
[ceph: root@host01 /]# ceph mon set election_strategy connectivity
[ceph: root@host01 /]# ceph mon set election_strategy connectivity
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过将 tiebreaker monitor 的位置设置为在数据中心间分割,进入扩展模式:
语法
ceph mon set_location HOST datacenter=DATACENTER ceph mon enable_stretch_mode HOST stretch_rule datacenter
ceph mon set_location HOST datacenter=DATACENTER ceph mon enable_stretch_mode HOST stretch_rule datacenter
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例
[ceph: root@host01 /]# ceph mon set_location host07 datacenter=DC3 [ceph: root@host01 /]# ceph mon enable_stretch_mode host07 stretch_rule datacenter
[ceph: root@host01 /]# ceph mon set_location host07 datacenter=DC3 [ceph: root@host01 /]# ceph mon enable_stretch_mode host07 stretch_rule datacenter
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在本例中,monitor
mon.host07
是 tiebreaker。重要tiebreaker monitor 的位置应该与之前设置非方法监视器的数据中心不同。在上例中,它是数据中心
DC3
。重要不要将此数据中心添加到 CRUSH map,因为它在尝试进入扩展模式时会产生以下错误:
Error EINVAL: there are 3 datacenters in the cluster but stretch mode currently only works with 2!
Error EINVAL: there are 3 datacenters in the cluster but stretch mode currently only works with 2!
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意如果要编写自己的工具来部署 Ceph,您可以在引导监视器时使用新的
--set-crush-location
选项,而不是运行ceph mon set_location
命令。这个选项只接受单个bucket=location
对,如ceph-mon --set-crush-location 'datacenter=DC1'
,它必须与运行enable_stretch_mode
命令时指定的 bucket 类型匹配。验证扩展模式是否已成功启用:
示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow extend_mode_enabled
应设为true
。您还可以查看扩展存储桶、扩展模式存储桶的数量,以及扩展模式是否降级或恢复。验证 monitor 是否在适当的位置:
示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您还可以查看哪个 monitor 是 tiebreaker,以及监控选择策略。
4.1.3. 以扩展模式添加 OSD 主机 复制链接链接已复制到粘贴板!
您可以在扩展模式下添加 Ceph OSD。该流程与在未启用扩展模式的群集中添加 OSD 主机类似。
先决条件
- 一个正在运行的 Red Hat Ceph Storage 集群。
- 在集群中启用的扩展模式。
- 对节点的根级别访问权限。
流程
列出可用的设备来部署 OSD:
语法
ceph orch device ls [--hostname=HOST_1 HOST_2] [--wide] [--refresh]
ceph orch device ls [--hostname=HOST_1 HOST_2] [--wide] [--refresh]
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例
[ceph: root@host01 /]# ceph orch device ls
[ceph: root@host01 /]# ceph orch device ls
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将 OSD 部署到特定的主机或所有可用设备上:
从特定主机上的特定设备创建 OSD:
语法
ceph orch daemon add osd HOST:DEVICE_PATH
ceph orch daemon add osd HOST:DEVICE_PATH
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例
[ceph: root@host01 /]# ceph orch daemon add osd host03:/dev/sdb
[ceph: root@host01 /]# ceph orch daemon add osd host03:/dev/sdb
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在任何可用和未使用的设备上部署 OSD:
重要这个命令会创建 collocated WAL 和 DB 设备。如果要创建非并置设备,请不要使用此命令。
示例
[ceph: root@host01 /]# ceph orch apply osd --all-available-devices
[ceph: root@host01 /]# ceph orch apply osd --all-available-devices
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
将 OSD 主机移到 CRUSH 存储桶下:
语法
ceph osd crush move HOST datacenter=DATACENTER
ceph osd crush move HOST datacenter=DATACENTER
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例
[ceph: root@host01 /]# ceph osd crush move host03 datacenter=DC1 [ceph: root@host01 /]# ceph osd crush move host06 datacenter=DC2
[ceph: root@host01 /]# ceph osd crush move host03 datacenter=DC1 [ceph: root@host01 /]# ceph osd crush move host06 datacenter=DC2
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意确保在两个站点中添加相同的拓扑节点。如果仅在一个站点中添加主机,则可能会出现问题。