Ceph PG、Pool

大番茄 2020年03月15日 1,542次浏览

v14.2.8

一、PG(PLACEMENT GROUPS)

https://docs.ceph.com/docs/master/rados/operations/placement-groups/
PG是ceph把数据存储到OSD之前的一个中间层,或许也可以叫索引。 在存储对象非常多的情况下,比如好几亿的对象,来定位其中一个会变得非常复杂耗时,而定位PG然后获取对象数据就简单多了。 PG是ceph中的最小管理单位,数据恢复,数据迁移都是对一个个PG做的。

PG的数量

没有固定的规定一个PG是多大,要有多少个PG。
PG会耗费CPU与内存,如果太多PG会消耗大量的CPU与内存。
但是太少了的话,每个PG中对应的数据就多,数据定位相对就慢,数据恢复也会慢。
创建Pool的时候需要指定PG数量。
Pool的PG数量以后也可以修改,只是会重新均衡Pool中的数据。


无论怎么计算PG数量,一定需要是2的N次幂。
其他值将导致OSD上的数据分布不均


计算PG

https://docs.ceph.com/docs/master/rados/operations/placement-groups/#choosing-the-number-of-placement-groups

以经验来看,每个OSD 50-100个PG比较好。这个是总PG的数量,如果有多个pool,就需要根据以后数据可能的存储量来计算每个pool占用多少PG了。
官网有个计算公式,来计算集群中只有一个pool的情况下需要定义的PG数量,这就是一个基线,并不是一定要这样。

             (OSDs * 100)
Total PGs =  ------------
              pool size

计算出来的结果四舍五入取最接近2的N次幂的值。比如:

(200 * 100)
----------- = 6667. Nearest power of 2: 8192
     3

6667最接近的是8192。

这个是集群就只有这一个存储数据的pool的情况下,如果有多个pool也是要自己斟酌。
pool size:同一个PG需要多少份,用于数据持久高可用。
除于pool size是因为,相同的PG有3份,也就是3个PG的资源消耗。


集群有个pg总数量限制:
mon_max_pg_per_osd * num_in_osds
比如我这里报的错:

[root@cephnode1 ~]# ceph osd pool create test1 64 64
Error ERANGE:  pg_num 64 size 3 would mean 1632 total pgs, which exceeds max 1500 (mon_max_pg_per_osd 250 * num_in_osds 6)

64的pg,3副本的情况下,pg总数量达到1632(是总共的数量),超过了1500。 1500就是通过那两个值计算出来的。

[root@cephnode1 ~]# ceph pg stat
480 pgs: 480 active+clean; 611 MiB data, 2.1 GiB used, 88 GiB / 96 GiB avail

pg已经480个了,都是副本3的,再加上上面的64*3,数量1632。

mon_max_pg_per_osd可以通过ceph config show-with-defaults查看:

[root@cephnode1 ~]# ceph config show-with-defaults osd.0 | grep mon_max_pg_per_osd
mon_max_pg_per_osd                                         250                                                                                                                                                                                                                                       default

自动缩放

在少于50个OSD的情况下也可以使用自动的方式。
每一个Pool都有一个pg_autoscale_mode参数,有三个值:
off:禁用自动缩放。
on:启用自动缩放。
warn:在应该调整PG数量时报警

对现有的pool启用自动缩放

ceph osd pool set <pool-name> pg_autoscale_mode <mode>

自动调整是根据Pool中现有的数据存储大小计算,而且只有Pool中生效的PG数量与计算出来的数量差异大于3倍时才会调整。

为了防止Pool中PG数量在数据多了以后再自动调整,可以提前指定一个大小。
如:

ceph osd pool set mypool target_size_bytes 100T

还有一个方式是指定pool之间的比例,这里就不说明了。
好像在创建pool的时候不能直接指定上面的参数,有的官网上有的也不行,可能是我的版本问题。

来一个简单的例子:

[root@cephnode1 ~]# ceph osd pool create test1 100 100
pool 'test1' created
[root@cephnode1 ~]# ceph osd pool set test1 target_size_bytes 10G
set pool 7 target_size_bytes to 10G
[root@cephnode1 ~]# ceph osd pool set test1  pg_autoscale_mode on
set pool 7 pg_autoscale_mode to on

查看一下状态:

[root@cephnode1 ~]# ceph osd pool autoscale-status
POOL                  SIZE TARGET SIZE RATE RAW CAPACITY  RATIO TARGET RATIO BIAS PG_NUM NEW PG_NUM AUTOSCALE
test1                   0       10240M  3.0       98280M 0.3126               1.0    100            on
.rgw.root            1245               3.0       98280M 0.0000               1.0     32            warn
default.rgw.meta        0               3.0       98280M 0.0000               1.0     32            warn
default.rgw.log         0               3.0       98280M 0.0000               1.0     32            warn
default.rgw.control     0               3.0       98280M 0.0000               1.0     32            warn

