3.4.3 PG和PGP的区别
在创建存储池的时候通过命令行要输入两个参数:pg_num和pgp_num。通常,这两个参数的值是一样的。那么,这两个参数到底有什么区别呢?
参数pg_num表示前面讲到的放置组的数量。该值会影响每个放置组内存放的对象数。比如,有10000个对象要关联到存储池,此存储池一共定义了100个放置组,那么每个放置组内平均有100个对象(通常不是平均分配的,这里只是举个例子)。如果把放置组数调整到200,那么平均每个放置组内的对象数量就降到50。因此,pg_num可决定放置组数,影响放置组内存放对象的数量。
PGP(Placement Group for Placement Purpose)决定了对象分布在哪些OSD上。参数pgp_num表示PGP的可操作值。如果增大PGP值,放置组内的对象会重新计算,集群中的数据将开始做重新分布。
首先创建一个存储池并设置pg_num=1。pgp_num=1即只有一个放置组和一个PGP,PG内有100个对象。假设做了3副本的数据冗余,数据会分布在3个OSD上,设这三个OSD编号为1、3、8。那么,这些数据的位置在创建存储池的时候都会被固定。随后调整pg_num=2,pgp_num=1不变,这时候会发现新增了一个放置组,而且这个放置组内分割了原有放置组内的一部分对象,也就是说两个放置组共同存储了100个对象。然而观察放置组的分布,发现这两个放置组对象的OSD编号仍然是1、3、8,也就是说增加放置组的数量不改变原有的OSD映射关系。而调整pgp_num=2(即增加一个PGP),放置组内的对象并没有发生变化,只是其中一个放置组中对象的OSD编号发生了变化,变成了2、4、9。这时,集群中的数据开始从OSD 1、3、8向OSD 2、4、9迁移。
总结如下:
·pg_num是存储池中存储对象的目录数,pgp_num是存储池中放置组内的OSD分布组合个数。
·pg_num的增加会引起放置组内的对象的分裂,即分裂到相同的OSD上新生成的放置组中。
·pgp_num的增加会引起部分放置组在OSD上的分布变化,但是不会引起放置组内对象的变动。