第 4 章 为 Ceph 存储扩展集群


作为存储管理员,您可以通过使用 2 个站点集群进入扩展模式来配置扩展集群。

Red Hat Ceph Storage 能够因为网络和集群而丢失 Ceph OSD,这同样可靠,并在 CRUSH map 中随机分布失败。如果有多个 OSD 关闭,则剩余的 OSD 和 monitor 仍然管理来运行。

但是,这可能不是某些扩展群集配置的最佳解决方案,因为 Ceph 集群的一部分只能使用单一网络组件。这个示例是位于多个数据中心的单个集群,用户希望保持丢失完整数据中心。

标准配置有两个数据中心。其他配置位于云或可用区中。每个站点都包含两个数据副本,复制大小为 4。与主站点相比,第三个站点应具有 tiebreaker 监控器,这可能是虚拟机或高延迟。如果网络连接失败,且两个数据中心仍处于活动状态,这个监控器会选择其中一个站点来恢复数据。

注意

标准 Ceph 配置会保留网络或数据中心的很多故障,永远不会破坏数据一致性。如果您在失败后恢复足够的 Ceph 服务器,它会恢复。如果您丢失了数据中心,但仍然可以组成仲裁,并且具有足够副本的所有可用数据,以满足池的 min_size 或 CRUSH 规则,或者 CRUSH 规则可以再次保持可用性,以满足大小。

注意

没有额外的步骤可以关闭扩展集群。如需更多信息,请参阅 关闭和重新引导 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 存储桶类型时才处于活动状态,假设两者都处于活动状态。池大小从默认的三个增加到四个,每个站点有两个副本。

在扩展模式中,Ceph OSD 仅允许在同一数据中心内连接到监控器。在没有指定位置的情况下,不允许新的 monitor 加入集群。

如果数据中心中的所有 OSD 和 monitor 都无法被访问,则存活数据中心将进入 降级 扩展模式。此问题会发出警告,将 min_size 减少到 1,并允许集群使用剩余的站点的数据访问 活动状态

注意

degraded 状态也会触发池太小的警告,因为池大小不会改变。但是,一个特殊的扩展模式标志可防止 OSD 在剩余的数据中心中创建额外的副本,因此仍然保留 2 个副本。