查看自动缩放状态

需要启用mgr里的pg_autoscaler模块。

ceph mgr module enable pg_autoscaler

执行

[root@cephnode1 ~]# ceph osd pool autoscale-status
POOL                  SIZE TARGET SIZE RATE RAW CAPACITY  RATIO TARGET RATIO BIAS PG_NUM NEW PG_NUM AUTOSCALE
test1                   0               3.0       98280M 0.0000               1.0    200         32 on
test2                   0               3.0       98280M 0.0000               1.0    100         32 on
default.rgw.meta        0               3.0       98280M 0.0000               1.0     32            warn
default.rgw.control     0               3.0       98280M 0.0000               1.0     32            warn
.rgw.root            1245               3.0       98280M 0.0000               1.0     32            warn
default.rgw.log         0               3.0       98280M 0.0000               1.0     32            warn

SIZE: 存储在Pool中的数据量。
TARGET SIZE: 指定的数据量。自动调整会根据SIZETARGET SIZE中大的值做计算。
RATE:
RAW CAPACITY: 集群存储的总容量
TARGET RATIO: 与其他Pool的存储比率。如果同时指定了SIZETARGET RATIO,则TARGET RATIO优先。
EFFECTIVE RATIO:
PG_NUM: 当前Pool中的PG数量。
NEW PG_NUM: 将要更改的值,将要变成PG_NUM。 只有在计算的PG数量与PG_NUM差异大于3倍是才会出现。
AUTOSCALE: pg_autoscale_mode的值。


二、Pool

数据存储的规则。 创建pool来自定义规则,不创建也是使用默认的pool。
https://docs.ceph.com/docs/master/rados/operations/pools/
Pool提供以下功能:

  • 持久性: 设置副本,以及最少副本才会提供服务。保障数据安全。
  • PG: 设置PG数量,来达到资源与性能的平衡。
  • CRUSH规则: 数据在集群中的存储方式。
  • 快照: 可以为Pool创建快照。

创建Pool

完整的:

ceph osd pool create {pool-name} [{pg-num} [{pgp-num}]] [replicated] \
     [crush-rule-name] [expected-num-objects]
ceph osd pool create {pool-name} [{pg-num} [{pgp-num}]]   erasure \
     [erasure-code-profile] [crush-rule-name] [expected_num_objects] [--autoscale-mode=<on,off,warn>]

这里只用到了这个:

ceph osd pool create {pool-name} {pg-num} {pgp-num}

pg-num: PG数量
pgp-num: 用于放置目地的pg,可能是使用使用的PG数量吧,除非需要拆分PG,不然和PG数量一样。

[root@cephnode1 ~]# ceph osd pool create test2 100 100
pool 'test2' created

关联应用

Pool在CephFSRGW中使用时,会自动关联。 而在RBD使用时,需要使用rbd工具初始化。如:

rbd pool init <pool-name>

或者手动与应用关联:

ceph osd pool application enable {pool-name} {application-name}

如:

ceph osd pool application enable rbd rbd 

注意

CephFS使用的应用程序名称是cephfs,RBD使用应用程序名称rbd,而RGW使用应用程序名称rgw。

查询信息

Pool的利用率统计信息
rados df
全部或指定Pool的I/O信息
ceph osd pool stats [{pool-name}]
获取Pool的配置信息

https://docs.ceph.com/docs/master/rados/operations/pools/#get-pool-values

ceph osd pool get {pool-name} {key}

key包括:
size: 对象副本数(包括对象本身)
min_size: 对象最小副本数(包括对象本身),少于这个数字,I/O降级,也可能不在提供I/O。
pg_num: pg数量
pgp_num: pgp数量
还有很多,就不一一列出了,上面网址里都有。

配置Pool

设置上面获取Pool的配置信息里的key值。

副本数与最小副本数
ceph osd pool set {poolname} size {num-replicas}

num-replicas: 对象副本数,包含对象本身。

[root@cephnode1 ~]# ceph osd pool set test2 size 2
set pool 8 size to 2
[root@cephnode1 ~]# ceph osd pool set test2 min_size 1
set pool 8 min_size to 1
[root@cephnode1 ~]# ceph osd pool get test2 size
size: 2
[root@cephnode1 ~]# ceph osd pool get test2 min_size
min_size: 1