04 存储池 Pool操作
存储池的常用管理操作包括列出、创建、重命名和删除等操作,常用相关的工具都是“ceph osd pool”的子命令,包括ls、create、rename和rm等。pool相关的帮助信息通过ceph osd pool -h查看。
pool是没有大小的,其大小取决于其所在osd的大小。但是pool可以配置配额。从Luminous开始,所有池都需要使用该池与应用程序关联。
副本型存储池创建命令:
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]
- 未指定要使用的纠删编码配置文件时,创建命令会为其自动创建一个,并在创建相关的CRUSH规则集时使用到它
- 默认配置文件自动定义k=2和m=1,这意味着Ceph将通过三个OSD扩展对象数据,并且可以丢失 其中一个OSD而不会丢失数据,因此,在冗余效果上,它相当于一个大小为2的副本池 ,不过, 其存储空间有效利用率为2/3而非1/2。
常用的参数
pool-name:存储池名称,在一个RADOS存储集群上必须具有唯一性;
pg-num:当前存储池中的PG数量,合理的PG数量对于存储池的数据分布及性能表现来说至关重 要;
pgp-num :用于归置的PG数量,其值应该等于PG的数量
replicated|erasure:存储池类型;副本存储池需更多原始存储空间,但已实现Ceph支持的所有操
作,而纠删码存储池所需原始存储空间较少,但目前仅实现了Ceph的部分操作
crush-ruleset-name:此存储池所用的CRUSH规则集的名称,不过,引用的规则集必须事先存在
ceph osd pool ls [detail]
[root@stor01 ~]# ceph osd pool ls
mypool
rbddata
.rgw.root
default.rgw.control
default.rgw.meta
default.rgw.log
cephfs-metadata
cephfs-data
[root@stor01 ~]# ceph osd pool ls detail
pool 1 'mypool' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode warn last_change 36 flags hashpspool stripe_width 0
pool 2 'rbddata' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 64 pgp_num 64 autoscale_mode warn last_change 43 flags hashpspool,selfmanaged_snaps stripe_width 0 application rbd
removed_snaps [1~3]
pool 3 '.rgw.root' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode warn last_change 47 flags hashpspool stripe_width 0 application rgw
pool 4 'default.rgw.control' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode warn last_change 49 flags hashpspool stripe_width 0 application rgw
pool 5 'default.rgw.meta' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode warn last_change 51 flags hashpspool stripe_width 0 application rgw
pool 6 'default.rgw.log' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode warn last_change 53 flags hashpspool stripe_width 0 application rgw
pool 7 'cephfs-metadata' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 64 pgp_num 64 autoscale_mode warn last_change 60 flags hashpspool stripe_width 0 pg_autoscale_bias 4 pg_num_min 16 recovery_priority 5 application cephfs
pool 8 'cephfs-data' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 64 pgp_num 64 autoscale_mode warn last_change 60 flags hashpspool stripe_width 0 application cephfs
ceph osd pool stats [pool-name]
示例:
[root@stor01 ~]# ceph osd pool stats rbdpool
pool rbdpool id 9
nothing is going on
ceph df #查看每个pool的磁盘使用量
ceph osd df #查看每个osd的磁盘使用
rados df
示例:
[root@stor01 ~]# ceph df
RAW STORAGE:
CLASS SIZE AVAIL USED RAW USED %RAW USED
ssd 800 GiB 792 GiB 337 MiB 8.3 GiB 1.04
TOTAL 800 GiB 792 GiB 337 MiB 8.3 GiB 1.04
POOLS:
POOL ID PGS STORED OBJECTS USED %USED MAX AVAIL
.rgw.root 3 32 1.2 KiB 4 48 KiB 0 250 GiB
default.rgw.control 4 32 0 B 8 0 B 0 250 GiB
default.rgw.meta 5 32 0 B 0 0 B 0 250 GiB
default.rgw.log 6 32 0 B 175 0 B 0 250 GiB
cephfs-metadata 7 64 5.6 KiB 22 108 KiB 0 250 GiB
cephfs-data 8 64 0 B 0 0 B 0 250 GiB
rbdpool 9 32 0 B 0 0 B 0 250 GiB
kube 10 64 174 MiB 71 327 MiB 0.04 250 GiB
[root@stor01 ~]# ceph osd df
ID CLASS WEIGHT REWEIGHT SIZE RAW USE DATA OMAP META AVAIL %USE VAR PGS STATUS
0 ssd 0.07809 1.00000 80 GiB 1.0 GiB 37 MiB 12 KiB 1024 MiB 79 GiB 1.30 1.24 115 up
1 ssd 0.11719 1.00000 120 GiB 1.0 GiB 30 MiB 19 KiB 1024 MiB 119 GiB 0.86 0.82 132 up
2 ssd 0.07809 1.00000 80 GiB 1.0 GiB 37 MiB 12 KiB 1024 MiB 79 GiB 1.30 1.24 115 up
3 ssd 0.11719 1.00000 120 GiB 1.0 GiB 45 MiB 16 KiB 1024 MiB 119 GiB 0.87 0.84 146 up
4 ssd 0.07809 1.00000 80 GiB 1.0 GiB 29 MiB 16 KiB 1024 MiB 79 GiB 1.29 1.23 97 up
5 ssd 0.11719 1.00000 120 GiB 1.1 GiB 70 MiB 19 KiB 1024 MiB 119 GiB 0.89 0.86 159 up
6 ssd 0.07809 1.00000 80 GiB 1.0 GiB 29 MiB 19 KiB 1024 MiB 79 GiB 1.29 1.24 122 up
7 ssd 0.11719 1.00000 120 GiB 1.1 GiB 58 MiB 11 KiB 1024 MiB 119 GiB 0.88 0.85 170 up
TOTAL 800 GiB 8.3 GiB 337 MiB 129 KiB 8.0 GiB 792 GiB 1.04
MIN/MAX VAR: 0.82/1.24 STDDEV: 0.21
[root@stor01 ~]# rados df
POOL_NAME USED OBJECTS CLONES COPIES MISSING_ON_PRIMARY UNFOUND DEGRADED RD_OPS RD WR_OPS WR USED COMPR UNDER COMPR
.rgw.root 48 KiB 4 0 12 0 0 0 2 2 KiB 4 4 KiB 0 B 0 B
cephfs-data 0 B 0 0 0 0 0 0 0 0 B 0 0 B 0 B 0 B
cephfs-metadata 108 KiB 22 0 66 0 0 0 38 42 KiB 72 36 KiB 0 B 0 B
default.rgw.control 0 B 8 0 24 0 0 0 0 0 B 0 0 B 0 B 0 B
default.rgw.log 0 B 175 0 525 0 0 0 28836 28 MiB 19232 0 B 0 B 0 B
default.rgw.meta 0 B 0 0 0 0 0 0 0 0 B 0 0 B 0 B 0 B
kube 327 MiB 71 24 213 0 0 0 1081 59 MiB 139 109 MiB 0 B 0 B
rbdpool 0 B 0 0 0 0 0 0 0 0 B 0 0 B 0 B 0 B
total_objects 280
total_used 8.3 GiB
total_avail 792 GiB
total_space 800 GiB
ceph osd pool rename old-name new-name
意外删除存储池会导致数据丢失,因此 Ceph 实施了两个机制来防止删除存储 池,要删除存储池,必须先禁用这两个机制:
第一个机制是NODELETE标志,其值需要为false,默认也是false
- 查看命令:
ceph osd pool get <pool-name> nodelete - 修改命令:
ceph osd pool set <pool-name> nodelete false
- 查看命令:
第二个机制是集群范围的配置参数mon allow pool delete,其默认值为 “false”,这表示默认不能删除存储池,临时设定的方法如下
ceph tell mon.* injectargs --mon-allow-pool-delete={true|false},建议删除之前将其值设置为true,删除完成后再改为false
删除命令:
ceph osd pool rm <pool-name> <pool-name> --yes-i-really-really- mean-it
示例:
[root@stor01 ~]# ceph tell mon.* injectargs --mon-allow-pool-delete=true
mon.stor01: injectargs:mon_allow_pool_delete = 'true'
mon.stor02: injectargs:mon_allow_pool_delete = 'true'
mon.stor03: injectargs:mon_allow_pool_delete = 'true'
[root@stor01 ~]# ceph osd pool rm mypool
Error EPERM: WARNING: this will *PERMANENTLY DESTROY* all data stored in pool mypool. If you are *ABSOLUTELY CERTAIN* that is what you want, pass the pool name *twice*, followed by --yes-i-really-really-mean-it.
[root@stor01 ~]# ceph osd pool rm mypool mypool --yes-i-really-really-mean-it
pool 'mypool' removed
[root@stor01 ~]# ceph tell mon.* injectargs --mon-allow-pool-delete=false
mon.stor01: injectargs:mon_allow_pool_delete = 'false'
mon.stor02: injectargs:mon_allow_pool_delete = 'false'
mon.stor03: injectargs:mon_allow_pool_delete = 'false'
Ceph支持为存储池设置可存储对象的最大数量(max_objects)和可占用的最大空间( max_bytes)两个纬度的配额,命令格式:
ceph osd pool set-quota <pool-name> max_objects|max_bytes <val>
ceph osd pool set-quota data max_objects 10000
获取存储池配额的相关信息:
ceph osd pool get-quota <pool-name>
示例:
[root@stor01 ~]# ceph osd pool get-quota rbddata
quotas for pool 'rbddata':
max objects: N/A
max bytes : N/A
[root@stor01 ~]# ceph osd pool set-quota rbddata max_objects 10000
set-quota max_objects = 10000 for pool rbddata
[root@stor01 ~]# ceph osd pool get-quota rbddata
quotas for pool 'rbddata':
max objects: 10k objects
max bytes : N/A
存储池的诸多配置属性保存于配置参数中。
获取配置:
ceph osd pool get <pool-name> size|min_size|pg_num|pgp_num|crush_rule|...
#ceph osd pool get --help 查看帮助文档
设定配置:
ceph osd pool set <pool-name> <key> <value>
示例:
[root@stor01 ~]# ceph osd pool get rbdpool size
size: 3
[root@stor01 ~]# ceph osd pool get rbdpool min_size
min_size: 2
[root@stor01 ~]# ceph osd pool get rbdpool pg_num
pg_num: 32
[root@stor01 ~]# ceph osd pool get rbdpool crush_rule
crush_rule: replicated_rule
[root@stor01 ~]# ceph osd pool set pool-demo size 2
set pool 2 size to 2
[root@stor01 ~]# ceph osd pool get pool-demo size
size: 2
[root@stor01 ~]# ceph osd pool set pool-demo pg_num 256
set pool 2 pg_num to 256
常用的可配置参数:
- size:存储池中的对象副本数;
- min_size:I/O所需要的最小副本数;当前副本数<min_size时ceph就不会响应外部的I/O请求
- pg_num:存储池的PG数量;
- pgp_num:计算数据归置时要使用的PG的有效数量;
- crush_ruleset:用于在集群中映射对象归置的规则组;
- nodelete:控制是否可删除存储池;
- nopgchange:控制是否可更改存储池的pg_num和pgp_num;
- nosizechange:控制是否可更改存储池的大小;
- noscrub和nodeep-scrub:控制是否可整理或深层整理存储池以解决临时高I/O负载的问题
- scrub_min_interval:集群负载较低时整理存储池的最小时间间隔;默认值为0,表示其取值 来自于配置文件中的osd_scrub_min_interval参数;
- scrub_max_interval:整理存储池的最大时间间隔;默认值为0,表示其取值来自于配置文件 中的osd_scrub_max_interval参数;
- deep_scrub_interval:深层整理存储池的间隔;默认值为0,表示其取值来自于配置文件中的 osd_deep_scrub参数;
存储池快照是指整个存储池的状态快照,通过存储池快照,可以保留存储池状态的历史,创建存储池快照可能需要大量存储空间,具体取决于存储池的大小。
ceph osd pool mksnap <pool-name> <snap-name>
或rados -p <pool-name> mksnap <snap-name>
rados -p <pool-name> lssnap
rados -p <pool-name> rollback <snap-name>
ceph osd pool rmsnap <pool-name> <snap-name>
或 rados -p <pool-name> rmsnap <snap-name>
BlueStore存储引擎提供即时数据压缩,以节省磁盘空间。
ceph osd pool set <pool-name> compression_algorithm snappy
- 压缩算法有none、zlib、lz4、zstd和snappy等几种,默认为snappy;
- zstd有较好的压缩比,但比较消耗CPU;
- lz4和snappy对CPU占用比例较低;
- 不建议使用zlib;
ceph osd pool set <pool-name> compression_mode aggressive
压缩模式有none、aggressive、passive和force,默认值为none;
- none:不压缩
- passive:若提示COMPRESSIBLE,则压缩
- aggressive:除非提示INCOMPRESSIBLE,否则就压缩;
- force:始终压缩
- compression_required_ratio:指定压缩比,取值格式为双精度浮点型,其值为 SIZE_COMPRESSED/SIZE_ORIGINAL,即压缩后的大小与原始内容大小的比值,默认为 .875;
- compression_max_blob_size:压缩对象的最大体积,无符号整数型数值,默认为0,表示是否压缩不根据大小判断
- compression_min_blob_size:压缩对象的最小体积,无符号整数型数值,默认为0;
可在ceph配置文件中设置压缩属性,它将对所有的存储池生效,可设置的相关参数如下:
- bluestore_compression_algorithm
- bluestore_compression_mode
- bluestore_compression_required_ratio
- bluestore_compression_min_blob_size
- bluestore_compression_max_blob_size
- bluestore_compression_min_blob_size_ssd
- bluestore_compression_max_blob_size_ssd
- bluestore_compression_min_blob_size_hdd
- bluestore_compression_max_blob_size_hdd
ceph osd erasure-code-profile ls
未指定要使用的纠删编码配置文件时,创建pool命令会为其自动创建一个,并在创建相关的CRUSH规
则集时使用到它
默认配置文件自动定义k=2和m=1,这意味着Ceph将通过三个OSD扩展对象数据,并且可以丢失 其中一个OSD而不会丢失数据,因此,在冗余效果上,它相当于一个大小为2的副本池 ,不过, 其存储空间有效利用率为2/3而非1/2。
ceph osd erasure-code-profile get default
ceph osd erasure-code-profile set <name> [<directory=directory>] \
[<plugin=plugin>] [<crush-device-class>] [<crush-failure-domain>]\
[<key=value> ...] [--force]
- - directory:加载纠删码插件的目录路径,默认为/usr/lib/ceph/erasure-code;
- - plugin:用于生成及恢复纠删码块的插件名称,默认为jerasure;
- - crush-device-class:设备类别,例如hdd或ssd,默认为none,即无视类别;
- - crush-failure-domain:故障域,默认为host,支持使用的包括osd、host、rack、row和room等 ;
- - –force:强制覆盖现有的同名配置文件;
- 例如,如果所需的体系结构必须承受两个OSD的丢失,并且存储开销为40%:
ceph osd erasure-code-profile set myprofile k=4 m=2 crush-failure-domain=osd
Ceph支持以插件方式加载使用的纠删编码插件,存储管理员可根据存储场景的需要优化选择合用的插件。目前,Ceph支持的插件包括如下三个:
jerasure:最为通用的和灵活的纠删编码插件,它也是纠删码池默认使用的插件;不过, 任何一个OSD成员的丢失,都需要余下的所有成员OSD参与恢复过程;另外,使用此类插 件时,管理员还可以通过technique选项指定要使用的编码技术:
- reed_sol_van:最灵活的编码技术,管理员仅需提供k和m参数即可;
- cauchy_good:更快的编码技术,但需要小心设置PACKETSIZE参数;
- reed_sol_r6_op、liberation、blaum_roth或liber8tion:仅支持使用m=2的编码技术,功能特性 类同于RAID 6;
lrc:全称为Locally Repairable Erasure Code,即本地修复纠删码,除了默认的m个编码 块之外,它会额外在本地创建指定数量(l)的奇偶校验块,从而在一个OSD丢失时,可 以仅通过l个奇偶校验块完成恢复
isa:仅支持运行在intel CPU之上的纠删编码插件,它支持reed_sol_van和cauchy两种技 术
例如,下面的命令创建了一个使用lrc插件的配置文件LRCprofile,其本地奇偶校验 块为3,故障域为osd:
ceph osd erasure-code-profile set LRCprofile plugin=lrc \ k=4 m=2 l=3 crush-failure-domain=osd
# list objects in pool
[cephadm@node-1 ceph-cluster]$ rados ls -p pool-demo
rbd_data.11df6c15559a.0000000000000208
rbd_data.11df6c15559a.0000000000000084
rbd_data.11df6c15559a.0000000000000608
rbd_data.11df6c15559a.0000000000000805
rbd_data.11df6c15559a.0000000000000400
rbd_data.11df6c15559a.0000000000000803
rbd_data.11df6c15559a.0000000000000000
......
# rados stat <obj-name>
[cephadm@node-1 ceph-cluster]$ rados stat rbd_data.11df6c15559a.0000000000000208 -p pool-demo
pool-demo/rbd_data.11df6c15559a.0000000000000208 mtime 2021-04-08 21:32:40.000000, size 131072
rados get <obj-name> <outfile> [-p|--pool POOL]
rados put <obj-name> <infile> [-p|--pool POOL]
# ceph osd map <poolname> <objectname>
[cephadm@node-1 ~]$ ceph osd map pool-demo rbd_data.11df6c15559a.0000000000000208
osdmap e543 pool 'pool-demo' (2) object 'rbd_data.11df6c15559a.0000000000000208' -> pg 2.78313128 (2.28) -> up ([5,1], p5) acting ([5,1], p5)
- osdmap e543:osdmap的版本(epoch)
- pool ‘pool-demo’ (2):表示名称为pool-demo的资源池,其ID为2
- object ‘rbd_data.11df6c15559a.0000000000000208’:表示对象的ID为rbd_data.11df6c15559a.0000000000000208
- pg 2.78313128 (2.28):表示对象落地的pg,该pg的ID为2.28
- ([5,1], p5):表示pg落地到的osd,osd的id为5和1,其中5为主osd。
ceph osd dump | grep 'replicated size'
pool相关的命令使用
ceph osd pool块设备相关的命令使用
rbd对象相关的命令可以使用
rados,(rados也支持操作其他级别的对象,如pool)比较底层的命令。了解即可