第 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_size2。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-bucketceph osd crush move 命令手动设置位置。

方法 1:引导集群

先决条件

  • 对节点的根级别访问权限。

流程

  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

  2. 使用 --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:在部署后设置位置

先决条件

  • 对节点的根级别访问权限。

流程

  1. 添加两个 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

  2. 将存储桶移到 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

  3. 根据所需的 CRUSH 放置移动 OSD 主机:

    语法

    ceph osd crush move HOST datacenter=DATACENTER

    示例

    [ceph: root@host01 /]# ceph osd crush move host01 datacenter=DC1

4.1.2. 进入扩展模式

新的扩展模式旨在处理两个站点。在 2 个站点集群中,组件可用性中断的风险较低。

先决条件

  • 对节点的根级别访问权限。
  • CRUSH 位置设置为主机。

流程

  1. 设置每个 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

  2. 生成 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

    1. 编辑解译 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
      }

      1
      规则 ID 必须是唯一的。在这个示例中,只有一条 id 为 0 的规则,因此使用了 id 1,但您可能需要根据现有规则的数量使用不同的规则 ID。
      2 3
      在本例中,有两个数据中心存储桶,名为 DC1DC2
      注意

      此规则使集群具有数据中心 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
      }

      在此规则中,数据中心会被随机选择,并自动选择。

      有关 firstnindep 选项的更多信息,请参阅 CRUSH 规则

  3. 注入 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

  4. 如果您没有在连接模式下运行监控器,请将选择策略设置为 connectivity

    示例

    [ceph: root@host01 /]# ceph mon set election_strategy connectivity

  5. 通过将 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 类型匹配。

  6. 验证扩展模式是否已成功启用:

    示例

    [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。您还可以查看扩展存储桶、扩展模式存储桶的数量,以及扩展模式是否降级或恢复。

  7. 验证 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 集群。
  • 在集群中启用的扩展模式。
  • 对节点的根级别访问权限。

流程

  1. 列出可用的设备来部署 OSD:

    语法

    ceph orch device ls [--hostname=HOST_1 HOST_2] [--wide] [--refresh]

    示例

    [ceph: root@host01 /]# ceph orch device ls

  2. 将 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

  3. 将 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

    注意

    确保在两个站点中添加相同的拓扑节点。如果仅在一个站点中添加主机,则可能会出现问题。

其它资源

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.