2.2. Ceph 池
Ceph 存储集群将数据对象存储在名为"Pools"的逻辑分区中。 Ceph 管理员可以为特定类型的数据创建池,如块设备、对象网关,或者仅将一组用户从另一组分隔开。
从 Ceph 客户端的角度来看,存储集群非常简单。当 Ceph 客户端使用 I/O 上下文读取或写入数据时,它 始终 连接到 Ceph 存储集群中的存储池。客户端指定池名称、用户和密钥,因此池似乎充当对其数据对象访问控制的逻辑分区。
实际上,Ceph 池不仅仅是用于存储对象数据的逻辑分区。池在 Ceph 存储集群分发和存储数据方面扮演着重要角色。但是,这些复杂的操作对 Ceph 客户端完全透明。
Ceph 池定义:
- 池类型: 在 Ceph 的早期版本中,池只是维护对象的多个深度副本。如今,Ceph 可以维护对象的多个副本,也可以使用纠删代码来确保持久性。数据持久性方法为池范围,在创建池后不会更改。池类型定义创建池时的数据持久性方法。池类型对客户端完全透明。
- 放置组: 在字节规模的存储集群中,Ceph 池可能会存储数百万个数据对象或更多内容。Ceph 必须处理许多类型的操作,包括通过副本或纠删代码区块实现数据持久性,通过清理或 CRC 检查、复制、重新平衡和恢复来处理数据完整性。因此,逐个对象管理数据会带来可扩展性和性能瓶颈。Ceph 通过将池划分为放置组来解决这一瓶颈。CRUSH 算法计算用于存储对象的 PG,并计算 PG 的操作集合。CRUSH 将每个对象放入 PG。然后,CRUSH 将每个 PG 存储在一组 OSD 中。系统管理员在创建或修改池时设置 PG 数。
- CRUSH 规则集: CRUSH 扮演另一个重要角色:CRUSH 可以检测故障域和性能域。CRUSH 可以按照存储介质类型识别 OSD,并将 OSD 分层组织到节点、机架和行中。CRUSH 支持 Ceph OSD 在故障域之间存储对象副本。例如,对象的副本可能存储在不同的服务器机房、isles、机架和节点中。如果集群大部分失败,如机架,集群仍然可以处于降级状态,直到集群恢复为止。
此外,CRUSH 允许客户端将数据写入特定类型的硬件,如 SSD、含有 SSD 日志的硬盘驱动器,或者在与数据相同的驱动器上使用日志。CRUSH 规则集确定池的故障域和性能域。管理员在创建池时设置 CRUSH 规则集。
管理员 CANNOT 在创建池后更改池的规则集。
持久性: 在提前扩展存储群集中,硬件故障是一种预期,而非例外。当使用数据对象表示更大粒度存储接口(如块设备)时,为该大型粒度接口丢失一个或多个数据对象可能会破坏大粒度存储实体的完整性 - 或许使其不可用。因此数据丢失不可容忍。Ceph 通过两种方式提供高数据持久性:
- 副本池将存储使用 CRUSH 故障域的对象的多个深度副本,以物理方式将一个数据对象副本与另一个数据对象进行隔离。也就是说,副本分布到单独的物理硬件。这增加了硬件故障期间的持久性。
-
纠删代码池将每个对象存储为
K+M
块,其中K
代表数据区块,M
代表编码区块。总和表示用于存储对象的 OSD 数量,M
值则表示在M
数量 OSD 出现故障时可能出现故障的 OSD 数量,仍会恢复数据。
从客户端的角度来看,Ceph 优异且简单。客户端只是从池读取和写入到池。但是,池在数据持久性、性能和高可用性方面扮演着重要角色。