ceph 存储池操作

存储池的管理通常保存创建、列出、重命名和删除等操作,管理工具使用 ceph osd pool 的子命令及参数,比如 create/ls/rename/rm 等。

1、常用命令

# 创建存储池命令格式
$ceph osd pool create <poolname> pg_num pgp_num {replicated|erasure}

# 列出存储池,不带 pool ID
[ceph@deploy ceph-cluster]$ ceph osd pool ls
[ceph@deploy ceph-cluster]$ ceph osd pool ls detail

# 带 pool ID
[ceph@deploy ceph-cluster]$ ceph osd lspools

# 获取存储池的统计信息
[ceph@deploy ceph-cluster]$ ceph osd pool stats mypool

# 重命名存储池
$ ceph osd pool rename old-name new-name

[ceph@deploy ceph-cluster]$ ceph osd pool rename myrdb1 myrdb2

# 显示存储池的用量信息
[ceph@deploy ceph-cluster]$ rados df
图片[1]-ceph 存储池操作-李佳程的个人主页

2、存储池的删除

如果把存储池删除会导致把存储池内的数据全部删除,因此 ceph 为了防止误删除存储池设置了两个机制来防止误删除操作。

第一个机制是 NODELETE 标志,需要设置为 false 但是默认就是 false 了。

[ceph@deploy ceph-cluster]$ ceph osd pool create mypool2 32 32
pool 'mypool2' created
[ceph@deploy ceph-cluster]$ ceph osd pool get mypool2 nodelete
nodelete: false

# 如果设置为了 true 就表示不能删除,可以使用 set 指令重新设置为 fasle
[ceph@deploy ceph-cluster]$ ceph osd pool set mypool2 nodelete true
set pool 9 nodelete to true

[ceph@deploy ceph-cluster]$ ceph osd pool set mypool2 nodelete false
set pool 9 nodelete to false

[ceph@deploy ceph-cluster]$ ceph osd pool get mypool2 nodelete
nodelete: false

第二个机制是集群范围的配置参数 mon allow pool delete,默认值为 false,即监视器不允许删除存储池,可以在特定场合使用 tell 指令临时设置为(true)允许删除,在删除指定的 pool之后再重新设置为 false。

[ceph@deploy ceph-cluster]$ ceph tell mon.* injectargs --mon-allow-pool-delete=true
mon.mon01: injectargs:mon_allow_pool_delete = 'true'
mon.mon02: injectargs:mon_allow_pool_delete = 'true'
mon.mon03: injectargs:mon_allow_pool_delete = 'true'

[ceph@deploy ceph-cluster]$ ceph osd pool rm mypool2 mypool2 --yes-i-really-really-mean-it
pool 'mypool2' removed

[ceph@deploy ceph-cluster]$ ceph tell mon.* injectargs --mon-allow-pool-delete=false
mon.mon01: injectargs:mon_allow_pool_delete = 'false'
mon.mon02: injectargs:mon_allow_pool_delete = 'false'
mon.mon03: injectargs:mon_allow_pool_delete = 'false' 

3、存储池配额

存储池可以设置两个配对存储的对象进行限制,一个配额是最大空间(max_bytes),另外一个配额是对象最大数量(max_objects)。

[ceph@deploy ceph-cluster]$ ceph osd pool get-quota mypool
quotas for pool 'mypool':
  max objects: N/A # 默认不限制对象数量
  max bytes  : N/A # 默认不限制空间大小

# 限制最大 1000 个对象
[ceph@deploy ceph-cluster]$ ceph osd pool set-quota mypool max_objects 1000
set-quota max_objects = 1000 for pool mypool

# 限制最大 10737418240 字节
[ceph@deploy ceph-cluster]$ ceph osd pool set-quota mypool max_bytes 10737418240
set-quota max_bytes = 10737418240 for pool mypool

[ceph@deploy ceph-cluster]$ ceph osd pool get-quota mypool
quotas for pool 'mypool':
  max objects: 1 k objects
  max bytes  : 10 GiB

4、存储池可用参数

size:存储池中的对象副本数,默认一主两个辅助 3 副本。
min_size:提供服务所需要的最小副本数,如果定义 size 为 3,min_size 也为 3,坏掉一个
OSD,如果 pool 池中有副本在此块 OSD 上面,那么此 pool 将不提供服务,如果将 min_size
定义为 2,那么还可以提供服务,如果提供为 1,表示只要有一块副本都提供服务。
[ceph@deploy ceph-cluster]$ ceph osd pool get mypool size
size: 3
[ceph@deploy ceph-cluster]$ ceph osd pool get mypool min_size
min_size: 2

