第 2 章 CRUSH 管理

CRUSH(可扩展哈希下的受控复制)算法确定如何通过计算数据存储位置存储和检索数据。

 

任何足够高级的技术都与魔法无关。

 
 -- Arthur C. Clarke

2.1. CRUSH 简介

存储集群的 CRUSH map 描述了 CRUSH 层次结构中的设备位置,以及 Ceph 存储数据的各个层次结构的规则。

CRUSH map 包含至少一个节点层次结构并离开。Ceph 中名为"buckets"的层次结构节点是其类型定义的任何存储位置聚合。例如,行、机架、机箱、主机和设备。层次结构的每个小部件基本上由存储设备列表中的一个存储设备组成。leaf 始终包含在一个节点或"bucket"。 CRUSH map 也有一个规则列表,它们决定了 CRUSH 存储和检索数据的方式。

注意

将 OSD 添加到集群时,存储设备会添加到 CRUSH map 中。

CRUSH 算法根据每个设备的权重值在存储设备之间分发数据对象,比较均匀的概率分布。CRUSH 根据管理员定义的层次结构群集映射分发对象及其副本或纠删编码区块。CRUSH map 代表可用的存储设备和逻辑 bucket,它们含有规则,并通过扩展使用该规则的每个池来表示。

若要将 PG map 到故障域或性能域之间的 OSD,CRUSH map 定义 bucket 类型层次结构列表;即,位于生成的 CRUSH map 中的 类型 下。创建 bucket 层次结构的目的是通过其故障域或性能域或两者分隔机节点。故障域包括主机、机箱、机架、电源分配单元、pod、行、室和数据中心。性能域包括特定配置的故障域和 OSD。例如,SSD、带有 SSD 日志的 SAS 驱动器、SATA 驱动器等。在 RHCS 3 中,设备具有一个 的概念,如 hddssdnvme,从而更加快速地构建 CRUSH 层次结构和类设备。

除代表 OSD 的 leaf 节点外,其他层次结构是任意的,如果默认类型不满足您的要求,您可以根据自己的需求对其进行定义。我们建议根据您的组织的硬件命名约定来调整 CRUSH map bucket 类型,并使用反映物理硬件名称的实例名称。您的命名实践可以更加轻松地管理集群,并在 OSD 或其他硬件出现故障时对问题进行故障排除,并且管理员需要远程或物理访问主机或其他硬件。

在以下示例中,存储桶层次结构具有四个 leaf bucket(osd 1-4)、两个节点存储桶(主机 1-2)和一个机架节点(机架 1)。

CRUSH 层次结构

由于 leaf 节点反映 CRUSH map 开头 设备列表下声明的存储设备,因此无需将它们声明为 bucket 实例。层次结构中的第二个最低存储桶类型通常聚合设备;即,它通常是包含存储介质的计算机,并且使用管理员更喜欢描述它的任何术语,如"node"、"computer"、"server,"、"host"、"machine"等等。在高密度环境中,看到每个卡和每个机箱的多个主机/节点越来越常见。确保也考虑卡和机箱故障,例如,如果节点出现故障可能会导致大量主机/节点及其 OSD 发生故障,则需要拉取卡或机箱。

在声明存储桶实例时,指定其类型,将其指定唯一名称作为字符串,为它分配一个可选的唯一 ID,以负整数表示,指定相对于其项目的总容量或功能的权重,指定 bucket 算法,如 straw 以及通常 0 反映哈希算法 rjenkins1 的哈希值。bucket 可以具有一个或多个项目。项目可以由节点存储桶或离开组成。项目可以具有一个权重来反映项目的相对权重。

2.1.1. 动态放置数据

Ceph 客户端和 Ceph OSD 都使用 CRUSH map 和 CRUSH 算法。

  • Ceph 客户端: 通过将 CRUSH map 分发到 Ceph 客户端,CRUSH 支持 Ceph 客户端直接与 OSD 通信。这意味着 Ceph 客户端避免中央化对象查找表,该表可以充当单一故障点、性能瓶颈、集中查找服务器的连接限制,以及对存储群集可扩展性的物理限制。
  • Ceph OSD: 通过将 CRUSH map 分发到 Ceph OSD,Ceph 使 OSD 能够处理复制、回填和恢复。这意味着 Ceph OSD 代表 Ceph 客户端处理对象副本(或编码区块)的存储。这也意味着 Ceph OSD 对集群有足够的了解,可以重新平衡集群(回填)并从故障中动态恢复。

2.1.2. 建立故障域

