注意

本文档适用于 Ceph 的开发版本。

延伸集群

延伸集群

延伸集群将主机分散到地理上分离的数据中心,并采用特定的内部策略来可靠地本地化网络流量并应对故障。延伸集群更有可能发生(可能不对称的)网络分裂,以及整个数据中心暂时或完全丢失的可能性更高(这可能占集群总量的三分之一到一半)。

Ceph 的设计预期是其网络和集群的所有部分都将是可靠的,并且故障将随机分布在 CRUSH 拓扑中。当主机或网络交换机宕机时,许多 OSD 将变得不可用。Ceph 的设计使得剩余的 OSD 和 Monitors 能够保持对数据的访问。

有时这并不可靠。如果您的部署是“延伸集群”,其中大部分集群位于单个网络组件后面,您可能需要使用明确的延伸模式来确保数据完整性。

我们将在这里考虑两种标准配置:一种包含两个数据中心(或者在云中是两个可用区)的配置,以及一种包含三个数据中心的配置。

在两站点配置中,Ceph 为每个站点安排一份数据副本。第三个站点容纳一个仲裁(arbiter, witness)Monitor。当站点之间的网络连接失败且两个数据中心都保持活动状态时,此仲裁 Monitor 会选择一个获胜者。

仲裁 monitor 可以是虚拟机。与 OSD 站点之间相比,它与 OSD 站点之间的网络延迟也可能更高。

标准的 Ceph 配置能够承受许多网络故障或数据中心故障,而不会损害数据可用性。在故障后,当足够的集群组件恢复时,集群将恢复。如果您丢失了一个数据中心,但仍然能够形成 monitor 仲裁,并且仍然有所有数据的副本可用,Ceph 将保持可用性。这假设集群有足够的副本满足池的 min_size 配置选项,或者(如果不能满足)集群有 CRUSH 规则,这些规则将导致集群重新复制数据,直到满足 min_size 配置选项为止。

延伸集群问题

在任何情况下,Ceph 都不会损害数据完整性和数据一致性。当网络故障或 Ceph 节点丢失后恢复服务时,Ceph 将在无人干预的情况下恢复正常功能。

Ceph 不允许损害数据完整性或数据一致性,但在某些情况下,数据可用性会受损。即使有足够的数据副本可用以满足一致性和大小限制,也可能发生这种情况。在某些情况下,您可能会发现集群不满足这些限制。

我们将讨论的第一类故障涉及网络不一致。如果发生网络分裂(netsplit)(将网络分成两个无法相互通信的概念岛屿的故障),Ceph 可能无法将 OSD 标记为 down 并将其从放置组 (PG) 作用集中移除。尽管 PG primary 无法复制数据(在正常的非网络分裂情况下,这将导致受影响的 OSD 被标记为 down 并将其从 PG 中移除),但未能将 OSD 标记为 down 的情况仍会发生。发生这种情况时,Ceph 将无法满足持久性保证,因此将不允许 IO。

我们将讨论的第二类故障是,尽管数据看起来已正确复制,但约束不足以保证数据在数据中心之间复制。例如,在有两个数据中心(名为数据中心 A 和数据中心 B)的场景中,CRUSH 规则针对三个副本,并为一个 min_size=2 的池在每个数据中心放置一个副本,PG 可能会在数据中心 A 中有两个副本,而在数据中心 B 中有零个副本的情况下变为活动状态。在这种情况下,数据中心 A 的丢失意味着数据不可用,Ceph 和客户端将无法对其进行操作。仅使用常规 CRUSH 规则很难避免这种情况。

单个延伸池

设置单个 stretch pool 属性允许特定的池分布在两个或更多数据中心。这是通过对每个所需的池执行 ceph osd pool stretch set 命令来完成的。请参阅 取消设置延伸池的值

当您只有两个数据中心且需要整个集群的统一配置时,请使用延伸模式。相反,当您只需要特定池在两个以上数据中心之间复制时,请选择延伸池,这提供了更精细的控制级别。

限制

在两个或更多区域之间的网络分裂场景中,单个延伸池不支持 I/O 操作。虽然集群仍可用于基本的 Ceph 命令,但在解决网络分裂之前,I/O 仍然不可用。这与延伸模式不同,延伸模式中仲裁 monitor 可以隔离一个 CRUSH datacenter 并在网络分裂期间以降级模式提供 I/O 操作。请参阅 延伸模式

