第 4 章 处理数据中心失败
红帽 Ceph 存储可能会对基础架构出现灾难性故障,例如在扩展集群中丢失三个数据中心之一。对于标准对象存储用例,可将所有三个数据中心配置独立使用在它们之间进行复制设置。在这种情况下,每个数据中心的集群配置可能会有所不同,反映本地的功能和依赖项。
应考虑放置层次结构的逻辑结构。可以使用正确的 CRUSH map,反映基础架构中故障域的层次结构。使用逻辑层次定义可提高存储集群的可靠性,而不是使用标准的分层定义。故障域在 CRUSH map 中定义。默认的 CRUSH map 包含扁平层次结构中的所有节点。
在三个数据中心环境中,通过扩展集群,节点放置应以一个数据中心停止运行的方式进行管理,但存储集群会继续运行。当为数据使用三向复制时,请考虑节点所在的故障域,在一个数据中心的停机时,可能存在一些数据保留的。当发生这种情况时,有两个选项:
- 将只读状态的数据保留为标准设置。
- 在中断期间只有一个副本。
使用标准设置,由于数据在节点间的随机性,并非所有数据都会受到影响,但某些数据可能只有一个副本,而且存储集群将恢复为只读模式。
在下面的示例中,生成的 map 派生自具有 6 个 OSD 节点的集群的初始设置。在本例中,所有节点都只有一个磁盘,因此一个 OSD。所有节点都按照默认的 root 排列,这是层次结构树的标准根。由于这些 OSD 分配到两个 OSD 的权重,这些 OSD 收到比其他 OSD 更少的数据块。这些节点稍后引入,其磁盘比初始 OSD 磁盘大。这不会影响数据放置,以防出现一组节点故障。
标准 CRUSH map
$ sudo ceph osd tree ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY -1 0.33554 root default -2 0.04779 host ceph-node3 0 0.04779 osd.0 up 1.00000 1.00000 -3 0.04779 host ceph-node2 1 0.04779 osd.1 up 1.00000 1.00000 -4 0.04779 host ceph-node1 2 0.04779 osd.2 up 1.00000 1.00000 -5 0.04779 host ceph-node4 3 0.04779 osd.3 up 1.00000 1.00000 -6 0.07219 host ceph-node6 4 0.07219 osd.4 up 0.79999 1.00000 -7 0.07219 host ceph-node5 5 0.07219 osd.5 up 0.79999 1.00000
使用逻辑层次定义将节点分组到同一数据中心,以获得数据放置成熟度。可能的定义类型:数据中心、机架、行和 主机 允许反映三个数据中心的故障域:
- 节点 ceph-node1 和 ceph-node2 驻留在数据中心 1(DC1)
- 节点 ceph-node3 和 ceph-node5 驻留在数据中心 2(DC2)
- 节点 ceph-node4 和 ceph-node6 驻留在数据中心 3(DC3)中
- 所有数据中心都属于相同的结构(allDC)
由于主机中的所有 OSD 都属于主机定义,因此无需更改。所有其他分配都可以在存储集群的运行时调整:
使用以下命令 定义存储桶 结构:
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 映射,将节点移到这个结构中的相应位置:
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 ceph-node1 datacenter=DC1 ceph osd crush move ceph-node2 datacenter=DC1 ceph osd crush move ceph-node3 datacenter=DC2 ceph osd crush move ceph-node5 datacenter=DC2 ceph osd crush move ceph-node4 datacenter=DC3 ceph osd crush move ceph-node6 datacenter=DC3
在此结构中,也可以添加任何新主机,以及新的磁盘。通过将 OSD 放置到层次结构中的正确位置,CRUSH 算法被更改为将冗余片段放入不同的故障域中。
以上示例会产生以下内容:
$ sudo 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 ceph-node1 2 1.00000 osd.2 up 1.00000 1.00000 -3 1.00000 host ceph-node2 1 1.00000 osd.1 up 1.00000 1.00000 -10 2.00000 datacenter DC2 -2 1.00000 host ceph-node3 0 1.00000 osd.0 up 1.00000 1.00000 -7 1.00000 host ceph-node5 5 1.00000 osd.5 up 0.79999 1.00000 -11 2.00000 datacenter DC3 -6 1.00000 host ceph-node6 4 1.00000 osd.4 up 0.79999 1.00000 -5 1.00000 host ceph-node4 3 1.00000 osd.3 up 1.00000 1.00000 -1 0 root default
以上列表通过显示 osd 树来显示生成的 CRUSH map。现在,易于查看是主机如何属于数据中心,所有数据中心都属于同一顶级结构,但可清楚地区分位置。
根据 map 将数据放置到正确的位置,只能在健康的集群中正常工作。当某些 OSD 不可用时,可能会发生 Misplacement。这些错误替换会在可能的情况下自动更正。
其它资源
- 如需更多信息,请参阅 Red Hat Ceph Storage 策略指南中的 CRUSH 管理 章节。