第 4 章 为 Ceph 存储扩展集群
作为存储管理员,您可以通过使用 2 个站点集群进入扩展模式来配置扩展集群。
Red Hat Ceph Storage 能够因为网络和集群而丢失 Ceph OSD,这同样可靠,并在 CRUSH map 中随机分布失败。如果有多个 OSD 关闭,则剩余的 OSD 和 monitor 仍然管理来运行。
但是,这可能不是某些扩展群集配置的最佳解决方案,因为 Ceph 集群的一部分只能使用单一网络组件。这个示例是位于多个数据中心的单个集群,用户希望保持丢失完整数据中心。
标准配置有两个数据中心。其他配置位于云或可用区中。每个站点都包含两个数据副本,复制大小为 4。与主站点相比,第三个站点应具有 tiebreaker 监控器,这可能是虚拟机或高延迟。如果网络连接失败,且两个数据中心仍处于活动状态,这个监控器会选择其中一个站点来恢复数据。
标准 Ceph 配置会保留网络或数据中心的很多故障,永远不会破坏数据一致性。如果您在失败后恢复足够的 Ceph 服务器,它会恢复。如果您丢失了数据中心,但仍然可以组成仲裁,并且具有足够副本的所有可用数据,以满足池的 min_size
或 CRUSH 规则,或者 CRUSH 规则可以再次保持可用性,以满足大小。
没有额外的步骤可以关闭扩展集群。如需更多信息,请参阅 关闭和重新引导 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 存储桶类型时才处于活动状态,假设两者都处于活动状态。池大小从默认的三个增加到四个,每个站点有两个副本。
在扩展模式中,Ceph OSD 仅允许在同一数据中心内连接到监控器。在没有指定位置的情况下,不允许新的 monitor 加入集群。
如果数据中心中的所有 OSD 和 monitor 都无法被访问,则存活数据中心将进入 降级
扩展模式。此问题会发出警告,将 min_size
减少到 1
,并允许集群使用剩余的站点的数据访问 活动状态
。
degraded
状态也会触发池太小的警告,因为池大小不会改变。但是,一个特殊的扩展模式标志可防止 OSD 在剩余的数据中心中创建额外的副本,因此仍然保留 2 个副本。
当缺少的数据中心再次变为不可访问时,集群进入 恢复
扩展模式。这会更改警告并允许对等点,但仍只需要数据中心中的 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 规则,该规则在每个站点上提供两个副本,总计在两个站点上有四个副本。
-
如果您有具有非默认大小或
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:在部署后设置位置
先决条件
- 对节点的根级别访问权限。
流程
添加两个存储桶,您要将非tiebreaker 监视器的位置设置为 CRUSH map,将存储桶类型指定为
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 映射匹配:
语法
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
的读取权限。因此,所有读取或写入都通过放置在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 监控器的位置应与之前设置非tiebreaker 监视器的数据中心不同。在上例中,它是数据中心
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
命令时指定的存储桶类型匹配。验证扩展模式是否已成功启用:
示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow stretch_mode_enabled
应设为true
。您还可以查看扩展存储桶、扩展模式存储桶的数量,以及扩展模式是否降级或恢复。验证监控器是否位于适当的位置:
示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您还可以查看哪个 monitor 是 tiebreaker,以及 monitor 选择策略。
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:
重要这个命令会创建并置 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 注意确保在两个站点中添加相同的拓扑节点。如果主机只在一个站点中添加,则可能会出现问题。