pg_num:查看当前 PG 的数量
[ceph@deploy ceph-cluster]$ ceph osd pool get mypool pg_num
pg_num: 32

crush_rule:设置 crush 算法规则
[ceph@deploy ceph-cluster]$ ceph osd pool get mypool crush_rule
crush_rule: replicated_rule    # 默认为副本池

nodelete:控制是否可删除
[ceph@deploy ceph-cluster]$ ceph osd pool get mypool nodelete
nodelete: false                # 默认可以

nopgchange:控制是否可更改存储池的 pg num 和 pgp num
[ceph@deploy ceph-cluster]$ ceph osd pool get mypool nopgchange
nopgchange: false              # 默认可以
[ceph@deploy ceph-cluster]$ ceph osd pool set mypool pg_num 64
set pool 1 pg_num to 64

nosizechange:控制是否可以更改存储池的大小
[ceph@deploy ceph-cluster]$ ceph osd pool get mypool nosizechange
nosizechange: false            # 默认允许修改存储池大小
[ceph@deploy ceph-cluster]$ ceph osd pool get-quota mypool
quotas for pool 'mypool':
  max objects: 1 k objects
  max bytes  : 10 GiB
[ceph@deploy ceph-cluster]$ ceph osd pool set-quota mypool max_bytes 21474836480
set-quota max_bytes = 21474836480 for pool mypool
[ceph@deploy ceph-cluster]$ ceph osd pool get-quota mypool
quotas for pool 'mypool':
  max objects: 1 k objects
  max bytes  : 20 GiB

noscrub 和 nodeep-scrub:控制是否整理或深层整理存储池,可临时解决高 I/O 问题
[ceph@deploy ceph-cluster]$ ceph osd pool get mypool noscrub
noscrub: false           # 查看当前是否关闭轻量扫描数据,默认为不关闭,即开启
[ceph@deploy ceph-cluster]$ ceph osd pool set mypool noscrub true
set pool 1 noscrub to true   #可以修改某个指定的 pool 的轻量级扫描测量为 true,即不执行
轻量级扫描
[ceph@deploy ceph-cluster]$ ceph osd pool get mypool noscrub
noscrub: true             # 再次查看就不进行轻量级扫描了

[ceph@deploy ceph-cluster]$ ceph osd pool get mypool nodeep-scrub
nodeep-scrub: false      # 查看当前是否关闭深度扫描数据,默认为不关闭,即开启
[ceph@deploy ceph-cluster]$ ceph osd pool set mypool nodeep-scrub true
set pool 1 nodeep-scrub to true  # 可以修改某个指定的 pool 的深度扫描测量为 true
[ceph@deploy ceph-cluster]$ ceph osd pool get mypool nodeep-scrub
nodeep-scrub: true

scrub_min_interval:集群存储池的最小清理时间间隔,默认值没有设置,可以通过配置文件中的 osd_scrub_min_interval 参数指定间隔时间。
[ceph@deploy ceph-cluster]$ ceph osd pool get mypool scrub_min_interval
Error ENOENT: option 'scrub_min_interval' is not set on pool 'mypool'

scrub_max_interval:整理存储池的最大清理时间间隔,默认值没有设置,可以通过配置文件
中的 osd_scrub_max_interval 参数指定。
[ceph@deploy ceph-cluster]$ ceph osd pool get mypool scrub_max_interval
Error ENOENT: option 'scrub_max_interval' is not set on pool 'mypool'