当缺少的数据中心再次变为不可访问时,集群进入 恢复 扩展模式。这会更改警告并允许对等点,但仍只需要数据中心中的 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!
    Copy to Clipboard Toggle word wrap

    为在两个站点上达到相同的权重,在两个站点上部署的 Ceph OSD 应该是相等的大小,即第一个站点的存储容量等同于第二个站点的存储容量。

  • 虽然它不强制执行,但您应该在每个站点上运行两个 Ceph 监视器,以及一个 tiebreaker,共 5 个。这是因为,在扩展模式中,OSD 只能连接到自己的站点中的监控器。
  • 您必须创建自己的 CRUSH 规则,该规则在每个站点上提供两个副本,总计在两个站点上有四个副本。
  • 如果您有具有非默认大小或 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
    Copy to Clipboard Toggle word wrap

  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
    Copy to Clipboard Toggle word wrap

    示例

    [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
    Copy to Clipboard Toggle word wrap

    重要

    您可以在 cephadm bootstrap 命令中使用不同的命令选项。但是,始终包含 --apply-spec 选项,以使用服务配置文件并配置主机位置。

方法 2:在部署后设置位置

先决条件

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

流程

  1. 添加两个存储桶,您要将非tiebreaker 监视器的位置设置为 CRUSH map,将存储桶类型指定为 datacenter

    语法

    ceph osd crush add-bucket BUCKET_NAME BUCKET_TYPE
    Copy to Clipboard Toggle word wrap

    示例

    [ceph: root@host01 /]# ceph osd crush add-bucket DC1 datacenter
    [ceph: root@host01 /]# ceph osd crush add-bucket DC2 datacenter
    Copy to Clipboard Toggle word wrap

  2. 将存储桶移到 root=default 下:

    语法

    ceph osd crush move BUCKET_NAME root=default
    Copy to Clipboard Toggle word wrap

    示例

    [ceph: root@host01 /]# ceph osd crush move DC1 root=default
    [ceph: root@host01 /]# ceph osd crush move DC2 root=default
    Copy to Clipboard Toggle word wrap

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

    语法

    ceph osd crush move HOST datacenter=DATACENTER
    Copy to Clipboard Toggle word wrap

    示例

    [ceph: root@host01 /]# ceph osd crush move host01 datacenter=DC1
    Copy to Clipboard Toggle word wrap

4.1.2. 进入扩展模式

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

先决条件

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

流程

  1. 设置每个 monitor 的位置,与 CRUSH 映射匹配:

    语法

    ceph mon set_location HOST datacenter=DATACENTER
    Copy to Clipboard Toggle word wrap

    示例

    [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
    Copy to Clipboard Toggle word wrap

  2. 生成 CRUSH 规则,它将两个副本放在每个数据中心上:

    语法

    ceph osd getcrushmap > COMPILED_CRUSHMAP_FILENAME
    crushtool -d COMPILED_CRUSHMAP_FILENAME -o DECOMPILED_CRUSHMAP_FILENAME
    Copy to Clipboard Toggle word wrap

    示例

    [ceph: root@host01 /]# ceph osd getcrushmap > crush.map.bin
    [ceph: root@host01 /]# crushtool -d crush.map.bin -o crush.map.txt
    Copy to Clipboard Toggle word wrap

    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
      }
      Copy to Clipboard Toggle word wrap

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

      此规则使集群具有数据中心 DC1 的读取权限。因此,所有读取或写入都通过放置在 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
      }
      Copy to Clipboard Toggle word wrap

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

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

  3. 注入 CRUSH map,使规则可供集群使用:

    语法

    crushtool -c DECOMPILED_CRUSHMAP_FILENAME -o COMPILED_CRUSHMAP_FILENAME
    ceph osd setcrushmap -i COMPILED_CRUSHMAP_FILENAME
    Copy to Clipboard Toggle word wrap

    示例

    [ceph: root@host01 /]# crushtool -c crush.map.txt -o crush2.map.bin
    [ceph: root@host01 /]# ceph osd setcrushmap -i crush2.map.bin
    Copy to Clipboard Toggle word wrap

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

    示例

    [ceph: root@host01 /]# ceph mon set election_strategy connectivity
    Copy to Clipboard Toggle word wrap

  5. 通过将 tiebreaker monitor 的位置设置为数据中心,进入扩展模式:

    语法

    ceph mon set_location HOST datacenter=DATACENTER
    ceph mon enable_stretch_mode HOST stretch_rule datacenter
    Copy to Clipboard Toggle word wrap

    示例

    [ceph: root@host01 /]# ceph mon set_location host07 datacenter=DC3
    [ceph: root@host01 /]# ceph mon enable_stretch_mode host07 stretch_rule datacenter
    Copy to Clipboard Toggle word wrap

    在本例中,monitor mon.host07 是 tiebreaker。

    重要

    tiebreaker 监控器的位置应与之前设置非tiebreaker 监视器的数据中心不同。在上例中,它是数据中心 DC3

    重要

    不要将此数据中心添加到 CRUSH map 中,因为它会在尝试进入扩展模式时产生以下错误:

    Error EINVAL: there are 3 datacenters in the cluster but stretch mode currently only works with 2!
    Copy to Clipboard Toggle word wrap
    注意

    如果要编写自己的工具来部署 Ceph,您可以在引导监视器时使用新的 --set-crush-location 选项,而不是运行 ceph mon set_location 命令。此选项只接受单个 bucket=location 对,如 ceph-mon --set-crush-location 'datacenter=DC1',它必须与运行 enable_stretch_mode 命令时指定的存储桶类型匹配。

  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
    Copy to Clipboard Toggle word wrap

    stretch_mode_enabled 应设为 true。您还可以查看扩展存储桶、扩展模式存储桶的数量,以及扩展模式是否降级或恢复。

  7. 验证监控器是否位于适当的位置:

    示例

    [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
    Copy to Clipboard Toggle word wrap

    您还可以查看哪个 monitor 是 tiebreaker,以及 monitor 选择策略。

4.1.3. 以扩展模式添加 OSD 主机

您可以在扩展模式下添加 Ceph OSD。该流程与在没有启用扩展模式的集群中添加 OSD 主机类似。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 在集群中启用的扩展模式。
  • 对节点的根级别访问权限。

流程

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

    语法

    ceph orch device ls [--hostname=HOST_1 HOST_2] [--wide] [--refresh]
    Copy to Clipboard Toggle word wrap

    示例

    [ceph: root@host01 /]# ceph orch device ls
    Copy to Clipboard Toggle word wrap

  2. 在特定主机或所有可用设备上部署 OSD:

    • 从特定主机上的特定设备创建 OSD:

      语法

      ceph orch daemon add osd HOST:DEVICE_PATH
      Copy to Clipboard Toggle word wrap

      示例

      [ceph: root@host01 /]# ceph orch daemon add osd host03:/dev/sdb
      Copy to Clipboard Toggle word wrap

    • 在任何可用的和未使用的设备上部署 OSD:

      重要

      这个命令会创建并置 WAL 和 DB 设备。如果要创建非并置设备,请不要使用这个命令。

      示例

      [ceph: root@host01 /]# ceph orch apply osd --all-available-devices
      Copy to Clipboard Toggle word wrap

  3. 将 OSD 主机移到 CRUSH 存储桶下:

    语法

    ceph osd crush move HOST datacenter=DATACENTER
    Copy to Clipboard Toggle word wrap

    示例

    [ceph: root@host01 /]# ceph osd crush move host03 datacenter=DC1
    [ceph: root@host01 /]# ceph osd crush move host06 datacenter=DC2
    Copy to Clipboard Toggle word wrap

    注意

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

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat