1.5. 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。

  1. 客户端输入池 ID 和对象 ID。例如,pool = liverpoolobject-id = john
  2. CRUSH 采用对象 ID 并进行哈希。
  3. CRUSH 计算 PG 数量的 hash modulo 来获取 PG ID。例如 58
  4. CRUSH 计算与 PG ID 对应的 Primary OSD。
  5. 客户端获取指定池名称的池 ID。例如,池 liverpool 是池号 4
  6. 客户端将池 ID 添加到 PG ID 中。例如: 4.58
  7. 客户端通过直接与 Acting 设置中的 Primary OSD 通信来执行对象操作,如 write、read 或 delete。

Ceph 存储集群的拓扑和状态在会话期间相对稳定。通过 librados 赋予 Ceph 客户端计算对象位置比要求客户端通过每个读/写操作的聊天性会话向存储集群进行查询要快。CRUSH 算法允许客户端计算对象应该存储的位置,并允许客户端直接联系 acting set 中的 Primary OSD 以存储或检索对象中的数据。由于exabyte 扩展的集群具有数千 OSD,因此客户端和 Ceph OSD 之间的订阅通过订阅并不是显著的问题。如果集群状态发生变化,客户端只需从 Ceph 监视器请求对 cluster map 的更新。