Ceph集群架构介绍(pacific版本)

1. 同一物理硬件上运行多个集群(已弃用)

  • 每个 Ceph 集群都有一个内部名称,用作配置和日志文件名称以及目录和挂载点名称的一部分。此名称默认为“ceph”。
  • 以前的 Ceph 版本允许指定自定义名称,例如“ceph2”。这旨在促进在同一物理硬件上运行多个逻辑集群,但实际上这很少被利用,不应再尝试。自定义集群名称现在被认为已弃用。
  • 先前的文档也可能被误解为需要唯一的集群名称才能使用rbd-mirror。
  • 强烈建议使用默认名称“ceph”部署所有新集群。

2. 延伸集群

2.1 介绍

Ceph 通常期望其网络和整个集群的所有部分都同样可靠,故障随机分布在 CRUSH 映射中。因此,您可能会丢失一个交换机,该交换机会破坏多个 OSD,但我们希望剩余的 OSD 和MON能够绕过该交换机。

这通常是一个不错的选择,但在某些扩展集群配置中可能无法正常工作,因为集群的很大一部分卡在单个网络组件后面。例如,位于多个数据中心的单个集群,并且您希望承受整个 DC 的丢失。

我们已经看到部署了两种标准配置,有两个或三个数据中心(或者,在云中,可用区)。对于两个区域,我们希望每个站点都保存一份数据副本,并且对于第三个站点有一个决胜MON(这可以是一个虚拟机或与主要站点相比具有高延迟),以便在网络连接的情况下选择获胜者失败,两个 DC 都还活着。对于三个站点,我们希望每个站点都有一份数据副本和相同数量的MON。

请注意,标准的 Ceph 配置可以承受网络或数据中心的许多故障,并且永远不会损害数据的一致性。如果您在发生故障后恢复了足够多的 Ceph 服务器,它就会恢复。如果你失去了一个数据中心,但仍然可以组成一个法定人数的MON并拥有所有可用的数据(有足够的副本来满足池的min_size要求,或者 CRUSH 规则会重新复制以满足它),Ceph 将保持可用性。

2.2 问题

无论发生什么,Ceph 都不会在数据完整性和一致性上妥协。如果您的网络出现故障或节点丢失并且您可以恢复服务,Ceph 将自行恢复正常功能。

但是在某些情况下,尽管有足够的可用服务器来满足 Ceph 的一致性和大小限制,但您会失去数据可用性,或者您可能会惊讶于不满足 Ceph 的限制。

  • 这些故障的第一个重要类别是围绕不一致的网络解决的——如果存在 netsplit(网络分区),Ceph 可能无法将 OSD 标记为 down 并将它们踢出正在执行的 PG 集中,尽管主节点无法复制数据。如果发生这种情况,将不允许 IO,因为 Ceph 无法满足其持久性保证。
  • 第二类重要的故障是当您认为您的数据跨数据中心复制时,但约束不足以保证这一点。例如,您可能有数据中心 A 和 B,您的 CRUSH 规则以 3 个副本为目标,并在每个数据中心放置一个副本,其中 Amin_size为 2。PG 可能会在站点 A 中有 2 个副本而在站点 B 中没有副本时处于活动状态,这意味着如果您随后丢失站点 A,您将丢失数据并且 Ceph 无法对其进行操作。使用标准 CRUSH 规则,这种情况出奇地难以避免。

2.3 延伸模式

新的延伸模式旨在处理 2-site case。三个站点同样容易受到 netsplit 问题的影响,但比 2 站点集群更能容忍组件可用性中断。

要进入延伸模式,您必须设置每台MON的位置,以匹配您的 CRUSH Map。例如,放置mon.a在您的第一个数据中心:

$ ceph mon set_location a datacenter=site1

接下来,生成一个 CRUSH 规则,它将在每个数据中心放置 2 个副本。这将需要直接编辑 CRUSH Map:

$ ceph osd getcrushmap > crush.map.bin
$ crushtool -d crush.map.bin -o crush.map.txt

现在编辑crush.map.txt文件以添加新规则。这里只有一个其他规则,所以这是 ID 1,但您可能需要使用不同的规则 ID。我们还有两个名为site1andsite2的数据中心存储桶:

