对象映射到OSD
每个存储池都有很多归置组,CRUSH动态的把它们映射到OSD。Ceph客户端要存对象时,CRUSH将把各对象映射到某个归置组。
把对象映射到归置组在OSD和客户端间创建了一个间接层。由于Ceph集群必须能增大或缩小,并动态地重均衡。如果让客户端“知道”哪个OSD有哪个对象,就会导致客户端和OSD紧耦合;相反,CRUSH算法把对象映射到归置组、然后再把各归置组映射到一或多个OSD,这一间接层可以让Ceph在OSD守护进程和底层设备上线时动态地重均衡。下图描述了CRUSH如何将对象映射到归置组、再把归置组映射到OSD。
图1 CRUSH将对象映射到归置组、再把归置组映射到OSD

有了集群运行图副本和CRUSH算法,客户端就能精确地计算出到哪个OSD读、写某特定对象。
Ceph客户端绑定到某监视器时,会索取最新的集群运行图副本,有了此图,客户端就能知道集群内的所有监视器、OSD和元数据服务器。然而它对对象的位置一无所知。
对象位置是计算出来的。
客户端只需输入对象名称和存储池,此事简单:Ceph把数据存在某存储池(如liverpool)中。当客户端想要存命名对象(如john、paul、george、ringo等)时,它用对象名、一个哈希值、存储池中的归置组数、存储池名计算归置组。Ceph按下列步骤计算PG ID。
- 客户端输入存储池名称和对象名称(如pool="liverpool"和object-id="john")。
- CRUSH拿到对象名称并哈希它。
- CRUSH用PG数(如58)对哈希值取模,这就是归置组ID。
- CRUSH根据存储池名称取得存储池ID(如liverpool = 4 )。
- CRUSH把存储池ID加到PG ID(如 4.58 )之前。
计算对象位置远快于查询定位,CRUSH算法允许客户端计算对象应该存到哪里,并允许客户端连接主OSD来存储或检索对象。
父主题: 动态集群管理