第 2 章 CRUSH 管理员概述
可扩展哈希下的受控复制(CRUSH)算法确定如何通过计算数据存储位置存储和检索数据。
任何足够高级的技术都与魔法无关。 | ||
| -- Arthur C. Clarke | ||
2.1. CRUSH 简介 复制链接链接已复制到粘贴板!
存储集群的 CRUSH 映射描述了 CRUSH 层次结构中的设备位置,以及确定 Ceph 如何存储数据的层次结构的规则。
CRUSH map 至少包含一个节点层次结构和离开。Ceph 中名为"buckets"的节点是任何由类型定义的存储位置聚合。例如,行、机架、机箱、主机和设备。层次结构的每个叶基本上由存储设备列表中的一个存储设备组成。leaf 总是包含在一个节点或"bucket"中。CRUSH map 也具有决定 CRUSH 如何存储和检索数据的规则列表。
将 OSD 添加到集群时,存储设备会添加到 CRUSH map。
CRUSH 算法根据每个设备的权重值将数据对象分布到存储设备中,从而达到统一性分布。CRUSH 根据管理员定义的分层集群映射分发对象及其副本或纠删代码区块。CRUSH 映射代表可用的存储设备以及包含该规则的逻辑存储桶,并扩展使用该规则的每个池。
要将放置组映射到 OSD 跨故障域或性能域,CRUSH 映射定义了 bucket 类型的层次结构列表;即,在生成的 CRUSH 映射中的 类型 下。创建存储桶层次结构的目的是,通过其故障域或性能域来隔离叶节点。故障域包括主机、机箱、机架、电源分配单元、pod、行、房间和数据中心。安全域包括特定配置的故障域和 OSD。例如: SSD、SAS 驱动器以及 SSD 日志、SATA 驱动器等。设备具有 类 的概念,如 hdd、ssd 和 nvme,使用一类设备更快地构建 CRUSH 层次结构。
除了代表 OSD 的叶节点外,层次结构的其余部分是任意的,如果默认类型不适合您的要求,您可以根据您自己的需求进行定义。我们推荐将您的 CRUSH 映射 bucket 类型调整为组织的硬件命名约定,并使用反映物理硬件名称的实例名称。通过良好的命名规则,您可以更轻松地管理集群,并在 OSD 或其他硬件故障时方便排除问题,并方便管理员远程或物理访问主机或其他硬件。
在以下示例中,bucket 层次结构有四个页存储桶(osd 1-4)、两个节点存储桶(主机 1-2)和一个机架节点(rack 1)。
由于叶节点反映在 CRUSH map 开头的 devices 列表下声明的存储设备,因此无需将它们声明为 bucket 实例。层次结构中第二个最低存储桶类型通常会聚合设备;即,通常是包含存储介质的计算机,并使用管理员喜欢描述它的任何术语,如 "node"、"computer"、"host"、"host"、"machine"等。在高密度的环境中,查看每个卡的多个主机/节点以及每个机箱更为常见。确保考虑卡和机箱失败的情况,例如,如果在一个节点失败时需要拔出相关的卡或机箱时,可能会导致大量主机/节点及其 OSD 无法使用。
在声明存储桶实例时,指定其类型作为字符串的唯一名称,请为它分配一个可选的唯一 ID,以负整数表示,指定相对于其项目的总容量或能力的权重,指定存储桶算法,如 straw2,以及哈希算法,它通常为 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. CRUSH 故障域 复制链接链接已复制到粘贴板!
具有多个对象副本或 M 纠删代码区块有助于防止数据丢失,但它不足以实现高可用性。通过反映 Ceph Storage 集群的底层物理组织,CRUSH 可以建模,从而可以处理关联设备故障的地址可能来源。通过将集群的拓扑编码到集群映射中,CRUSH 放置策略可在不同的故障域间分离对象副本或纠删代码区块,同时仍维护所需的伪随机分布。例如,为了解决并发故障的可能性,可能需要确保数据副本或纠删代码区块位于使用不同的她、机架、电源、控制器或物理位置的设备上。这有助于防止数据丢失并允许集群以降级状态运行。
2.1.3. CRUSH 性能域 复制链接链接已复制到粘贴板!
Ceph 可以支持多个层次结构,将一种类型的硬件性能配置集与其他类型的硬件性能配置集分开。例如,CRUSH 可以为硬盘创建一个层次结构,以及 SSD 的另一个层次结构。使用性能域 (考虑到底层硬件的性能特性的分级结构)变得非常流行 ,因此通常会需要满足不同的性能要求。正常运行,它们只是 CRUSH map,它具有多个 根 类型 bucket。用例示例包括:
- 对象存储: 用作 S3 和 Swift 接口的对象存储后端的 Ceph 主机可能会使用廉价的存储介质,如 SATA 驱动器,它们可能不适用于虚拟机,但对于对象存储可以降低增加额外 GB 存储空间的成本。这样,可以将廉价的存储主机与需要高性能的系统(例如用于在云平台中存储卷和镜像的系统)分离。HTTP 往往是对象存储系统的瓶颈。
- 冷存储 :为冷存储设计的系统 - 不经常访问的数据,或使用放宽的性能要求获取数据检索 - 缓解利用成本较低的存储介质和纠删代码。但是,擦除编码可能需要一些额外的 RAM 和 CPU,因此与用于对象存储或虚拟机的主机的 RAM 和 CPU 要求有所不同。
-
支持 SSD 的池: 与硬盘相比,SSD 非常昂贵。SSD 没有观察时间,它们提供较高的吞吐量。除了将 SSD 用于日志外,集群还可以支持由 SSD 支持的池。常见用例包括高性能 SSD 池。例如,可以将 Ceph 对象网关的
.rgw.buckets.index池映射到 SSD,而不是 SATA 驱动器。
CRUSH map 支持 设备类。Ceph 可以发现存储设备的各个方面,并自动分配类,如 hdd、ssd 或 nvme。但是,CRUSH 不仅限于这些默认值。例如,CRUSH 层次结构也可用于分隔不同类型的工作负载。例如,SSD 可以用于日志或直写日志,bucket 索引或原始对象存储。CRUSH 可以支持不同的设备类,如 ssd-bucket-index 或 ssd-object-storage,因此 Ceph 不将相同的存储介质用于不同的工作负载,从而使性能更可预测的且一致。
在后台后,Ceph 会为每个设备类生成一个 crush root。这些根应仅通过设置或更改 OSD 上的设备类来修改。您可以使用以下命令查看生成的 roots:
示例