3.4.1 PG基本概念
Ceph集群中存储了数百万个对象,如果分别对对象进行管理会占用大量资源。因此,Ceph使用放置组来提高管理大量对象的效率。放置组是存储池的子集,是对象的集合。Ceph将一个存储池划分为一系列放置组,每一个客户端对象都会分配给一个放置组,然后将该放置组分配给一个主OSD。由于Ceph通过设置副本数量或纠删码级别对数据进行保护,因此Ceph会根据副本数或者纠删码中校验盘的数量选择OSD,并将主OSD中的放置组复制到从OSD。如果主OSD发生故障或集群做了数据重新平衡,Ceph可以对集群中现有非主OSD上保存的放置组数据进行复制或移动。因为有了放置组,对象所在的OSD位置就清楚了。即便是OSD有损坏,你也不必为每个对象单独寻址。CRUSH算法会结合Cluster Map和集群的状态将放置组均匀、伪随机地分配给集群中的OSD(包括主OSD和从OSD)。
如图3-2所示,CRUSH算法将对象分配给PG 5,并且将PG 5分配给OSD 3,让OSD 3作为主OSD。CRUSH算法计算出OSD 1和OSD 6是PG 5的从OSD,则主OSD 3将PG 5内容数据复制到OSD 1和OSD 6。这就是放置组在OSD间复制,保证集群数据安全的方法。
当系统管理员创建一个存储池时,CRUSH算法为该存储池创建用户定义数量的放置组。通常,放置组的数量要设置得合理。例如,每个存储池分配100个放置组,意味着每个放置组大约包含存储池中1%的数据。当Ceph需要将放置组从一个OSD移至另一个OSD时,放置组的数量会对性能产生影响。如果存储池中的放置组太少,每个放置组分配的存储池中的数据比例将很大,移动放置组则意味着Ceph集群中要同时移动大量数据,并且网络负载也会变高,从而对集群的性能产生不利影响。如果存储池中的放置组过多,Ceph在移动少量数据时会占用过多的CPU和RAM,从而对集群的性能产生不利影响。
图3-2 放置组和OSD的分配关系