ceph创建池计算方法
[TOC]
一:简介及官方介绍实验
PG全称是placement groups,它是ceph的逻辑存储单元。在数据存储到cesh时,先打散成一系列对象,再结合基于对象名的哈希操作、复制级别、PG数量,产生目标PG号。根据复制级别的不同,每个PG在不同的OSD上进行复制和分发。可以把PG想象成存储了多个对象的逻辑容器,这个容器映射到多个具体的OSD。PG存在的意义是提高ceph存储系统的性能和扩展性。
如果没有PG,就难以管理和跟踪数以亿计的对象,它们分布在数百个OSD上。对ceph来说,管理PG比直接管理每个对象要简单得多。每个PG需要消耗一定的系统资源包括CPU、内存等。集群的PG数量应该被精确计算得出。通常来说,增加PG的数量可以减少OSD的负载,但是这个增加应该有计划进行。一个推荐配置是每OSD对应50-100个PG。如果数据规模增大,在集群扩容的同时PG数量也需要调整。CRUSH会管理PG的重新分配。
每个pool应该分配多少个PG,与OSD的数量、复制份数、pool数量有关,有个计算公式在:
http://ceph.com/pgcalc/
《learning ceph》这本书里的计算公式也差不多:
Total PGs = ((Total_number_of_OSD 100) / max_replication_count) / pool_count
160100/3/3=1777.7 2次方是2048
结算的结果往上取靠近2的N次方的值。比如总共OSD数量是160,复制份数3,pool数量也是3,那么按上述公式计算出的结果是1777.7。取跟它接近的2的N次方是2048,那么每个pool分配的PG数量就是2048。
在更改pool的PG数量时,需同时更改PGP的数量。PGP是为了管理placement而存在的专门的PG,它和PG的数量应该保持一致。如果你增加pool的pg_num,就需要同时增加pgp_num,保持它们大小一致,这样集群才能正常rebalancing。下面介绍如何修改pg_num和pgp_num。
(1)检查rbd这个pool里已存在的PG和PGP数量:
[root@controller01 ~]# ceph osd pool get images pg_num
pg_num: 2048
[root@controller01 ~]# ceph osd pool get images pgp_num
pgp_num: 2048
(2)检查pool的复制size,执行如下命令:
[root@controller01 ~]# ceph osd dump |grep size|grep images
pool 2 'rbd' replicated size 3 min_size 2 crush_ruleset 0 object_hash rjenkins pg_num 128 pgp_num 128 last_change 45 flags hashpspool stripe_width 0
(3)使用上述公式,根据OSD数量、复制size、pool的数量,计算出新的PG数量,假设是2048.
(4)变更rbd的pg_num和pgp_num为2048:
[root@controller01 ~]# ceph osd pool set images pg_num 2048
[root@controller01 ~]# ceph osd pool set images pgp_num 2048
(5)如果有其他pool,同步调整它们的pg_num和pgp_num,以使负载更加均衡。
确定 pg_num 取值是强制性的,因为不能自动计算。下面是几个常用的值:
少于 5 个 OSD 时可把 pg_num 设置为 128
OSD 数量在 5 到 10 个时,可把 pg_num 设置为 512
OSD 数量在 10 到 50 个时,可把 pg_num 设置为 4096
OSD 数量大于 50 时,你得理解权衡方法、以及如何自己计算 pg_num 取值
OSD 数量在60个时,pg_num大概为4736
二:openstack云实验证明
查看池的副本数
[root@controller01 ~]# ceph osd pool get images size
size: 3
有60个osd、查看池的副本数是3、一共有三个池
计算公式
60*100/3/3=666.66
取666.66接近2的N次方是512,按照 https://ceph.com/pgcalc/ 官网给出的提示考虑到后期如果需要扩容,那么在创建pg的时候最后增加一倍。也就是三个池,每个都设置1024
当osd增加到120个时。
120*100/3/3=1333.33,1333.33接近2的N次方为1024。所以说当osd60个设置为1024也算正常
查看池的pg和pgp数量
[root@controller01 ~]# ceph osd pool get images pg_num
[root@controller01 ~]# ceph osd pool get images pgp_num