2.4. Ceph 放置组

在集群中存储数百万对象,单独管理是资源密集型。因此,Ceph 使用放置组(PG)更有效地管理大量对象。

PG 是池的一个子集,用于包含一组对象。Ceph 将池分片到一系列 PG 中。然后,CRUSH 算法将集群映射和集群的状态纳入帐户,并将 PG 平均和伪随机分发到集群中的 OSD。

下面是它的运作方式。

当系统管理员创建池时,CRUSH 会为池创建用户定义的 PG 数量。通常,PG 的数量应当是数据的一个合理的细粒度子集。例如,每个池每个 OSD 有 100 个 PG,这意味着每个 PG 大约包含池数据的 1%。

当 Ceph 从一个 OSD 从一个 OSD 移到另一个 OSD 时,PG 的数量会对性能产生影响。如果池中 PG 数量太少,Ceph 将同时迁移大量数据百分比,网络负载会对集群的性能造成负面影响。如果池太多 PG,Ceph 在移动数据的小百分比时将使用过多的 CPU 和 RAM,从而给集群的性能造成负面影响。有关计算用于实现最佳性能的 PG 数量的详情,请参阅 PG Count

Ceph 通过存储对象的副本或存储对象的纠删代码区块来确保数据丢失。由于 Ceph 将对象或纠删代码区块存储在 PG 中,因此 Ceph 将每个 PG 复制到一组 OSD 中,为对象的每个副本或对象的每个纠删代码区块复制了名为"Acting Set"的 OSD 中。系统管理员可以确定池中 PG 数量以及副本或纠删代码区块的数量。但是,CRUSH 算法会计算用于特定 PG 执行的 OSD。

CRUSH 算法和 PG 使 Ceph 动态化。集群映射或集群状态的更改可能会导致 Ceph 将 PG 从一个 OSD 移动到另一个 OSD。

以下是几个示例:

  • 扩展集群: 在向集群添加新主机及其 OSD 时,集群映射会改变。由于 CRUSH 平均而伪随机地将 PG 分发到整个集群中的 OSD,因此添加新的主机及其 OSD 意味着 CRUSH 会将部分池的 PG 重新分配到这些新 OSD。这意味着系统管理员不必手动重新平衡集群。此外,这意味着新 OSD 包含与其他 OSD 大约包含相同的数据量。这也意味着新 OSD 不包含新编写的 OSD,从而防止集群中的"热点"。
  • 一个 OSD 失败: 当 OSD 出现故障时,集群的状态会改变。Ceph 暂时丢失其中一个副本或纠删代码区块,需要制作另一个副本。如果执行集合中的 Primary OSD 失败,则执行集合中的下一个 OSD 将变为 primary,CRUSH 会计算新的 OSD 以存储额外的副本或纠删代码块。

通过在数百个到数千 PG 的环境中管理数百万个对象,Ceph 存储集群可以有效地从故障中扩大、缩小和恢复。

对于 Ceph 客户端,通过 librados 的 CRUSH 算法使读和编写对象的过程非常简单。Ceph 客户端只是将对象写入池,或者从池中读取对象。执行集合中的 Primary OSD 可以将对象或纠删代码区块的副本写入代表 Ceph 客户端集合的次要 OSD。

如果 cluster map 或集群状态发生变化,则存储 PG 的 CRUSH 计算也会变化。例如,Ceph 客户端可以将对象 foo 写入池 bar。CRUSH 将对象分配到 PG 1.a,并将它存储在 OSD 5 上,分别在 OSD 10OSD 15 上制作副本。如果 OSD 5 失败,集群状态会改变。当 Ceph 客户端从池 bar 中读取对象 foo 时,通过 librados 的客户端将自动从 OSD 10 检索,因为新的 Primary OSD。

通过 librados 的 Ceph 客户端在编写和读取对象时直接连接到该集合内的 Primary OSD。因为 I/O 操作不使用集中式代理,所以网络超额订阅通常不是 Ceph 的问题。

下图显示了 CRUSH 如何分配对象到 PG,并将 PG 分配给 OSD。CRUSH 算法将 PG 分配给 OSD,使得执行集合中的每一 OSD 分配到单独的故障域中,这通常意味着 OSD 始终位于独立的服务器主机上,有时位于单独的机架中。

放置组