PGP(Placement Group for PlacementPurpose)决定对象分布在哪些 OSD 上。参数 pgp_num 表示 PGP 的可操作值;
调整 pgp_num 而带来的变化
如果增大 PGP 值,PG 内的对象会重新计算,集群中的数据将开始做重新分布;
现在,创建存储池 Pool(pg_num=1, pgp_num=1) 即只有 PG * 1 和 PGP * 1,并且 PG 内有 100 个对象:
假设数据冗余 replica=3,数据会分布在 3 个 OSD 上,设这三个 OSD 编号为 1、3、8。那么,这些数据的位置在创建存储池的时候都会被固定;
随后调整 Pool(pg_num=2, pgp_num=1),即新增 PG * 1,而且这个 PG 内分割了原有 PG 内的一部分对象,也就是说两个 PG 共同存储 100 个对象。然而观察 PG 的分布,发现这两个 PG 对象的 OSD 编号仍然是 1、3、8,即增加 PG 的数量不改变原有的 OSD 映射关系;
而调整 Pool(pg_num=2, pgp_num=2),即增加 PGP * 1,现在 PG 内的对象并没有发生变化,只是其中一个 PG 中对象的 OSD 编号发生了变化,变成了 2、4、9。这时,集群中该 PG 的数据开始从 OSD 1、3、8 向 OSD 2、4、9 迁移;
pg_num vs. pgp_num
pg_num 是存储池中存储对象的“目录数”。pg_num 的增加,会引起 PG 内的对象的分布,即分裂到相同的 OSD 上新生成的 PG 中;
pgp_num 是存储池中放置组内的 OSD 分布组合个数。pgp_num 的增加会引起部分 PG 在 OSD 上的分布变化,但是不会引起 PG 内对象的变动;