有多个对象副本或 M 纠删代码区块有助于防止数据丢失,但这不足以解决高可用性问题。通过反映 Ceph 存储群集的底层物理组织,CRUSH 可以建模,从而解决潜在的关联设备故障来源。通过将集群的拓扑编码到集群映射中,CRUSH 放置策略可以在不同故障域中分隔对象副本或纠删代码区块,同时仍然保持所需的伪随机分布。例如,为了解决并发故障的可能性,可能需要确保数据副本或纠删代码区块位于使用不同的 shelves、机架、电源、控制器或物理位置的设备中。这有助于防止数据丢失,并允许集群处于降级状态。

2.1.3. 建立性能域

Ceph 可以支持多种层次结构,将一种类型的硬件性能配置文件与其他类型的硬件性能配置文件分隔开。例如,CRUSH 可以为硬盘创建一个层次结构,并为 SSD 创建另一个层次结构。性能域 - 由于需要支持不同的性能特性,因此将底层硬件的性能配置集考虑到性能域 - 由于需要支持不同的性能特性,因此越来越流行。从操作角度而言,它们只是具有多个 bucket 的 CRUSH map。使用案例示例包括:

  • 虚拟机: 作为 OpenStack、CloudStack、ProxMox 或 OpenNebula 等云平台的后端的 Ceph 主机倾向于使用最稳定、最高性能的文件系统,如 SAS 驱动器上的 XFS,以及分区的高性能 SSD 用于日志,因为 XFS 不会同时进行日志处理。为了保持一致的性能配置文件,此类用例应在 CRUSH 层次结构中聚合类似的硬件。
  • 对象存储: Ceph 主机充当 S3 和 Swift 接口的对象存储后端的 Ceph 主机可能会利用更低成本的存储介质,如 SATA 驱动器,这些介质可能不适用于虚拟机,减少用于对象存储的成本,而将更经济的存储主机与在云平台上存储卷和镜像相分离。HTTP 往往成为对象存储系统的瓶颈。
  • 冷存储 :为冷存储设计而设计的系统 - 正常访问的数据,或者有重排性能要求的数据检索 -​might 利用价格较低的存储介质和纠删代码。但是,纠删代码可能需要一些额外的 RAM 和 CPU,因此与用于对象存储或虚拟机的主机的 RAM 和 CPU 要求不同。
  • SSD 支持的池: SSD 昂贵,但与硬盘相比具有显著的优势。SSD 没有寻道时间,它们提供较高的总吞吐量。除了将 SSD 用于日志外,群集还可以支持 SSD 支持的池。常见的用例包括高性能 SSD 池。例如,可以将 Ceph 对象网关的 .rgw.buckets.index 池映射到 SSD,而非 SATA 驱动器。红帽不支持索引池的 HDD 设备。如需有关支持的配置的更多信息,请参阅 Red Hat Ceph Storage: 支持的配置 文章。

在 RHCS 3 及更高版本中,CRUSH map 支持设备 的概念。Ceph 可以发现存储设备的各个方面,并且自动分配 hddssdnvme 等类。但是,CRUSH 不限于这些默认值。例如,CRUSH 层次结构也可能用于分隔不同类型的工作负载。例如,SSD 可用于日志或 write-ahead 日志、bucket 索引或原始对象存储。CRUSH 可以支持不同的设备类别,如 ssd-bucket-indexssd-object-storage,因此 Ceph 不会将相同的存储介质用于不同的工作负载,提高性能可预测性和一致性。

2.1.3.1. 在 RHCS 3 及稍后使用不同的设备类

若要在 RHCS 3 中创建性能域,请使用设备类和单个 CRUSH 层次结构。只需将 OSD 添加到 CRUSH 层次结构的方式与使用 CLI 的 RHCS 2 相同。然后执行以下操作:

  1. 为每个设备添加一个类。例如:

    # ceph osd crush set-device-class <class> <osdId> [<osdId>]
    # ceph osd crush set-device-class hdd osd.0 osd.1 osd.4 osd.5
    # ceph osd crush set-device-class ssd osd.2 osd.3 osd.6 osd.7
  2. 然后,创建规则来使用该设备。

    # ceph osd crush rule create-replicated <rule-name> <root> <failure-domain-type> <class>
    # ceph osd crush rule create-replicated cold default host hdd
    # ceph osd crush rule create-replicated hot default host ssd
  3. 最后,将池设置为使用 规则。

    ceph osd pool set <poolname> crush_rule <rule-name>
    ceph osd pool set cold_tier crush_rule cold
    ceph osd pool set hot_tier crush_rule hot

使用 RHCS 3 和更高版本时,无需手动编辑 CRUSH map!