第 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 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 集群中,并为应运行服务设置特定的标签:示例
service_type: host addr: host01 hostname: host01 location: root: default datacenter: DC1 labels: - osd - mon - mgr --- service_type: host addr: host02 hostname: host02 location: datacenter: DC1 labels: - osd - mon --- service_type: host addr: host03 hostname: host03 location: datacenter: DC1 labels: - osd - mds - rgw --- service_type: host addr: host04 hostname: host04 location: root: default datacenter: DC2 labels: - osd - mon - mgr --- service_type: host addr: host05 hostname: host05 location: datacenter: DC2 labels: - osd - mon --- service_type: host addr: host06 hostname: host06 location: datacenter: DC2 labels: - osd - mds - rgw --- service_type: host addr: host07 hostname: host07 labels: - mon --- service_type: mon placement: label: "mon" --- service_id: cephfs placement: label: "mds" --- service_type: mgr service_name: mgr placement: label: "mgr" --- service_type: osd service_id: all-available-devices service_name: osd.all-available-devices placement: label: "osd" spec: data_devices: all: true --- service_type: rgw service_id: objectgw service_name: rgw.objectgw placement: count: 2 label: "rgw" spec: rgw_frontend_port: 8080使用
--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示例
[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重要您可以在
cephadm bootstrap命令中使用不同的命令选项。但是,始终包含--apply-spec选项,以使用服务配置文件并配置主机位置。
方法 2:在部署后设置位置
先决条件
- 对节点的根级别访问权限。
流程
添加两个存储桶,您要将非tiebreaker 监视器的位置设置为 CRUSH map,将存储桶类型指定为
datacenter:语法
ceph osd crush add-bucket BUCKET_NAME BUCKET_TYPE示例
[ceph: root@host01 /]# ceph osd crush add-bucket DC1 datacenter [ceph: root@host01 /]# ceph osd crush add-bucket DC2 datacenter将存储桶移到
root=default下:语法
ceph osd crush move BUCKET_NAME root=default示例
[ceph: root@host01 /]# ceph osd crush move DC1 root=default [ceph: root@host01 /]# ceph osd crush move DC2 root=default根据所需的 CRUSH 放置,移动 OSD 主机:
语法
ceph osd crush move HOST datacenter=DATACENTER示例
[ceph: root@host01 /]# ceph osd crush move host01 datacenter=DC1
4.1.2. 进入扩展模式 复制链接链接已复制到粘贴板!
新的扩展模式旨在处理两个站点。对于 2 个站点集群,组件可用性中断的风险较低。
先决条件
- 对节点的根级别访问权限。
- crush 位置设置为主机。
流程
设置每个 monitor 的位置,与 CRUSH 映射匹配:
语法
ceph mon set_location HOST datacenter=DATACENTER示例
[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生成 CRUSH 规则,它将两个副本放在每个数据中心上:
语法
ceph osd getcrushmap > COMPILED_CRUSHMAP_FILENAME crushtool -d COMPILED_CRUSHMAP_FILENAME -o DECOMPILED_CRUSHMAP_FILENAME示例
[ceph: root@host01 /]# ceph osd getcrushmap > crush.map.bin [ceph: root@host01 /]# crushtool -d crush.map.bin -o crush.map.txt编辑已编译的 CRUSH 映射文件,以添加新规则:
示例
rule stretch_rule { id 11 type replicated min_size 1 max_size 10 step take DC12 step chooseleaf firstn 2 type host step emit step take DC23 step chooseleaf firstn 2 type host step emit }注意此规则使集群具有数据中心
DC1的读取权限。因此,所有读取或写入都通过放置在DC1中的 Ceph OSD 进行。如果这不必要,在区间平均分配读取或写入,则 crush 规则如下:
示例
rule stretch_rule { id 1 type replicated min_size 1 max_size 10 step take default step choose firstn 0 type datacenter step chooseleaf firstn 2 type host step emit }在此规则中,数据中心会被随机选择并自动选择。
如需有关
firstn和indep选项的更多信息,请参阅 CRUSH 规则。
注入 CRUSH map,使规则可供集群使用:
语法
crushtool -c DECOMPILED_CRUSHMAP_FILENAME -o COMPILED_CRUSHMAP_FILENAME ceph osd setcrushmap -i COMPILED_CRUSHMAP_FILENAME示例
[ceph: root@host01 /]# crushtool -c crush.map.txt -o crush2.map.bin [ceph: root@host01 /]# ceph osd setcrushmap -i crush2.map.bin如果您没有以连接模式运行监控器,请将选择策略设置为
connectivity:示例
[ceph: root@host01 /]# ceph mon set election_strategy connectivity通过将 tiebreaker monitor 的位置设置为数据中心,进入扩展模式:
语法
ceph mon set_location HOST datacenter=DATACENTER ceph mon enable_stretch_mode HOST 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在本例中,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!注意如果要编写自己的工具来部署 Ceph,您可以在引导监视器时使用新的
--set-crush-location选项,而不是运行ceph mon set_location命令。此选项只接受单个bucket=location对,如ceph-mon --set-crush-location 'datacenter=DC1',它必须与运行enable_stretch_mode命令时指定的存储桶类型匹配。验证扩展模式是否已成功启用:
示例
[ceph: root@host01 /]# ceph osd dump epoch 361 fsid 1234ab78-1234-11ed-b1b1-de456ef0a89d created 2023-01-16T05:47:28.482717+0000 modified 2023-01-17T17:36:50.066183+0000 flags sortbitwise,recovery_deletes,purged_snapdirs,pglog_hardlimit crush_version 31 full_ratio 0.95 backfillfull_ratio 0.92 nearfull_ratio 0.85 require_min_compat_client luminous min_compat_client luminous require_osd_release quincy stretch_mode_enabled true stretch_bucket_count 2 degraded_stretch_mode 0 recovering_stretch_mode 0 stretch_mode_bucket 8stretch_mode_enabled应设为true。您还可以查看扩展存储桶、扩展模式存储桶的数量,以及扩展模式是否降级或恢复。验证监控器是否位于适当的位置:
示例
[ceph: root@host01 /]# ceph mon dump epoch 19 fsid 1234ab78-1234-11ed-b1b1-de456ef0a89d last_changed 2023-01-17T04:12:05.709475+0000 created 2023-01-16T05:47:25.631684+0000 min_mon_release 16 (pacific) election_strategy: 3 stretch_mode_enabled 1 tiebreaker_mon host07 disallowed_leaders host07 0: [v2:132.224.169.63:3300/0,v1:132.224.169.63:6789/0] mon.host07; crush_location {datacenter=DC3} 1: [v2:220.141.179.34:3300/0,v1:220.141.179.34:6789/0] mon.host04; crush_location {datacenter=DC2} 2: [v2:40.90.220.224:3300/0,v1:40.90.220.224:6789/0] mon.host01; crush_location {datacenter=DC1} 3: [v2:60.140.141.144:3300/0,v1:60.140.141.144:6789/0] mon.host02; crush_location {datacenter=DC1} 4: [v2:186.184.61.92:3300/0,v1:186.184.61.92:6789/0] mon.host05; crush_location {datacenter=DC2} dumped monmap epoch 19您还可以查看哪个 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: root@host01 /]# ceph orch device ls在特定主机或所有可用设备上部署 OSD:
从特定主机上的特定设备创建 OSD:
语法
ceph orch daemon add osd HOST:DEVICE_PATH示例
[ceph: root@host01 /]# ceph orch daemon add osd host03:/dev/sdb在任何可用的和未使用的设备上部署 OSD:
重要这个命令会创建并置 WAL 和 DB 设备。如果要创建非并置设备,请不要使用这个命令。
示例
[ceph: root@host01 /]# ceph orch apply osd --all-available-devices
将 OSD 主机移到 CRUSH 存储桶下:
语法
ceph osd crush move HOST datacenter=DATACENTER示例
[ceph: root@host01 /]# ceph osd crush move host03 datacenter=DC1 [ceph: root@host01 /]# ceph osd crush move host06 datacenter=DC2注意确保在两个站点中添加相同的拓扑节点。如果主机只在一个站点中添加,则可能会出现问题。