第 2 章 CRUSH 管理
可扩展哈希下的受控复制(Controled Replication Under Scalable Hashing)算法决定如何通过计算数据存储位置存储和检索数据。
任何足够高级的技术都与魔法几乎没有区别。 | ||
| -- Arthur C. Clarke | ||
2.1. CRUSH 简介 复制链接链接已复制到粘贴板!
存储集群的 CRUSH 映射描述了 CRUSH 层次结构中的设备位置,以及确定 Ceph 如何存储数据的层次结构的规则。
CRUSH 映射至少包含一个节点层次结构,并保留。Ceph 中名为"buckets"的节点是其类型定义的任何存储位置聚合。例如,行、机架、机箱、主机和设备。层次结构的每个叶位置基本上由存储设备列表中的其中一个存储设备组成。leaf 始终包含在一个节点或 "bucket"。CRUSH map 也有规则列表,用于决定 CRUSH 存储和检索数据的方式。
在向集群添加 OSD 时,存储设备会添加到 CRUSH map 中。
CRUSH 算法根据每个设备的权重值将数据对象分布到存储设备中,从而达到统一性分布。CRUSH 根据层次结构 cluster map 定义,分发对象及其副本或编码区块。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)。
由于 leaf 节点反映在 CRUSH map 开头的设备列表下声明的 存储设备,因此无需将它们声明为 bucket 实例。层次结构中第二个最低存储桶类型通常会聚合设备;即,通常是包含存储介质的计算机,并使用管理员喜欢描述它的任何术语,如 "node"、"computer"、"host"、"host"、"machine"等。在高密度环境中,每个卡和每个机箱有多个主机/节点比较常见。确保考虑卡和机箱失败的情况,例如,如果在一个节点失败时需要拔出相关的卡或机箱时,可能会导致大量主机/节点及其 OSD 无法使用。
在声明存储桶实例时,指定其类型作为字符串的唯一名称,请为它分配一个可选的唯一 ID,以负整数表示,指定相对于其项目的总容量或能力的权重,指定存储桶算法,如 straw2,以及哈希算法,它通常为 0,代表 rjenkins1 哈希算法。bucket 可以具有一个或多个项目。这些项目可由节点 bucket 或 leave 组成。项目可以有一个权重,来反映项目的相对权重。
2.1.1. 以动态方式放置数据 复制链接链接已复制到粘贴板!
Ceph 客户端和 Ceph OSD 都使用 CRUSH map 和 CRUSH 算法。
- Ceph 客户端: 通过将 CRUSH map 分发到 Ceph 客户端,OSD 可让 Ceph 客户端直接与 OSD 通信。这意味着 Ceph 客户端避免了中央对象查找表,它们可以充当单一故障点、性能瓶颈、集中查找服务器的连接限制以及存储集群可扩展性的物理限制。
- Ceph OSD: 通过分发 CRUSH map 到 Ceph OSD,Ceph 支持 OSD 处理复制、回填和恢复。这意味着 Ceph OSD 代表 Ceph 客户端处理对象副本(或编码区块)的存储。它还意味着 Ceph OSD 知道集群足以重新平衡集群(重新填充),并从失败动态恢复。
2.1.2. 建立故障域 复制链接链接已复制到粘贴板!
具有多个对象副本或 M 擦除编码块有助于防止数据丢失,但它不足以解决高可用性问题。通过反映 Ceph Storage 集群的底层物理组织,libvirt 可以建模,从而解决了关联设备故障的地址潜在的资源。通过将集群的拓扑编码到集群映射中,CRUSH 放置策略可在不同的故障域间分离对象副本或纠删代码区块,同时仍维护所需的伪随机分布。例如,为解决并发故障的可能性,可能最好确保数据副本或纠删代码区块在不同的 shelves、机架、电源、控制器或物理位置上的设备上。这有助于防止数据丢失并允许集群以降级状态运行。
2.1.3. 建立基域 复制链接链接已复制到粘贴板!
Ceph 可以支持多个层次结构,将一种类型的硬件性能配置集与其他类型的硬件性能配置集分开。例如,虽然 CRUSH 可以为硬盘创建一个层次结构,为 SSD 创建另一个层次结构。使用性能域 (考虑到底层硬件的性能特性的分级结构)变得非常流行 ,因此通常会需要满足不同的性能要求。在操作上,它们只是具有多个 根 类型 bucket 的 CRUSH map。用例示例包括:
- 对象存储: 用作 S3 和 Swift 接口的对象存储后端的 Ceph 主机可能会使用廉价的存储介质,如 SATA 驱动器,它们可能不适用于虚拟机,但对于对象存储可以降低增加额外 GB 存储空间的成本。这样,可以将廉价的存储主机与需要高性能的系统(例如用于在云平台中存储卷和镜像的系统)分离。HTTP 往往是对象存储系统中的瓶颈。
- 冷存储 :为冷存储而设计的系统 - 绝对访问的数据或具有宽松性能要求的数据检索 - 优点是利用成本较低的存储介质和擦除编码。但是,擦除编码可能需要一些额外的 RAM 和 CPU,因此与用于对象存储或虚拟机的主机的 RAM 和 CPU 要求有所不同。
-
SSD 支持的池: SSD 昂贵,但与硬盘相比,它们有显著优势。SSD 没有查找时间,它们提供高吞吐量。除了将 SSD 用于日志外,集群还可以支持 SSD 支持的池。常见用例包括高性能 SSD 池。例如,可以将 Ceph 对象网关的
.rgw.buckets.index池映射到 SSD,而非 SATA 驱动器。
CRUSH 映射支持 设备类别 的概念。Ceph 可以发现存储设备的各个方面,并且自动分配类,如 hdd、ssd 或 nvme。但是,虽然 CRUSH 不仅限于这些默认值。例如,可以使用 CRUSH 层次结构来分隔不同类型的工作负载。例如,SSD 可以用于日志或直写日志,bucket 索引或原始对象存储。CRUSH 可支持不同的设备类别,如 sd -bucket-index 或 ssd-object-storage,因此 Ceph 无法将相同的存储介质用于不同的工作负载,因此性能更加可预测且一致。
在 scenes 后面,Ceph 为每个设备类生成一个 crush root。这些根应仅通过在 OSD 中设置或更改设备类来修改。您可以使用以下命令查看生成的 roots:
示例
2.1.4. 使用不同的设备类型 复制链接链接已复制到粘贴板!
要创建性能域,请使用设备类和单一 CRUSH 层次结构。在此特定操作中不需要手动编辑 CRUSH map。只需将 OSD 添加到 CRUSH 层次结构中,然后执行以下操作:
为每个设备添加一个类:
语法
ceph osd crush set-device-class CLASS OSD_ID [OSD_ID]
ceph osd crush set-device-class CLASS OSD_ID [OSD_ID]Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例
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
[ceph root@host01 /]# ceph osd crush set-device-class hdd osd.0 osd.1 osd.4 osd.5 [ceph root@host01 /]# ceph osd crush set-device-class ssd osd.2 osd.3 osd.6 osd.7Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建规则以使用设备:
语法
ceph osd crush rule create-replicated RULE_NAME ROOT FAILURE_DOMAIN_TYPE CLASS
ceph osd crush rule create-replicated RULE_NAME ROOT FAILURE_DOMAIN_TYPE CLASSCopy to Clipboard Copied! Toggle word wrap Toggle overflow 示例
ceph osd crush rule create-replicated cold default host hdd ceph osd crush rule create-replicated hot default host ssd
[ceph root@host01 /]# ceph osd crush rule create-replicated cold default host hdd [ceph root@host01 /]# ceph osd crush rule create-replicated hot default host ssdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将池设置为使用规则:
语法
ceph osd pool set POOL_NAME crush_rule RULE_NAME
ceph osd pool set POOL_NAME crush_rule RULE_NAMECopy to Clipboard Copied! Toggle word wrap Toggle overflow 示例
ceph osd pool set cold_tier crush_rule cold ceph osd pool set hot_tier crush_rule hot
[ceph root@host01 /]# ceph osd pool set cold_tier crush_rule cold [ceph root@host01 /]# ceph osd pool set hot_tier crush_rule hotCopy to Clipboard Copied! Toggle word wrap Toggle overflow