注意
本文档适用于 Ceph 开发版本。
扩展集群
扩展集群
拉伸集群是一个位于地理上分离的数据中心,通过广域网分布的服务器集群。拉伸集群具有类似局域网的高速和低延迟连接,但连接有限。拉伸集群更容易出现(可能是非对称的)网络分裂,并且更容易出现整个数据中心暂时或完全丢失的情况(这可能代表集群的三分之一到一半)。
Ceph 设计的预期是它的网络和集群的所有部分都是可靠的,并且故障将随机分布在 CRUSH 地图中。即使一个交换机宕机并导致许多 OSD 丢失,Ceph 也设计为让剩余的 OSD 和监视器绕过这种损失。
有时这不可靠。如果您有一个“拉伸集群”部署,其中大部分集群位于单个网络组件后面,您可能需要使用拉伸模式来确保数据完整性。
我们将在这里考虑两种标准配置:一个包含两个数据中心(或在云中,两个可用区)的配置,以及一个包含三个数据中心(或在云中,三个可用区)的配置。
在双站点配置中,Ceph 期望每个站点都保存数据的副本,并且 Ceph 还期望有一个具有裁决监视器的第三个站点。如果网络连接失败并且两个数据中心仍然存活,这个裁决监视器会选择一个获胜者。
裁决监视器可以是一个虚拟机。它相对于两个主要站点也可以有高延迟。
标准的 Ceph 配置能够在许多网络故障或数据中心故障的情况下生存下来,而不会影响数据可用性。如果在故障后足够多的 Ceph 服务器被恢复,集群将恢复。min_size
配置选项,或者(如果那样)集群有 CRUSH 规则,这些规则将导致集群重新复制数据,直到满足min_size
配置选项。)
拉伸集群问题
Ceph 不允许在任何情况下损害数据完整性和数据一致性。在网络故障或 Ceph 节点丢失后恢复服务时,Ceph 将在没有操作员干预的情况下恢复到正常工作状态。
Ceph 不允许损害数据完整性或数据一致性,但在某些情况下数据可用性被损害。这些情况即使有足够的集群可用以满足 Ceph 的一致性和尺寸约束也可能发生。在某些情况下,您可能会发现您的集群不满足这些约束。
我们将要讨论的第一类故障涉及不一致的网络——如果存在 netsplit(两个服务器之间的断开连接,将网络分成两部分),Ceph 可能无法标记 OSDsdown
并将它们从执行 PG 集中删除。尽管主要 PG 无法复制数据(在正常非 netsplit 情况下,这会导致将受影响的 OSD 标记为down
will occur, despite the fact that the primary PG is unable to replicate data (a
situation that, under normal non-netsplit circumstances, would result in the
marking of affected OSDs as down
并将其从 PG 中删除),但这种情况可能会发生。如果发生这种情况,Ceph 将无法满足其持久性保证,因此不允许 IO。
我们将要讨论的第二类故障涉及约束不足以保证跨数据中心复制数据的情况,尽管看起来数据已经正确地跨数据中心复制了。例如,在一个有两个名为数据中心 A 和数据中心 B 的数据中心的场景中,CRUSH 规则针对三个副本,并将一个副本放置在每个数据中心,具有min_size
的2
,PG 可能会在数据中心 A 中有两个副本,在数据中心 B 中为零副本。在这种情况下,数据中心 A 的丢失意味着数据丢失,Ceph 将无法对其进行操作。这种情况使用标准 CRUSH 规则很难避免。
单独的拉伸池
设置单独的stretch pool
是一个选项,允许配置特定的池跨two or more data centers
分布。ceph osd pool stretch set
命令来实现的,而不是应用集群范围的配置with stretch mode
。为扩展池取消设置值
使用stretch mode
当您有确切two data centers
并需要在整个集群中实现统一配置时。相反,选择stretch pool
当您需要特定的池跨more than two data centers
复制时,提供更细粒度的控制和一个更大的集群大小。
限制
单独的拉伸池在两个或多个区域之间的 netsplit 情景中不支持 I/O 操作。虽然集群仍然可用于基本 Ceph 命令,但 I/O 使用仍然不可用,直到 netsplit 解决。这与stretch mode
不同,其中裁决监视器可以隔离集群的一个区域,并在 netsplit 期间以降级模式继续 I/O 操作。参见拉伸模式
Ceph 设计为能够容忍多个主机故障。但是,如果集群中超过 25% 的 OSD 宕机,Ceph 可能会停止将 OSD 标记为宕机,这将阻止重新平衡,并且某些 PG 可能会变为不活动。这种行为由参数控制。mon_osd_min_in_ratio
parameter.
By default, mon_osd_min_in_ratio is set to 0.75, meaning that at least 75% of the OSDs
in the cluster must remain active
,然后才能标记额外的 OSD 为宕机。此设置防止过多 OSD 被标记为宕机,因为这可能导致大量数据移动。数据移动会在 OSD 恢复服务时导致高客户端 I/O 影响 和长恢复时间。如果 Ceph 停止将 OSD 标记为宕机,某些 PG 可能无法重新平衡到存活的 OSD,可能会导致inactive
PG。https://tracker.ceph.com/issues/68338 for more information.
拉伸模式
拉伸模式设计用于处理两个数据区域之间的 netsplit 情景以及一个数据区域的丢失。它通过选择具有更好连接到tiebreaker monitor
的存活的区域来处理 netsplit 情景。它通过将所有池的min_size
减少到1
来处理一个区域的丢失,允许集群使用剩余的区域继续运行。当丢失的区域恢复时,集群将恢复丢失的数据并恢复正常操作。
连接监视器选举策略
使用拉伸模式时,监视器选举策略必须设置为connectivity
。
请参阅更改监视器选举
拉伸对等规则
拉伸模式的一个关键行为是其能够防止 PG 在其执行集中只包含来自单个区域的副本时变为活动状态。这个保护措施对于减轻站点故障期间数据丢失的风险至关重要,因为如果 PG 允许在单个站点中只有副本变为活动状态,即使没有冗余,也可以确认写入。在站点故障的情况下,受影响 PG 中的所有数据都将丢失。
进入拉伸模式
要启用拉伸模式,您必须设置每个监视器的位置,以匹配您的 CRUSH 地图。此过程展示了如何执行此操作。
在您的第一个数据中心中放置
mon.a
:ceph mon set_location a datacenter=site1
生成一个将两个副本放置在每个数据中心的 CRUSH 规则。
ceph osd getcrushmap > crush.map.bin crushtool -d crush.map.bin -o crush.map.txt
编辑
crush.map.txt
文件以添加一个新规则。在这里只有一个其他规则 (id 1
),但您可能需要使用不同的规则 ID。我们有两个名为site1
和site2
:rule stretch_rule { id 1 type replicated step take site1 step chooseleaf firstn 2 type host step emit step take site2 step chooseleaf firstn 2 type host step emit }
警告
的数据中心桶
MAX AVAIL
对于与 CRUSH 规则相关的池将报告所有可用的空间,而不是与 CRUSH 规则相关的池的可用的空间。例如,考虑一个具有两个 CRUSH 规则的集群,
stretch_rule
和stretch_replicated_rule
:rule stretch_rule { id 1 type replicated step take DC1 step chooseleaf firstn 2 type host step emit step take DC2 step chooseleaf firstn 2 type host step emit } rule stretch_replicated_rule { id 2 type replicated step take default step choose firstn 0 type datacenter step chooseleaf firstn 2 type host step emit }
在上面的示例中,
stretch_rule
将报告MAX AVAIL
.stretch_replicated_rule
将报告正确的值。stretch_rule
定义的方式是PGMap::get_rule_avail
只考虑单个数据中心的可用大小,而不是(正确的)两个数据中心的总可用大小。这里是一个解决方法。不是像上面
stretch_rule
函数中定义的拉伸规则那样定义它,而是按如下方式定义它:rule stretch_rule { id 2 type replicated step take default step choose firstn 0 type datacenter step chooseleaf firstn 2 type host step emit }
请参阅https://tracker.ceph.com/issues/56650了解此解决方法的更多详细信息。
上述过程由 Prashant Dhange 于 2024 年 5 月和 6 月开发。
注入 CRUSH 地图以使规则对集群可用:
crushtool -c crush.map.txt -o crush2.map.bin ceph osd setcrushmap -i crush2.map.bin
以连接模式运行监视器。参见更改监视器选举.
ceph mon set election_strategy connectivity
命令集群进入拉伸模式。在这个例子中,
mon.e
是裁决监视器,我们正在跨数据中心分割。裁决监视器必须分配到一个既不是site1
也不是site2
的数据中心。这个数据中心不应该在您的 CRUSH 地图中定义,这里我们将mon.e
放置在一个名为site3
:ceph mon set_location e datacenter=site3 ceph mon enable_stretch_mode e stretch_rule datacenter
的虚拟数据中心中3
to4
增加到,并且每个站点都期望有两个副本。OSD 只能连接到它们位于同一数据中心的监视器。OSDs
If all OSDs and monitors in one of the data centers become inaccessible at once,
the surviving data center enters a “degraded stretch mode”. A warning will be
issued, the min_size
will be reduced to 1
, and the cluster will be
allowed to go active with the data in the single remaining site. The pool size
does not change, so warnings will be generated that report that the pools are
too small -- but a special stretch mode flag will prevent the OSDs from
creating extra copies in the remaining data center. This means that the data
center will keep only two copies, just as before.
When the missing data center comes back, the cluster will enter a “recovery
stretch mode”. This changes the warning and allows peering, but requires OSDs
only from the data center that was up
throughout the duration of the
downtime. When all PGs are in a known state, and are neither degraded nor
incomplete, the cluster transitions back to regular stretch mode, ends the
warning, restores min_size
to its original value (2
), requires both
sites to peer, and no longer requires the site that was up throughout the
duration of the downtime when peering (which makes failover to the other site
possible, if needed).
退出拉伸模式
要退出拉伸模式,请运行以下命令:
ceph mon disable_stretch_mode [{crush_rule}] --yes-i-really-mean-it
- {crush_rule}
用户希望所有池移动回的 CRUSH 规则。如果未指定,池将移动回默认 CRUSH 规则。
- 类型:
字符串
- 必需:
否。
此命令将集群移回正常模式,并且集群将不再处于拉伸模式。size
和min_size
回到它们开始时的默认值。
请注意,当集群处于recovery stretch mode
时,命令将不会执行。当集群处于degraded stretch mode
或healthy stretch mode
.
时,命令才会执行。
使用拉伸模式时,OSD 必须位于两个站点。
每个数据中心应运行两个监视器,再加上第三个(或在云中)的一个裁决监视器,总共五个监视器。在拉伸模式下,OSD 只会连接到它们所在数据中心的监视器。不要连接到裁决监视器。
压缩编码池不能与拉伸模式一起使用。尝试使用压缩编码池与拉伸模式一起使用将失败。在拉伸模式下无法创建压缩编码池。
要使用拉伸模式,您需要创建一个 CRUSH 规则,该规则在每个数据中心提供两个副本。确保总共有四个副本:每个数据中心两个副本。如果集群中存在不具有默认size
或min_size
的池,Ceph 将不会进入拉伸模式。上面给出了一个这样的 CRUSH 规则示例。
由于拉伸模式使用min_size
设置为1
(或者更直接地说,min_size 1
),我们建议仅在使用 SSD 上的 OSD 时启用拉伸模式。由于 HDD+SSD 混合或仅 HDD 的 OSD 恢复连接所需时间长,因此不建议使用它们。这减少了数据丢失的可能性。
警告
指定设备类的 CRUSH 规则不受拉伸模式支持。例如,指定ssd
设备类的以下规则将不起作用:
rule stretch_replicated_rule {
id 2
type replicated class ssd
step take default
step choose firstn 0 type datacenter
step chooseleaf firstn 2 type host
step emit
}
在未来,拉伸模式可能支持压缩编码池,支持跨多个数据中心部署,并支持多个 CRUSH 设备类。
其他命令
替换故障的裁决监视器
启动一个新的监视器并运行以下命令:
ceph mon set_new_tiebreaker mon.<new_mon_name>
此命令如果新监视器与现有的非裁决监视器位于同一位置,则会抗议。此命令将不会删除以前的裁决监视器。请自行删除以前的裁决监视器。
使用“--set-crush-location”而不是“ceph mon set_location”
如果您编写自己的 Ceph 部署工具,请在启动监视器时使用--set-crush-location
选项,而不是运行ceph
mon set_location
。此选项只接受一个bucket=loc
对(例如,ceph-mon --set-crush-location 'datacenter=a'
),并且这对必须与运行enable_stretch_mode
.
时指定的桶类型匹配
在拉伸降级模式下,当断开连接的数据中心恢复时,集群将自动进入“恢复”模式。如果这种情况没有发生,或者您想提前启用恢复模式,请运行以下命令:
ceph osd force_recovery_stretch_mode --yes-i-really-mean-it
Forcing normal stretch mode
在恢复模式下,当 PG 健康 时,集群应该回到正常拉伸模式。如果这种情况没有发生,或者如果您想提前强制跨数据中心对等并且愿意冒数据停机风险(或者已经单独验证所有 PG 都可以对等,即使它们没有完全恢复),请运行以下命令:
ceph osd force_healthy_stretch_mode --yes-i-really-mean-it
此命令可用于删除HEALTH_WARN
状态,该状态由恢复模式生成。
由 Ceph 基金会带给您
Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.