每个池(pool)都有许多放置组(PG),CRUSH
动态地将PGs
映射到OSDs
。当Ceph
客户端存储对象时,CRUSH
将每个对象映射到放置组
将对象映射到放置组将在ceph osd
守护进程和Ceph
客户端之间创建一个间接层。
Ceph
存储集群必须能够增长(或收缩),并重新平衡动态存储对象的位置。
如果Ceph
客户端“知道”哪个ceph osd
守护进程有哪个对象,那么Ceph
客户端和ceph osd
守护进程之间就会产生一个紧密耦合。
相反,CRUSH
算法将每个对象映射到一个放置组,然后将每个放置组映射到一个或多个ceph osd
守护进程。
这一间接层允许Ceph
在新的ceph osd
守护进程和底层OSD
设备上线时动态重新平衡。下图描述了CRUSH
如何将对象映射到放置组,以及将放置组映射到OSD。
有了集群映射的副本和CRUSH
算法,客户端就可以准确地计算出在读写特定对象时应该使用哪个OSD
。
计算放置组ID
当Ceph
客户端绑定到Ceph mon
时,它将检索集群映射的最新副本。通过集群映射,客户获取集群中的所有mon
、OSD
和mds
信息。但是,它对对象位置一无所知。
计算过程
。这很简单:Ceph
将数据存储在命名池中(例如,“liverpool”)。
当客户端想要存储一个命名对象(例如,“john”、“paul”、“george”、“ringo”等)时,它使用对象名、哈希码、池中的PGs
数量和池名计算放置组。Ceph
客户端使用以下步骤计算PG id
。
-
1、客户端输入对象
ID
和pool
-
2、
Ceph
获取对象ID
并对其进行哈希运算 -
3、
Ceph
计算pg
数的哈希模,(例如,58)获取PG ID
-
4、
Ceph
获取给定池名的池ID
(例如,“liverpool”=4) -
5、
Ceph
将池ID
前置到PG ID
(例如,4.58)。
重新平衡
当你将ceph osd
守护进程添加到Ceph
存储集群时,集群映射会随着新的OSD
更新。再次计算PG id
,这将更改集群映射。
下面的图描述了重新平衡的过程(虽然很粗略,因为在大型集群中影响更小),
其中一些(但不是所有)pg
从现有OSD
(OSD 1和OSD 2)迁移到新的OSD (OSD 3)。即使在重新平衡时,崩溃也是稳定的。
许多放置组保持原来的配置,每个OSD
增加了一些容量,因此在重新平衡完成后,新OSD
上不会出现负载峰值。
数据一致性
作为维护数据一致性和清洁度的一部分,ceph osd
还可以清理放置组中的对象。
也就是说,ceph osd
可以将一个放置组中的对象元数据与其存储在其他OSD
中的放置组中的副本进行比较。
清理(通常每天执行)捕获OSD
错误或文件系统错误。
OSD
还可以通过逐位比较对象中的数据来执行更深入的清理。深度清理(通常每周执行一次)会在磁盘上发现在轻度清理时不明显的坏扇区。