第 3 章 放置组
放置组(PG)不适用于 Ceph 客户端,但它们在 Ceph Storage 集群中发挥重要角色。
Ceph 存储集群可能需要数以千计的 OSD 才能达到超字节级别的存储容量。Ceph 客户端将对象存储在池中,这是整个集群的逻辑子集。存储在池中的对象数量可能容易在数百万和以后运行。具有数以百万计的对象或更无法现实地跟踪每个对象上的放置的系统,仍然表现良好。Ceph 将对象分配到放置组,并将放置组分配给 OSD,以重新平衡动态和效率。
计算机科学中的所有问题均可由另一级间接处理,除非有太多间接的问题除外。 | ||
-- David Wheeler |
3.1. 关于放置组
根据池中的每个对象跟踪对象放置,以大规模计算代价。为了大规模实现高性能,Ceph 将池划分为放置组,将每个对象分配到 PG,并将放置组分配到 Primary OSD。如果 OSD 失败或集群重新平衡,Ceph 可以移动或复制整个放置组,即,PG 中的所有对象都不需要单独解析各个对象。这使得 Ceph 集群能够有效地重新平衡或恢复。
当 CRUSH 将 PG 分配给 OSD 时,它会计算一系列 OSD- 第一个是主要的。osd_pool_default_size
设置减 1
用于复制池,而用于纠删代码池的编码区块 M
数量决定了存储放置组的 OSD 的数量,而不会永久丢失数据。Primary OSD 使用 CRUSH 来识别次要 OSD,并将 PG 的内容复制到次要 OSD。例如,如果 CRUSH 将对象分配给放置组,并且放置组分配到 OSD 5 作为 Primary OSD,如果 CRUSH 计算 OSD 1 和 OSD 8 是放置组的次要 OSD,则主要 OSD 5 会将数据复制到 OSD 1 和 8。通过代表客户端复制数据,Ceph 简化了客户端接口并减少客户端工作负载。同样的过程允许 Ceph 集群动态恢复和重新平衡。
当 Primary OSD 出现故障并标记为 out 集群时,CRUSH 会将放置组分配到另一个 OSD,后者接收 PG 中的对象副本。Up Set
中的另一个 OSD 将假定主 OSD 的角色。
当您增加对象副本或编码区块的数量时,CRUSH 将根据需要将每个放置组分配到额外的 OSD。
PG 本身没有 OSD。CRUSH 将许多放置组分配到每个 OSD 伪随机,以确保数据在集群中平均分布。