deep_scrub_interval:深层整理存储池的时间间隔,默认值没有设置,可以通过配置文件中
的 osd_deep_scrub_interval 参数指定。
[ceph@deploy ceph-cluster]$ ceph osd pool get mypool deep_scrub_interval
Error ENOENT: option 'deep_scrub_interval' is not set on pool 'mypool'
# ceph node 的默认配置
[root@node01 ~]# ll /var/run/ceph/
total 0
srwxr-xr-x 1 ceph ceph 0 Jan  6 10:24 ceph-osd.0.asok
srwxr-xr-x 1 ceph ceph 0 Jan  6 10:24 ceph-osd.1.asok
srwxr-xr-x 1 ceph ceph 0 Jan  6 10:24 ceph-osd.2.asok
srwxr-xr-x 1 ceph ceph 0 Jan  6 10:24 ceph-osd.3.asok
srwxr-xr-x 1 ceph ceph 0 Jan  6 10:25 ceph-osd.4.asok
[root@node01 ~]# ceph daemon osd.0 config show | grep scrub
    "mds_max_scrub_ops_in_progress": "5",
    "mon_scrub_inject_crc_mismatch": "0.000000",
    "mon_scrub_inject_missing_keys": "0.000000",
    "mon_scrub_interval": "86400",
    "mon_scrub_max_keys": "100",
    "mon_scrub_timeout": "300",
    "mon_warn_not_deep_scrubbed": "0",
    "mon_warn_not_scrubbed": "0",
    "osd_debug_deep_scrub_sleep": "0.000000",
    "osd_deep_scrub_interval": "604800.000000",   # 定义深度清洗间隔,604800 秒=7天
    "osd_deep_scrub_keys": "1024",
    "osd_deep_scrub_large_omap_object_key_threshold": "200000",
    "osd_deep_scrub_large_omap_object_value_sum_threshold": "1073741824",
    "osd_deep_scrub_randomize_ratio": "0.150000",
    "osd_deep_scrub_stride": "524288",
    "osd_deep_scrub_update_digest_min_age": "7200",
    "osd_max_scrubs": "1",                        # 定义一个 ceph OSD daemon 内能
                                                    够同时进行 scrubbing 的操作数
    "osd_op_queue_mclock_scrub_lim": "0.001000",
    "osd_op_queue_mclock_scrub_res": "0.000000",
    "osd_op_queue_mclock_scrub_wgt": "1.000000",
    "osd_requested_scrub_priority": "120",
    "osd_scrub_auto_repair": "false",
    "osd_scrub_auto_repair_num_errors": "5",
    "osd_scrub_backoff_ratio": "0.660000",
    "osd_scrub_begin_hour": "0",
    "osd_scrub_begin_week_day": "0",
    "osd_scrub_chunk_max": "25",
    "osd_scrub_chunk_min": "5",
    "osd_scrub_cost": "52428800",
    "osd_scrub_during_recovery": "false",
    "osd_scrub_end_hour": "24",
    "osd_scrub_end_week_day": "7",
    "osd_scrub_interval_randomize_ratio": "0.500000",
    "osd_scrub_invalid_stats": "true",            # 定义 scrub 是否有效
    "osd_scrub_load_threshold": "0.500000",
    "osd_scrub_max_interval": "604800.000000",    # 定义最大执行 scrub 间隔,
                                                    604800 秒=7天
    "osd_scrub_max_preemptions": "5",
    "osd_scrub_min_interval": "86400.000000",     # 定义最小执行普通 scrub 间隔,
                                                    86400 秒=1天
    "osd_scrub_priority": "5",
    "osd_scrub_sleep": "0.000000",

5、存储池快照

快照用于读存储池中的数据进行备份与还原,创建快照需要占用的磁盘空间会比较大,取决于存储池中的数据大小。

创建快照

[root@node01 ~]# ceph osd  pool ls
mypool
myrdb2
.rgw.root
default.rgw.control
default.rgw.meta
default.rgw.log
cephfs-metadata
cephfs-data
[root@node01 ~]# ceph osd pool mksnap mypool mypoolsnap01
created pool mypool snap mypoolsnap01
[root@node01 ~]# rados -p mypool mksnap mypoolsnap02
created pool mypool snap mypoolsnap02

验证快照

[root@node01 ~]# rados lssnap -p mypool
1	mypoolsnap01	2023.01.08 19:04:47
2	mypoolsnap02	2023.01.08 19:05:12
2 snaps

回滚快照

测试上传文件后创建快照,然后删除文件再还原文件,基于对象还原。

rados rollback <obj-name> <snap-name> roll back object to snap <snap-name>
# 上传文件
[root@node01 ~]# rados -p mypool put testfile /etc/hosts

# 验证文件
[root@node01 ~]# rados -p mypool ls
testfile

# 创建快照
[root@node01 ~]# rados -p mypool mksnap mypoolsnaptest
created pool mypool snap mypoolsnaptest


