3.6. Ceph 客户端数据分条
存储设备存在吞吐量限制,这会影响性能和可扩展性。因此存储系统通常支持分条 - 探究多个存储设备之间的连续信息片段,以提高吞吐量和性能。最常见的数据分条形式来自 RAID。RAID 类型与 Ceph 的条带最相似,是 RAID 0 或 的条状卷。 Ceph 的条带化提供了 RAID 0 条带的吞吐量、n 路 RAID 镜像的可靠性以及快速恢复。
Ceph 提供三种类型的客户端:Ceph 块设备、Ceph 文件系统和 Ceph 对象存储。Ceph 客户端将其数据从它所提供的表示格式转换为用户,如块设备镜像、RESTful 对象、Ceph 文件系统目录,再转换为 Ceph 存储集群中存储的对象。
Ceph 存储集群中的对象 Ceph 存储并未分条。Ceph 对象存储、Ceph 块设备和 Ceph 文件系统将其数据分条到多个 Ceph 存储集群对象上。使用 librados
直接写入 Ceph 存储集群的 Ceph 客户端必须执行条带操作,并为自己执行并行 I/O 来获取这些优势。
最简单的 Ceph 分条格式涉及 1 个对象的条带计数。Ceph 客户端将分条单元写入到 Ceph 存储群集对象,直到对象达到最大容量,然后为额外的数据分条创建另一个对象。最简单的分条形式可能足以满足小型块设备映像 S3 或 Swift 对象的需要。但是,这种简单形式无法充分利用 Ceph 在放置组之间分布数据的能力,因此不会大幅提高性能。下图描述了最简单的分条形式:
如果您预计大映像大小(如 S3 或 Swift 对象(视频)),您可能会看到通过将客户端数据分条到对象集中的多个对象实现可观的读/写性能提升。当客户端并行将分条单元写入其对应对象时,会产生显著的写入性能。由于对象映射到不同的 PG 并且进一步 map 到不同的 OSD,因此每次写入操作都会以最大写入速度并行进行。写入单个磁盘会受到头移动的限制,例如:每个寻道 6ms 和带宽(例如 100MB/s)。通过将该写入分散到多个对象(映射到不同的放置组和 OSD),Ceph 可以减少每个驱动器的寻道数量,并合并多个驱动器的吞吐量,从而实现更快的写入或读取速度。
条带独立于对象副本。由于 CRUSH 在 OSD 之间复制对象,条带会自动复制。
在下图中,客户端数据在由 4 个对象组成的对象集合(下图中的object set 1
)之间剥离,其中第一个条带单元在 object 0
中是 stripe unit 0
,第四个条带单元在 object 3
中是 stripe unit 3
。编写第四个分条后,客户端将确定对象集是否已满。如果对象集未满,客户端将开始再次向第一个对象写入条带,请参阅下图中的 object 0
。如果对象集已满,客户端会创建一个新对象集,请参见以下示意图中的 object set 2
,并开始写入第一个条带,在新对象集合的第一个对象中,条带单元为 16,请参阅下图中的 object 4
。
三个重要变量决定了 Ceph 如何对数据进行分条:
- 对象大小: Ceph 存储群集中的对象具有最大可配置大小,如 2 MB 或 4 MB。对象大小应当足以容纳许多条带单元,并且应该是条带单元的倍数。重要信息:红帽建议使用 16 MB 的安全值。
- 条带 Width: 条带有可配置的单元大小,例如 64 KB。Ceph 客户端将其写入到对象的数据分成大小相等的条带单元,但最后一个条带单元除外。分条宽度应该是对象大小的一个部分,以便对象可以包含许多条带单元。
- stripe Count:Ceph 客户端在由条带 数决定的一系列对象上写入一系列分条单元。对象系列称为对象集。Ceph 客户端写入对象集中的最后一个对象后,它将返回到对象集中的第一个对象。
在将集群投入生产之前,测试条带配置的性能。您在您剥离数据并将其写入对象后,CANNOT 会更改这些条带参数。
Ceph 客户端拥有分条数据以分条单元并将分条单元映射到对象后,Ceph 的 CRUSH 算法会将对象映射到 PG,放置组映射到 Ceph OSD 守护进程,然后对象作为文件存储在存储磁盘上。
由于客户端写入到单个池,所有数据分条到对象都会映射到同一个池中的 PG。因此,它们使用相同的 CRUSH map 和相同的访问控制。