概述介绍
通过 CRUSH 算法,Ceph 实现去中心化;
Ceph Client 根据 CRUSH 来计算它的数据要被写到哪里,以及从哪里读取它所需要的数据。所有这些计算操作都是在 Client 完成的,因此它们不会影响 Ceph Cluster 服务器端的性能。然后 Client 与 Ceph OSD 直接通信;
Ceph OSD 负责创建对象,以及在其他 Ceph Node 上创建这些对象的副本来保证数据的安全性和高可用性。Ceph 还使用 Ceph Mon Cluster 来保证系统的高可用性;
像 Ceph Client 一样,OSD 也连接 Ceph Mon,以检索 Cluster Map 的最新副本。OSD 也使用 CRUSH 算法来计算对象副本的存储位置。在典型的写场景中,Ceph Client 使用 CRUSH 算法来计算对象的 PG ID 和 Primary OSD;
Client
Ceph Client 接口负责和 Ceph Cluster 进行数据交互,包括数据的读写;
Ceph Client 需要以下数据才能与 Ceph Cluster 进行通信:
1)Ceph 配置文件或集群的名称(通常命名为 ceph)、Monitor 地址
2)存储池名称
3)用户名和密钥路径
Ceph 客户端维护对象 ID 和存储对象的存储池名称;
Client <=> Ceph MON
Ceph Client 和其他守护进程使用配置文件发现 Monitor;
为了存储和检索数据:
1)首先,Ceph Client 访问 Ceph Monitor 并检索最新的 Cluster Map 副本,以使知晓 Ceph Cluster 的状态和配置;
2)然后,Ceph Client 通过向 librados 提供对象名称和存储池名称;
3)librados 会使用 CRUSH 算法为要存储和检索的数据计算对象的 PG 和 Primary OSD;
inside Client
2)然后,Client 将数据转化为一个或者多个对象,每个对象都具有 Name 和 Pool name;
3)接着,该对象会被以 PG 的数目为基数做哈希,在指定的 Ceph Pool 中生成最终的 PG;
计算 PG ID 示例,过程如下:
1)Client 输入 Pool ID 和 Object Name(如 pool=liverpool, object-name=john);
2)CRUSH 获得 Pool ID 并 hash(object name) 运算;
3)CRUSH 计算 PG 个数,Hash 取模获得 PG ID;
4)CRUSH 获得已命名 Pool ID(如 liverpool=4),并结合 PG ID 得到 Placement(Group 4.32);
4)这个计算出的 PG 再通过 CRUSH 查询来确定存放或者获取数据的 Primary OSD、Secondary OSD、Tertiary OSD 的位置;
Client <=> Ceph OSD
当 Client 获得精确的 Ceph OSD ID,将会直接与这些 Ceph OSD 通信并存放数据;
客户端连接到 Primary OSD,并在其中执行读取和写入操作;
inside OSD (=>Journal, =>OSD)
在内部中,写入操作分为两种情况:
如果开启 Journal(日志)特性,在数据写入 OSD 的过程中,每一次写操作分两步处理:
若未开启 Journal 特性,那么数据写入后备存储时:
常见问题
Q:存储池有 3 个副本,当仅剩 1 个副本时,是否能继续写入数据?
当 Ceph Cluster 的 3 个 OSD 副本中有 2 副本可用,1 个副本掉线时,Ceph 处于 degraded 状态,但是数据依旧可正常读写。当有 2 个 OSD 副本掉线时,唯一的 OSD 副本会继续保留数据,但是不再允许向其中写数据;