「Ceph」- 概述数据写入过程

概述介绍

通过 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 的过程中,每一次写操作分两步处理:

首先,当 Ceph OSD 接受 Object 写请求时,其将数据写入一个单独的存储区(其为 Acting Set 中的 OSD 对应的日志盘),该区域被称为 Journal,这是缓冲器分区在相同或单独磁盘作为 OSD,一个单独的 SSD 磁盘或分区(或许是个文件文件系统)。写入成功后,将发送一个写确认给客户端。

Journal 具有默认大小,但 Journal 空间越大越好。Ceph 使用 Journal 综合考虑存储速度和数据的一致性。Journal 允许 Ceph OSD 功能很快做小的写操作。一个随机写入首先写入在上一个连续类型的 Journal。

然后,在 Journal 中的数据,将周期同步到后端存储。日志数据会很快地刷新到后端存储设备(OSD)。这给操作系统足够的时间来合并写入磁盘,以提升效率;

使用 SSD 存储 Journal 能获得相对较好的性能,有效缓冲突发负载。在这种情况下,所有的客户端写操作都写入到 SSD 日志,然后刷新到磁盘;

若未开启 Journal 特性,那么数据写入后备存储时:

当 Ceph Client 将对象写入 Primary OSD 时,Primary OSD 会找到其应存储的副本数。该值通过配置文件的 osd_pool_default_size 参数设置。

然后,Primary OSD 获取 Object ID、Pool Name、Cluster Map,并使用 CRUSH Algorithm 计算 Secondary OSD 的 ID。Primary OSD 将对象写入 Secondary OSD。

当 Primary OSD 接收到 Secondary OSD 发出的写完确认回复,并且 Primary OSD 本身也完成写操作时,会向 Ceph Client 确认本次写操作完成;

常见问题

Q:存储池有 3 个副本,当仅剩 1 个副本时,是否能继续写入数据?
当 Ceph Cluster 的 3 个 OSD 副本中有 2 副本可用,1 个副本掉线时,Ceph 处于 degraded 状态,但是数据依旧可正常读写。当有 2 个 OSD 副本掉线时,唯一的 OSD 副本会继续保留数据,但是不再允许向其中写数据;