rule stretch_rule {
        id 1
        type replicated
        min_size 1
        max_size 10
        step take site1
        step chooseleaf firstn 2 type host
        step emit
        step take site2
        step chooseleaf firstn 2 type host
        step emit
}

最后,注入 CRUSH Map以使规则对集群可用:

$ crushtool -c crush.map.txt -o crush2.map.bin
$ ceph osd setcrushmap -i crush2.map.bin

如果您尚未在连接模式下运行监视器,请按照更改监视器选举中的说明进行操作。

最后,告诉集群进入延伸模式。这mon.e是决胜站点,我们正在跨数据中心进行拆分

$ ceph mon enable_stretch_mode e stretch_rule data center
  • 启用延伸模式后,OSD 将仅在 PG 对等跨数据中心(或您指定的任何其他 CRUSH 存储桶类型)时激活 PG,假设两者都处于活动状态。池的大小将从默认的 3 增加到 4,预计每个站点中有 2 个副本。OSD 只能连接到同一数据中心的MON。如果未指定位置,则不允许新MON加入集群。
  • 如果一个数据中心的所有 OSD 和MON一次都无法访问,则幸存的数据中心将进入降级延伸模式。这将发出警告,将 min_size 减小到 1,并允许集群在剩余的单个站点中使用数据进行活动。请注意,我们不会更改池副本数,因此您还会收到池副本数太小的警告——但一个特殊的拉伸模式标志会阻止 OSD 在剩余的数据中心创建额外的副本(因此它只会保留 2 个副本, 像之前一样)。
  • 当丢失的数据中心回来时,集群将进入恢复延伸模式。这会改变警告并允许对等,但仍然只需要来自一直处于运行状态的数据中心的 OSD。当所有 PG 都处于已知状态,并且既没有降级也没有不完整时,集群将转换回常规延伸模式,结束警告,将 min_size 恢复为其起始值 (2) 并要求两个站点对等,并停止要求始终对等时的活动站点(以便您可以在必要时故障转移到另一个站点)。

2.4 限制

  • 正如上述设置所示,延伸模式仅处理 2 个具有 OSD 的站点。
  • 虽然没有强制执行,但您应该在每个站点运行 2 个MON,外加一个 tiebreaker(仲裁站点MON),总共 5 个。这是因为 OSD 只能在延伸模式下连接到自己站点中的MON。
  • 您不能将纠删码池与延伸模式一起使用。如果您尝试,它会拒绝,并且不允许您在延伸模式下创建 EC 池。
  • 您必须创建自己的 CRUSH 规则,该规则在每个站点提供 2 个副本,并且您必须使用 4 个副本,每个站点有 2 个副本。如果您的现有池具有非默认 size/min_size,则当您尝试启用延伸模式时,Ceph 将反对。
  • 因为它可能会在降级min_size 1时运行,所以您应该只对全闪存 OSD 使用延伸模式。这可以最大限度地减少连接恢复后数据恢复所需的时间,从而最大限度地减少数据丢失的可能性。
  • 希望未来的开发将扩展此功能以支持 EC 池并运行超过 2 个完整站点。

2.5 其他命令

从 Pacific v16.2.8 开始,如果您的 tiebreaker MON由于某种原因出现故障,您可以更换它。启动新MON并运行:

$ ceph mon set_new_tiebreaker mon.<new_mon_name>

如果新MON与现有的非决胜MON位于同一位置,此命令将发出抗议。此命令不会删除之前的决胜MON;你应该自己删除。

同样在 16.2.7 中,如果您正在编写自己的工具来部署 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-realy-mean-it

但是这个命令应该不是必需的;它包括处理意外情况。

当处于恢复模式时,集群应该在 PG 健康时回到正常的延伸模式。如果这没有发生,或者您想尽早强制跨数据中心对等并愿意冒数据停机的风险(或已单独验证所有 PG 都可以对等,即使它们没有完全恢复),您可以调用:

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

这个命令应该不是必需的;它包括处理意外情况。但是您可能希望调用它来删除HEALTH_WARN恢复模式生成的状态。

 

posted @ 2022-04-09 16:31  Varden  阅读(573)  评论(0编辑  收藏  举报