第 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 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 集群,并为服务应该运行的位置设置特定的标签:示例
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
选项以使用服务配置文件并配置主机位置。
其它资源
-
如需有关 Ceph bootstrap 和不同
cephadm bootstrap
命令选项的更多信息,请参阅引导新存储集群。
方法 2:在部署后设置位置
先决条件
- 对节点的根级别访问权限。
流程
添加两个 bucket,以计划将非tiebreaker 监视器的位置设置为 CRUSH map,并将 bucket 类型指定为
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 map 匹配:
语法
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 1 1 type replicated min_size 1 max_size 10 step take DC1 2 step chooseleaf firstn 2 type host step emit step take DC2 3 step chooseleaf firstn 2 type host step emit }
注意此规则使集群具有数据中心
DC1
的 read-affinity。因此,所有读取或写入都会通过位于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 monitor 的位置应该与之前设置非方法监视器的数据中心不同。在上例中,它是数据中心
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
命令时指定的 bucket 类型匹配。验证扩展模式是否已成功启用:
示例
[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 8
extend_mode_enabled
应设为true
。您还可以查看扩展存储桶、扩展模式存储桶的数量,以及扩展模式是否降级或恢复。验证 monitor 是否在适当的位置:
示例
[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,以及监控选择策略。
其它资源
- 如需有关 监控选择 策略的更多信息,请参阅配置监控选择策略。
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:
重要这个命令会创建 collocated 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
注意确保在两个站点中添加相同的拓扑节点。如果仅在一个站点中添加主机,则可能会出现问题。
其它资源
- 如需有关 添加 Ceph OSD 的更多信息,请参阅添加 OSD。