Ceph 旨在容忍多个组件故障。但是,如果集群中超过 25% 的 OSD 宕机,Ceph 可能会停止将 OSD 标记为 out,这会阻止重新平衡,并可能导致 PGs 变为 inactive。此行为由 mon_osd_min_in_ratio 选项控制。默认值为 0.75,这意味着集群中必须至少有 75% 的 OSD 处于 active 状态,才能将任何额外的 OSD 标记为 out。此设置可防止过多 OSD 被标记为 out,因为这可能导致连锁故障和数据移动的雷鸣般冲击,从而对客户端产生重大影响,并在 OSD 恢复服务时导致长时间的恢复。如果 Ceph 停止将 OSD 标记为 out,某些 PG 可能无法重新平衡到幸存的 OSD,从而可能导致 inactive PG。有关更多信息,请参阅 https://tracker.ceph.com/issues/68338

延伸模式

延伸模式旨在处理两个数据中心之间的网络分裂场景以及一个数据中心的丢失。它通过选择与仲裁 Monitor 连接最佳的幸存区域来处理网络分裂场景。它通过将所有池的 min_size 减少到 1 来处理一个数据中心的丢失,从而允许集群在幸存的数据中心内继续运行。当不可用的数据中心恢复时,Ceph 将根据配置的复制策略收敛并恢复正常运行。

连接性 Monitor 选举策略

使用延伸模式时,Monitor 选举策略必须设置为 connectivity。此策略跟踪 Monitor 之间的网络连接性,并用于确定当集群经历网络分裂时应优先选择哪个数据中心。

请参阅 更改 Monitor 选举

延伸对等规则

延伸模式的一个关键行为是它能够防止 PG 在作用集仅包含单个数据中心的副本时变为 active。此保护措施对于减轻站点故障期间数据丢失的风险至关重要,因为如果允许 PG 在仅包含单个站点的副本的情况下变为 active,则写入可能会在缺乏冗余的情况下被确认。如果发生站点故障,受影响 PG 中的所有数据都将丢失。

进入延伸模式

要启用延伸模式,您必须设置每个 monitor 的位置,并使其与 CRUSH 拓扑相关联。

  1. mon.a 放置在您的第一个数据中心

    ceph mon set_location a datacenter=site1
    
  2. 生成一个 CRUSH 规则,在每个数据中心放置两个副本。这需要直接编辑 CRUSH map

    ceph osd getcrushmap > crush.map.bin
    crushtool -d crush.map.bin -o crush.map.txt
    
  3. 编辑 crush.map.txt 文件以添加新规则。这里只有一条规则(id 1),但您可能需要使用不同的、唯一的规则 ID。我们有两个名为 site1site2datacenter 存储桶

     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
    }
    

    警告

    当 CRUSH 规则在延伸模式集群中定义并且规则有多个 take 步骤时,与 CRUSH 规则相关联的池的 MAX AVAIL 将报告可用大小是数据中心的所有可用空间,而不是与 CRUSH 规则相关联的池的可用空间。

    例如,考虑一个有两个 CRUSH 规则的集群,stretch_rulestretch_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 仅考虑单个 datacenter 的可用容量,而不是(正确的)两个 datacenters 的总可用容量。

    这里有一个解决方法。不是像上面 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 月开发。

  4. 编译并注入 CRUSH map,使规则可用于集群

    crushtool -c crush.map.txt -o crush2.map.bin
    ceph osd setcrushmap -i crush2.map.bin
    
  5. connectivity 模式下运行 Monitors。请参阅 更改 Monitor 选举

    ceph mon set election_strategy connectivity
    
  6. 指示集群进入延伸模式。在此示例中,mon.e 是仲裁 Monitor,我们正在跨 CRUSH datacenters 进行拆分。仲裁 monitor 必须分配一个 CRUSH datacenter,它既不是 site1 也不是 site2。此数据中心不应在您的 CRUSH map 中预定义。在这里,我们将 mon.e 放置在一个名为 site3 的虚拟数据中心中

    ceph mon set_location e datacenter=site3
    ceph mon enable_stretch_mode e stretch_rule datacenter
    

启用延伸模式后,PGs 仅在它们跨 CRUSH datacenter(或跨指定的任何 CRUSH 存储桶类型)对等时才会变为活动状态,假设两者都可用。池的大小将从默认的 3 增加到 4,并且每个站点将放置两个副本。OSD 将只允许连接到与它们位于同一数据中心内的 Monitors。如果新 Monitors 未指定 CRUSH 位置,则将不允许它们加入集群。

