15.3. 处理数据中心故障

Red Hat Ceph Storage 可能会对基础架构造成灾难性故障,例如在扩展集群中丢失一个数据中心。对于标准对象存储用例,可通过之间设置来独立配置所有三个数据中心。在这种情况下,每个数据中心的存储集群配置可能会有所不同,反映本地功能和依赖项。

应考虑放置层次结构的逻辑结构。可以使用适当的 CRUSH map,反映基础架构中故障域的层次结构。使用逻辑分级定义可提高存储集群的可靠性,而不是使用标准分级定义。故障域在 CRUSH 映射中定义。默认 CRUSH map 包含扁平层次结构中的所有节点。在三个数据中心环境中,如扩展集群,节点放置应以一个数据中心停机的方式进行管理,但存储集群可以保持启动并运行。在为数据使用三向复制时,请考虑节点位于哪个故障域中。

在以下示例中,生成的 map 源自存储集群的初始设置,包含 6 个 OSD 节点。在本例中,所有节点都只有一个磁盘,因此有一个 OSD。所有节点在默认 root 下排列,这是层次结构树的标准 root。由于分配给两个 OSD 的权重,这些 OSD 接收比其他 OSD 更少的数据区块。这些节点比初始 OSD 磁盘大于初始 OSD 磁盘而稍后引入。这不会影响到一组节点失败的数据放置。

示例

[ceph: root@host01 /]# ceph osd tree
ID WEIGHT  TYPE NAME           UP/DOWN REWEIGHT PRIMARY-AFFINITY
-1 0.33554 root default
-2 0.04779     host host03
 0 0.04779         osd.0            up  1.00000          1.00000
-3 0.04779     host host02
 1 0.04779         osd.1            up  1.00000          1.00000
-4 0.04779     host host01
 2 0.04779         osd.2            up  1.00000          1.00000
-5 0.04779     host host04
 3 0.04779         osd.3            up  1.00000          1.00000
-6 0.07219     host host06
 4 0.07219         osd.4            up  0.79999          1.00000
-7 0.07219     host host05
 5 0.07219         osd.5            up  0.79999          1.00000

使用逻辑分层定义将节点分组到同一数据中心可以达到数据放置成熟度。可能的定义类型 root, datacenter, rack, rowhost 可以反映出三个数据中心扩展集群的故障域:

  • 节点 host01 和 host02 位于数据中心 1(DC1)
  • 节点 host03 和 host05 位于数据中心 2(DC2)
  • 节点 host04 和 host06 位于数据中心 3(DC3)
  • 所有数据中心都属于相同的结构(allDC)

由于主机中的所有 OSD 都属于主机定义,因此不需要更改。所有其他分配可在存储集群的运行时调整:

  • 使用以下命令定义 bucket 结构:

    ceph osd crush add-bucket allDC root
    ceph osd crush add-bucket DC1 datacenter
    ceph osd crush add-bucket DC2 datacenter
    ceph osd crush add-bucket DC3 datacenter
  • 通过修改 CRUSH map,将节点移到此结构中的相应位置:

    ceph osd crush move DC1 root=allDC
    ceph osd crush move DC2 root=allDC
    ceph osd crush move DC3 root=allDC
    ceph osd crush move host01 datacenter=DC1
    ceph osd crush move host02 datacenter=DC1
    ceph osd crush move host03 datacenter=DC2
    ceph osd crush move host05 datacenter=DC2
    ceph osd crush move host04 datacenter=DC3
    ceph osd crush move host06 datacenter=DC3

在这个结构中,也可以添加任何新主机以及新磁盘。将 OSD 放置到层次结构中的正确位置,即 CRUSH 算法将冗余部分放入结构中的不同故障域中。

上例的结果如下:

示例

[ceph: root@host01 /]# ceph osd tree
ID  WEIGHT  TYPE NAME               UP/DOWN REWEIGHT PRIMARY-AFFINITY
 -8 6.00000 root allDC
 -9 2.00000     datacenter DC1
 -4 1.00000         host host01
  2 1.00000             osd.2            up  1.00000          1.00000
 -3 1.00000         host host02
  1 1.00000             osd.1            up  1.00000          1.00000
-10 2.00000     datacenter DC2
 -2 1.00000         host host03
  0 1.00000             osd.0            up  1.00000          1.00000
 -7 1.00000         host host05
  5 1.00000             osd.5            up  0.79999          1.00000
-11 2.00000     datacenter DC3
 -6 1.00000         host host06
  4 1.00000             osd.4            up  0.79999          1.00000
 -5 1.00000         host host04
  3 1.00000             osd.3            up  1.00000          1.00000
 -1       0 root default

以上列表通过显示 osd 树来显示生成的 CRUSH map。便于查看现在,主机属于数据中心和所有数据中心如何属于相同的顶级结构,但清晰区分位置。

注意

根据映射将数据放在正确的位置,只在健康的集群中正常工作。当某些 OSD 不可用时,misplacement 可能会发生。这些错误替换会在可能这样做后自动更正。

其它资源

  • 如需更多信息,请参阅 Red Hat Ceph Storage Storage 策略指南中的 CRUSH 管理一章。