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
以经验来看,每个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
: 指定的数据量。自动调整会根据SIZE
与TARGET SIZE
中大的值做计算。
RATE
:
RAW CAPACITY
: 集群存储的总容量
TARGET RATIO
: 与其他Pool的存储比率。如果同时指定了SIZE
与TARGET 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在CephFS
或RGW
中使用时,会自动关联。 而在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