Ceph以存储池(Pools)为逻辑单元管理数据的存储并对资源进行隔离,通过创建不同的存储池提供不同的存储服务(块存储、对象存储、文件存储)。每个存储池都提供一个命名空间,一个存储池中不能包含名称一样的对象,但在不同存储池中可以。存储池通过Crush rule来决定数据的存储位置,另外也可以设置不同的存储策略比如副本策略或者纠删码策略等,通过合理的Crush设计可以实现存储池中数据的容灾机制,比如经常采用的跨机柜容灾。所以针对存储池的管理,在ceph使用中至关重要,接下来将介绍存储池中常用的管理命令。
因为存储池和数据存储有关系,所以和它相关的命令属于osd的子命令。
# ceph osd pool <子命令> <参数>
要列出集群当前已经创建的存储池,可以通过以下命令完成。如果您在集群创建之后没有创建任何池子,那么Ceph中只有一个默认的rbd存储池。
# ceph osd lspools
0 rbd
当然通过rados命令也可以查看
# rados lspools
rbd
创建存储池时,需要设定存储池中PG的个数以及对应的crush rule。
# ceph osd pool create {pool-name} {pg-num} [{pgp-num}] [replicated] \
[crush-ruleset-name] [expected-num-objects]
# ceph osd pool create {pool-name} {pg-num} {pgp-num} erasure \
[erasure-code-profile] [crush-ruleset-name] [expected_num_objects]
-
pool-name,存储池的名字
-
pg-num,存储池拥有PG的个数,关于一个存储池的PG数设置为多少合适,可以参考这个公式pg-num=OSD num * 100/ replica num。
-
pgp-num,存储数据的PG的数目,存储池创建出来的pg-num并不一定都会用来存储数据。
-
replicated | erasure,存储池的类型,replicated表示采用副本类型,而erasure表示采用纠删码方式(类似于RAID5的功能),默认不指定则采用副本类型。
-
crush-ruleset-name,指定存储池使用的CRUSH rule的名字(是个字符串),指定的CRUSH rule必须存在。对于创建采用副本类型的存储池来说,如果不指定名称,则采用配置项osd_pool_default_crush_replicated_ruleset指定的规则。对于创建erasure类型的存储池来说,不同的pool所使用的默认纠删码配置是不同的。
-
erasure-code-profile,仅用于创建erasure类型的存储池时指定纠删存储池的纠删码配置框架。如果不指定则使用osd_pool_default_erasure_code_profile中配置的框架。
-
expected_num_objects,存储池的预估对象数。
如果要删除某个存储池,可以执行以下命令:
# ceph osd pool delete {pool-name} [{pool-name} --yes-i-really-really-mean-it]
例如:
# ceph osd pool delete rbd rbd --yes-i-really-really-mean-it
如果要删除某个存储池,可以执行以下命令:
# ceph osd pool rename {current-pool-name} {new-pool-name}
例如要将名为test1的池子重命名为test2:
# ceph osd pool rename test1 test2
创建池子的快照
# ceph osd pool mksnap {pool-name} {snap-name}
例如
# ceph osd pool mksnap test2 test2snap
created pool test2 snap test2snap
删除池子的快照
# ceph osd pool rmsnap {poolname} {snap}
例如
# ceph osd pool rmsnap test2 test2snap
removed pool test2 snap test2snap
获取存储池的配额设置:
# ceph osd pool get-quota <poolname>
例如:
# ceph osd pool get-quota test2
quotas for pool 'test2':
max objects: N/A
max bytes : N/A
存储池的配额可以设置最大字节数、最大对象数。
# ceph osd pool set-quota {pool-name} [max_objects {obj-count}] [max_bytes {bytes}]
例如:
# ceph osd pool set-quota test2 max_objects 100
# ceph osd pool set-quota test2 max_bytes 10240
ceph osd pool get {pool-name} {key}
- size,存储池采用副本机制时,表明数据的副本数,默认为3。
- min_size,设置数据的最小副本数,当副本数小于该值时,对应的数据将不能被更新。
- crash_replay_interval,允许客户端重放确认而未提交请求的秒数。
- pg_num,存储池中创建出来的PG数目。
- pgp_num,创建出来的PG中用于实际存储数据的PG数目。
- crush_ruleset,存储池使用的CRUSH规则。
- scrub_min_interval,在负载低时,洗刷存储池的最大间隔秒数。如果是 0 ,就按照配置文件里的 osd_scrub_min_interval 。
- scrub_max_interval,不管集群负载如何,都要洗刷存储池的最大间隔秒数。如果是 0 ,就按照配置文件里的 osd_scrub_max_interval 。
- deep_scrub_interval,“深度”洗刷存储池的间隔秒数。如果是 0 ,就按照配置文件里的 osd_deep_scrub_interval 。
以下的一些设置仅适用于Cache Tier开启的情况:
- hit_set_type,启用缓存缓存池中的hit set类型,默认是bloom filter。
- hit_set_count,每个hit set能够缓存数据的时间长度。
- hit_set_period,所有hit set能够缓存数据的时间长度。
- hit_set_fpp,bloom 命中集类型的假阳性概率。
- cache_target_dirty_ratio,缓存存储池包含的脏对象达到多少比例时就把它们回写到后端的存储池。
- cache_target_dirty_high_ratio,缓存存储池内包含的已修改(脏的)对象达到此比例时,缓存层代理就会更快地把脏对象刷回到后端存储池。
- cache_target_full_ratio,缓存存储池包含的干净对象达到多少比例时,缓存代理就把它们赶出缓存存储池。
- target_max_bytes,达到 max_bytes 阀值时 Ceph 就回写或赶出对象。
- target_max_objects,达到 max_objects 阀值时 Ceph 就回写或赶出对象。
- hit_set_grade_decay_rate,在两个连续 hit_sets 间的热度衰退速率。
- hit_set_grade_search_last_n,计算热度时,在 hit_sets 里最多计数 N 次。
- cache_min_flush_age,达到此时间(单位为秒)时,缓存代理就把某些对象从缓存存储池刷回到存储池。
- cache_min_evict_age,达到此时间(单位为秒)时,缓存代理就把某些对象从缓存存储池赶出。
设置一个存储池的选项,可以执行以下命令:
ceph osd pool set {pool-name} {key} {value}
存储池中可以设置的选项除了上面列出来的之外,还有些
- nodelete,给指定存储池设置/取消 NODELETE 标志。
- nopgchange,给指定存储池设置/取消 NOPGCHANGE 标志。
- nosizechange,给指定存储池设置/取消 NOSIZECHANGE 标志。
- write_fadvise_dontneed,设置或取消指定存储池的 WRITE_FADVISE_DONTNEED 标志。