# 验证快照
[root@node01 ~]# rados lssnap -p mypool
1	mypoolsnap01	2023.01.08 19:04:47
2	mypoolsnap02	2023.01.08 19:05:12
3	mypoolsnaptest	2023.01.08 19:07:27
3 snaps

# 删除文件
[root@node01 ~]# rados -p mypool rm testfile

# 删除文件后,无法再次删除文件,提升文件不存在
[root@node01 ~]# rados -p mypool rm testfile
error removing mypool>testfile: (2) No such file or directory

# 通过快照还原某个文件
[root@node01 ~]# rados rollback -p mypool testfile mypoolsnaptest
rolled back pool mypool to snapshot mypoolsnaptest


# 验证文件
[root@node01 ~]# rados -p mypool ls
testfile

删除快照

ceph osd pool rmsnap <poolname> <snap>
[root@node01 ~]# rados lssnap -p mypool
1	mypoolsnap01	2023.01.08 19:04:47
2	mypoolsnap02	2023.01.08 19:05:12
3	mypoolsnaptest	2023.01.08 19:07:27
3 snaps
[root@node01 ~]# ceph osd pool rmsnap mypool mypoolsnaptest
removed pool mypool snap mypoolsnaptest
[root@node01 ~]# rados lssnap -p mypool
1	mypoolsnap01	2023.01.08 19:04:47
2	mypoolsnap02	2023.01.08 19:05:12
2 snaps

6、数据压缩

如果使用 bulestore 存储引擎,ceph 支持称为”实时数据压缩”即边压缩边保存数据的功能,该功能有助于节省磁盘空间,可以在BlueStore OSD上创建的每个Ceph池上启用或禁用压缩,以节约磁盘空间,默认没有开启压缩,需要后期配置并开启。

启用压缩并指定压缩算法

# 默认算法为snappy
ceph osd pool set <pool name> compression_algorithm snappy

snappy:该配置为指定压缩使用的算法默认为 sanppy,还有 none、zlib、lz4、zstd 和 snappy等算法,zstd 压缩比好,但消耗 CPU,lz4 和 snappy 对 CPU 占用较低,不建议使用 zlib。

指定压缩模式

ceph osd pool set <pool name> compression_mode aggressive

aggressive:压缩的模式,有 none、aggressive、passive 和 force,默认 none。
none:从不压缩数据。
passive:除非写操作具有可压缩的提示集,否则不要压缩数据。
aggressive:压缩数据,除非写操作具有不可压缩的提示集。
force:无论如何都尝试压缩数据,即使客户端暗示数据不可压缩也会压缩,也就是在所有情况下都使用压缩。

存储池压缩设置参数

compression_algorithm        # 压缩算法
compression_mode             # 压缩模式
compression_required_ratio   # 压缩后与压缩前的压缩比,默认为.875
compression_max_blob_size    # 大于此的块在被压缩之前被分解成更小的 blob(块),此设置
                               将覆盖 bluestore 压缩 max blob *的全局设置。
compression_min_blob_size    # 小于此的块不压缩, 此设置将覆盖 bluestore 压缩 min
                               blob *的全局设置。

全局压缩选项,这些可以配置到 ceph.conf 配置文件,作用于所有存储池

bluestore_compression_algorithm          # 压缩算法
bluestore_compression_mode               # 压缩模式
bluestore_compression_required_ratio     # 压缩后与压缩前的压缩比,默认为.875
bluestore_compression_min_blob_size      # 小于它的块不会被压缩,默认 0
bluestore_compression_max_blob_size      # 大于它的块在压缩前会被拆成更小的块,默认 0
bluestore_compression_min_blob_size_ssd  # 默认 8k
bluestore_compression_max_blob_size_ssd  # 默认 64k
bluestore_compression_min_blob_size_hdd  # 默认 128k
bluestore_compression_max_blob_size_hdd  # 默认 512k

到 node 节点验证

[root@node01 ~]# ceph daemon osd.0 config show | grep compression
图片[2]-ceph 存储池操作-李佳程的个人主页
# 修改压缩算法
[root@node01 ~]# ceph osd pool set mypool compression_algorithm snappy
set pool 1 compression_algorithm to snappy
[root@node01 ~]# ceph osd pool get mypool compression_algorithm
compression_algorithm: snappy
# 修改压缩模式
[root@node01 ~]# ceph osd pool set mypool compression_mode force
set pool 1 compression_mode to force
[root@node01 ~]# ceph osd pool get mypool compression_mode
compression_mode: force

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享