2.6. Ceph 输入/输出操作
Ceph 客户端从 Ceph 监视器检索"Cluster Map",并绑定到池,并在池中 PG 内对对象执行输入/输出(I/O)。该池的 CRUSH 规则集和放置组数量是确定 Ceph 如何放置数据的主要因素。使用最新版本的 cluster map,客户端知道集群中所有 monitor 和 OSD 及其当前状态。但是,客户端不知道对象位置的任何内容。
客户端需要的唯一输入是对象 ID 和池名称。非常简单:Ceph 将数据存储在指定池中。当客户端想将指定对象存储在池中时,它会获取对象名称、哈希代码、池中的 PG 数量以及输入的 CRUSH(可扩展哈希下)计算 PG 的 ID,以及 PG 的 Primary OSD。
Ceph 客户端使用以下步骤来计算 PG ID。
-
客户端输入池 ID 和对象 ID。例如,
pool = liverpool
和object-id = john
。 - CRUSH 采用对象 ID 并进行哈希。
-
CRUSH 计算 PG 数量的 hash modulo 来获取 PG ID。例如
58
。 - CRUSH 计算与 PG ID 对应的 Primary OSD。
-
客户端获取指定池名称的池 ID。例如,池
liverpool
是池号4
。 -
客户端将池 ID 添加到 PG ID 中。例如:
4.58
。 - 客户端通过直接与 Acting 设置中的 Primary OSD 通信来执行对象操作,如 write、read 或 delete。
Ceph 存储集群的拓扑和状态在会话期间相对稳定。通过 librados
赋予 Ceph 客户端计算对象位置比要求客户端通过每个读/写操作的聊天性会话向存储集群进行查询要快。CRUSH 算法允许客户端计算对象应该存储的位置,并允许客户端直接联系 acting set 中的 Primary OSD 以存储或检索对象中的数据。由于exabyte 扩展的集群具有数千 OSD,因此客户端和 Ceph OSD 之间的订阅通过订阅并不是显著的问题。如果集群状态发生变化,客户端只需从 Ceph 监视器请求对 cluster map 的更新。