第 4 章 为 Ceph 存储扩展集群
作为存储管理员,您可以使用 2 个站点集群输入扩展模式来配置扩展集群。
Red Hat Ceph Storage 能够因为网络和集群而丢失 Ceph OSD,这些 OSD 在 CRUSH map 中随机分布失败。如果有多个 OSD 关闭,剩余的 OSD 和 monitor 仍然管理才能操作。
但是,这可能不是一些扩展集群配置的最佳解决方案,其中 Ceph 集群的大量部分只能使用单个网络组件。这个示例是位于多个数据中心的单个集群,用户希望可以在一个数据中心完全无法使用时仍然可以正常工作。
标准配置是两个数据中心。其他配置位于云或可用区中。每个站点都包含两个数据副本,复制大小为 4。第三个站点应有一个 tiebreaker 监控器,与主站点不同,它可以是虚拟机或有高延迟的系统。如果网络连接失败,且两个数据中心都保持活动状态,则此监控器选择其中一个站点来恢复数据。
标准 Ceph 配置在网络或数据中心的许多故障中存活,永远不会破坏数据一致性。如果您在失败后恢复足够的 Ceph 服务器,它会恢复。如果您丢失了数据中心,Ceph 可以维护可用性,但仍然可以形成 monitor 仲裁,并且具有足够副本的数据来满足池的 min_size
,或者再次复制的 CRUSH 规则以满足大小。
没有额外的步骤来关闭扩展群集。如需更多信息,请参阅 关闭并重启 Red Hat Ceph Storage 集群。
扩展集群失败
Red Hat Ceph Storage 不会影响数据完整性和一致性。如果出现网络故障或节点丢失,并且服务仍然可以恢复,Ceph 会自行返回正常功能。
然而,在有些情况下,即使您有足够的服务器可用来满足 Ceph 的一致性和大小限制,或者您意外不满足约束的情况。
第一个重要类型失败是由不一致的网络导致的。如果网络分割,Ceph 可能无法将 OSD 标记为 down
,以将其从 acting placement group (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 仅允许连接同一数据中心内的监视器。在没有指定位置的情况下,不允许新监控器加入集群。
如果同时无法从数据中心访问所有 OSD 和 monitor,则存活的数据中心将 进入降级状态
。这会发出警告,将 min_size
减少为 1
,并允许集群使用其余站点中的数据访问 活动状态
。
degraded
状态也会触发池太小的警告,因为池大小不会改变。但是,特殊的扩展模式标志阻止 OSD 在剩余的数据中心中创建额外的副本,因此仍然保留 2 个副本。
当缺少数据中心再次变得可行时,集群会进入 恢复
扩展模式。这会更改警告并允许对等(peer),但仍只需要来自数据中心的 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
命令中使用不同的命令选项。但是,始终包含 use-apply-spec
选项以使用服务配置文件并配置主机位置。
其它资源
-
如需有关 Ceph bootstrap 和不同的
cephadm bootstrap
命令选项的更多信息,请参阅引导新存储集群。
方法 2:在部署后设置位置
先决条件
- 对节点的根级别访问权限。
流程
添加两个存储桶,将非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
编辑 decompiled CRUSH map 文件以添加新规则:
示例
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 规则如下:
Example
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
如果您没有以连接模式运行 monitor,请将选择策略设置为
connectivity
:示例
[ceph: root@host01 /]# ceph mon set election_strategy connectivity
通过将 tiebreaker 监控的位置设置为在数据中心间分割,进入扩展模式:
语法
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
在本例中,监控器
mon.host07
是 tiebreaker。重要tiebreaker monitor 的位置应该与您之前设置非tiebreaker 监视器的数据中心不同。在上例中,它是数据中心
DC3
。重要当您尝试进入扩展模式时,不要将此数据中心添加到 CRUSH map 中,因为它会产生以下错误:
Error EINVAL: there are 3 datacenters in the cluster but stretch mode currently only works with 2!
注意如果要编写用于部署 Ceph 的工具,您可以在引导监控器时使用 new
-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
stretch_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
注意确保在两个站点中添加相同的拓扑节点。如果只在一个站点中添加主机,则可能会出现问题。
其它资源
- 如需有关 添加 Ceph OSD 的更多信息,请参阅添加 OSD。