3.6. Ceph 客户端数据剥离
存储设备存在吞吐量限制,这会影响性能和可扩展性。因此,存储系统通常支持跨多个存储设备的连续部分信息 - 来提高吞吐量和性能。最常用的数据条带形式来自 RAID。RAID 类型与 Ceph 的条带最相似,是 RAID 0 或 'striped 卷'。 Ceph 的条带化提供了 RAID 0 条带的吞吐量,即 n-way RAID 镜像的可靠性并更快地恢复。
Ceph 提供三种类型的客户端:Ceph 块设备、Ceph Filesystem 和 Ceph Object Storage。Ceph 客户端将其数据从它提供的格式转换为其用户,如块设备镜像、RESTful 对象和 CephFS 文件系统目录,并放入 Ceph 存储集群中存储的对象。
Ceph 在 Ceph Storage 集群中存储的对象不是条带的。Ceph Object Storage、Ceph Block Device 和 Ceph Filesystem 在多个 Ceph Storage Cluster 对象上分条数据。使用 librados
直接写入到 Ceph 存储集群的 Ceph 客户端必须执行条带化,并且本身并行 I/O 以获得这些好处。
最简单的 Ceph 分条格式涉及 1 对象的条带数。Ceph 客户端将条带单元写入 Ceph Storage Cluster 对象到其最大容量,然后为数据的额外条带创建另一个对象。最简单的分条形式可能足以用于小型块设备镜像、S3 或 Swift 对象。但是,这种简单形式并不能最大利用 Ceph 在放置组之间分发数据的能力,因而不会提高性能。下图显示了最简单的条带形式:
如果您预计大镜像大小,例如视频,则可能会看到大型 S3 或 Swift 对象,通过在对象集中的多个对象间分条客户端数据,从而提高了可读写的性能。当客户端并行将条状单元写入其对应对象时,会发生重大写入性能。由于对象被映射到不同的放置组,并且进一步映射到不同的 OSD,每个写入操作在最大写入速度上并行。对单磁盘的一个写入会限制磁头的移动(例如每个搜索 6ms)和设备的带宽(例如 100MB/s)。Ceph 通过分散在多个对象上写入多个对象(映射到不同的放置组和 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 条带数据的方式:
Object Size: Ceph Storage 集群中的对象具有最大可配置的大小,如 2 MB 或 4 MB。对象大小应该足够大,以适应许多条分条单元,它应该是条带单元的倍数。
重要红帽建议安全最大值为 16 MB。
- 条带宽度: 条带化有一个可配置的单位大小,例如 64 KB。Ceph 客户端将写入对象的数据分到平等的条状单元中,但最后条带单元除外。分条宽度应该是 Object Size 的比例,以便对象可以包含很多条带单元。
- Stripe Count: Ceph 客户端将一组由条带数决定的对象写入条带单元序列。一系列对象称为对象集。Ceph 客户端写入对象集合中的最后一个对象后,它会返回对象集中的第一个对象。
在将集群放置到生产环境中前测试条带配置的性能。在分条数据并将其写入对象后,您的 CANNOT 会更改这些分条参数。
Ceph 客户端将数据分条数据到分条单元,并将分条单元映射到对象后,Ceph 的 CRUSH 算法会将对象映射到放置组,而放置组则 map 到 Ceph OSD 守护进程,然后对象存储在存储磁盘上的文件。
由于客户端写入到单个池,因此所有数据分条到对象都会映射到同一池中的放置组。因此它们使用相同的 CRUSH map 和相同的访问控制。