如果其中一个 datacenter 中的所有 OSD 和 Monitors 同时变得不可访问,则幸存 datacenter 中的集群进入降级延伸模式。将引发健康状态警告,池的 min_size 将减少到 1,并且集群将被允许使用单个剩余站点上的组件和数据变为活动状态。池 size 不会改变,因此会引发 PGs 大小不足的警告,但一个特殊的延伸模式标志将阻止 OSD 在剩余数据中心中创建额外的副本。这意味着数据中心将只保留两个副本,就像以前一样。

当不可访问的 datacenter 恢复时,集群将进入恢复延伸模式。这将更改警告并允许对等,但只需要在整个停机期间保持 updatacenter 中的 OSD。当所有 PG 都处于已知状态,并且既未降级也未大小不足/不完整时,集群将转换回常规延伸模式,结束警告,将池的 min_size 恢复到其原始值 2,要求两个站点的 PG 对等,并且在对等时不再需要整个停机期间保持 up 的站点。这使得在需要时可以故障转移到另一个站点。

退出延伸模式

要退出延伸模式,请运行以下命令

ceph mon disable_stretch_mode [{crush_rule}] --yes-i-really-mean-it
{crush_rule}

用于所有池的非延伸 CRUSH 规则。如果未指定,池将移动到默认 CRUSH 规则。

类型:

String

必需:

否。

此命令将集群移回正常模式;集群将不再处于延伸模式。所有池都将设置其先前的 sizemin_size 值。此时,如果用户选择使用较少的 OSD 运行,则需要负责缩小集群到所需的 OSD 数量。

请注意,当集群处于恢复延伸模式时,命令将不会执行。命令仅在集群处于降级延伸模式或健康延伸模式时执行。

延伸模式的限制

使用延伸模式时,OSD 必须位于恰好两个站点。

每个数据中心必须运行两个 Monitors,外加一个位于第三个(可能在云中)的仲裁 Monitor,总共五个 Monitors。在延伸模式下,OSD 只会连接到位于其所在数据中心内的 Monitors。OSD 连接到仲裁 monitor。

纠删码池不能与延伸模式一起使用。尝试将纠删码池与延伸模式一起使用将失败。在延伸模式下不能创建纠删码池。

要使用延伸模式,您需要创建一个 CRUSH 规则,在每个数据中心提供两个副本。确保总共有四个副本:每个数据中心两个。如果集群中存在没有默认 sizemin_size 的池,Ceph 将不会进入延伸模式。上面给出了此类 CRUSH 规则的示例。

因为延伸模式运行时的池 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 设备类。

其他命令

替换失败的仲裁 monitor

部署新的 Monitor 并运行以下命令

ceph mon set_new_tiebreaker mon.<new_mon_name>

如果新的 Monitor 与现有的非仲裁 monitor 位于相同的 CRUSH 位置,此命令会发出警告。此命令不会移除先前的仲裁 monitor。如果合适,您必须手动移除先前的仲裁 Monitor。

使用 “--set-crush-location” 而不是 “ceph mon set_location”

如果您使用自己的工具部署 Ceph,请在引导 Monitors 时使用 --set-crush-location 选项,而不是运行 ceph mon set_location。此选项只接受一个 bucket=loc 参数,例如 ceph-mon --set-crush-location 'datacenter=a',并且该参数的 CRUSH 存储桶类型必须与运行 enable_stretch_mode 时指定的存储桶类型匹配。

强制恢复延伸模式

处于延伸降级模式时,当断开连接的数据中心恢复时,集群将自动进入恢复模式。如果未发生这种情况或者您想提前启用恢复模式,请运行以下命令

ceph osd force_recovery_stretch_mode --yes-i-really-mean-it

强制正常延伸模式

处于恢复模式时,当 PG 健康时,集群应恢复到正常的延伸模式。如果未能发生这种情况,或者您想提前强制跨数据中心对等,并且愿意承担数据停机风险(或者已单独验证所有 PG 都可以对等,即使它们尚未完全恢复),请运行以下命令

ceph osd force_healthy_stretch_mode --yes-i-really-mean-it

此命令可用于删除恢复模式引发的 HEALTH_WARN 状态。

由 Ceph 基金会为您呈现

Ceph 文档是由非营利性 Ceph 基金会 资助和托管的社区资源。如果您希望支持这项工作和我们的其他努力,请考虑 立即加入