02-ceph存储池(OSD)的增删改查

一、存储池(osd)的查询

1.查看存储池列表

默认情况下只有’.mgr这个存储池’

[root@ceph141 ~]# ceph osd pool ls 
.mgr

2.查看存储池及其编号信息

[root@ceph141 ~]# ceph osd  lspools
1 .mgr

3.查看存储池的详细信息

[root@ceph141 ~]# ceph osd pool ls detail
pool 1 '.mgr' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 1 pgp_num 1 autoscale_mode on last_change 21 flags hashpspool stripe_width 0 pg_num_max 32 pg_num_min 1 application mgr read_balance_score 9.09

4.查看存储池利用率统计信息

[root@ceph141 ~]# rados df 
POOL_NAME     USED  OBJECTS  CLONES  COPIES  MISSING_ON_PRIMARY  UNFOUND  DEGRADED  RD_OPS       RD  WR_OPS       WR  USED COMPR  UNDER COMPR
.mgr       1.3 MiB        2       0       6                   0        0         0     310  512 KiB     167  1.6 MiB         0 B          0 B
ers01          0 B        0       0       0                   0        0         0       0      0 B       0      0 B         0 B          0 B
mysql          0 B        0       0       0                   0        0         0       0      0 B       0      0 B         0 B          0 B

total_objects    2
total_used       360 MiB
total_avail      5.3 TiB
total_space      5.3 TiB

列表字段说明

  • USED:存储池中已使用的存储空间。
  • OBJECTS:存储池中的对象数量。
  • CLONES:克隆的对象数量。通常用于快照功能,这里显示为 0,表示没有克隆的对象。
  • COPIES:对象的副本总数。例如,如果一个对象有 3 个副本,且存储池中有 2 个对象,则 COPIES 为 6。
  • MISSING_ON_PRIMARY:在主 OSD 上丢失的对象数量。这里显示为 0,表示没有丢失的对象。
  • UNFOUND:未找到的对象数量。这里显示为 0,表示没有未找到的对象。
  • DEGRADED:降级的对象数量。降级是指某些副本丢失,但数据仍然可用。这里显示为 0,表示没有降级的对象。
  • RD_OPS:读取操作次数。
  • RD:读取的数据量。
  • WR_OPS:写入操作次数。
  • WR:写入的数据量。
  • USED COMPR:已使用的压缩数据量。这里显示为 0 B,表示没有启用压缩或没有压缩数据。
  • UNDER COMPR:正在压缩的数据量。这里显示为 0 B,表示没有正在进行的压缩操作。

总计

  • total_objects:所有存储池中的对象总数。
  • total_used:所有存储池中已使用的总存储空间。
  • total_avail:集群中可用的总存储空间。
  • total_space:集群中的总存储空间。

5.获取特定池或所有池的I/O信息

#这些存储池当前没有读写操作或正在进行的后台任务
[root@ceph141 ~]# ceph osd pool stats 
pool .mgr id 1
  nothing is going on

pool mysql id 9
  nothing is going on

pool ers01 id 10
  nothing is going on

6.获取存储池某个特定的配置参数

可以获取ceph osd pool ls detail中的所有参数

[root@ceph141 ~]# ceph osd pool get mysql size 
size: 2
[root@ceph141 ~]# ceph osd pool get mysql pg_num
pg_num: 32

7.获取存储的大小相关配置信息

[root@ceph141 ~]#  ceph osd dump | grep 'replicated size'
pool 1 '.mgr' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 1 pgp_num 1 autoscale_mode on last_change 21 flags hashpspool stripe_width 0 pg_num_max 32 pg_num_min 1 application mgr read_balance_score 9.09
pool 9 'mysql' replicated size 2 min_size 1 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 327 lfor 0/0/322 flags hashpspool stripe_width 0 read_balance_score 2.25

二、存储池(osd)的创建

1.创建存储池

显示存储池详细信息时,第4列即为类型

1.1 创建副本池类型

#创建时,如果不指定存储池类型,默认就是副本池
[root@ceph141 ~]# ceph osd pool create test01 replicated 
pool 'test01' created
#可通过查看详细信息,查看副本池类型
[root@ceph141 ~]# ceph osd pool ls detail

pool 9 'test01' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 324 lfor 0/0/322 flags hashpspool stripe_width 0 read_balance_score 2.25

1.2 创建纠删码池类型

[root@ceph141 ~]# ceph osd pool create ers01 erasure
pool 'ers01' created

#可通过查看详细信息,查看副本池类型
[root@ceph141 ~]# ceph osd pool ls detail
pool 10 'ers01' erasure profile default size 4 min_size 3 crush_rule 1 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 324 lfor 0/0/322 flags hashpspool stripe_width 8192

三、存储池(osd)的修改

1.修改存储池的副本数

值得注意的是,副本数量越小数据的可靠性越差

[root@ceph141 ~]# ceph osd pool  set test01 size 2
set pool 9 size to 2

在默认情况下存储池的数量是默认不允许设置为1的,当设置为1时,数据只会存储在1个OSD上,如果这个OSD发生故障,会造成数据不可恢复性的丢失

#系统默认不允许设置为1 
[root@ceph141 ~]# ceph osd pool  set test01 size 1
Error EPERM: configuring pool size as 1 is disabled by default.

2.修改存储池的其他参数

#修改nodelete的默认值
[root@ceph141 ~]# ceph osd pool set mysql nodelete true

3.修改存储池的名称

[root@ceph141 ~]# ceph osd pool rename test01 mysql
pool 'test01' renamed to 'mysql'

四、存储池(osd)的删除

  • ceph中,由于一个存储池一旦被删除,那么该存储池的数据也会被删除、无法找回;所以为了安全起见,ceph有两种存储池的保护机制

    • nodelete
      • false:可以被删除(默认)
      • true:不可以被删除,若一个存储池打上该标记,意味着存储池不可被删除
    • mon_allow_pool_delete
      • false:不可以被删除(默认),告诉所有mon组件,可以删除存储池
      • true:可以被删除
  • 生产环境中,为了安全,通常将nodelete设置为true;mon_allow_pool_delete设置为false

  • 注意:’nodelete’和’mon_allow_pool_delete’任意一种机制都具有一票否决权,如果想要删除一个存储池,2者都得允许删除,这就是ceph的存储池保护机制。

1.查看两种机制的值

#mon_allow_pool_delete
[root@ceph141 ~]# ceph config get mon mon_allow_pool_delete
false
#nodelete
[root@ceph141 ~]# ceph osd pool get mysql nodelete
nodelete: false

2.mon_allow_pool_delete验证案例

在两个机制都没发生改动时,mon_allow_pool_delete不允许删除,所以会出现以下情况

要求我们书写存储池名字两次,并添加--yes-i-really-really-mean-it

[root@ceph141 ~]# ceph osd pool delete ers01
Error EPERM: WARNING: this will *PERMANENTLY DESTROY* all data stored in pool ers01.  If you are *ABSOLUTELY CERTAIN* that is what you want, pass the pool name *twice*, followed by --yes-i-really-really-mean-it.

再次尝试删除,要求我们必须把mon_allow_pool_delete的值设置为true

[root@ceph141 ~]# ceph osd pool delete ers01 ers01 --yes-i-really-really-mean-it
Error EPERM: pool deletion is disabled; you must first set the mon_allow_pool_delete config option to true before you can destroy a pool

设置mon_allow_pool_delete的值设置为true之后,再次尝试删除

[root@ceph141 ~]# ceph tell mon.* injectargs --mon_allow_pool_delete=true
mon.ceph141: {}
mon.ceph141: mon_allow_pool_delete = '' 
mon.ceph142: {}
mon.ceph142: mon_allow_pool_delete = '' 
mon.ceph143: {}
mon.ceph143: mon_allow_pool_delete = '' 

#成功移除
[root@ceph141 ~]# ceph osd pool delete ers01 ers01 --yes-i-really-really-mean-it
pool 'ers01' removed

3.nodelete验证案例

前面我们已将mon_allow_pool_delete的值改为true,接下来由于nodelete默认值为false,所以我们将其改为true来验证此机制是否生效

[root@ceph141 ~]# ceph osd pool set mysql nodelete true
set pool 9 nodelete to true

尝试删除,失败,验证成功

[root@ceph141 ~]# ceph osd pool  delete mysql mysql --yes-i-really-really-mean-it
Error EPERM: pool deletion is disabled; you must unset nodelete flag for the pool first

五、存储池pg和pgp的数量配置

1.官方推荐合理设置PG数量

$$
\frac{OSD数量*100}{pool存储池的size}=PG数量
$$

官方的建议是设置为2的幂,所以设置的PG数量应为与所得结果最相近的2的幂值

示例:

我们的测试环境有9块磁盘,Mysql存储池数量为3,所以:
$$
\frac{9*100}{3}=300PG
$$
所得PG数量为300,与之最近的2的幂为256,所以应设置PG数量为256

2.autoscale_mode的配置

当autoscale_mode开启时,修改pg的数量时会自动变会默认的pg数量

2.1 查询autoscale_mode的值

有三种模式:

  • off:禁用自动扩展功能。管理员需要手动为每个存储池设置合适的 PG 数量。
  • on:启用自动扩展功能。PG 数量会根据存储池的使用情况进行自动调整。
  • warn:当 PG 数量需要调整时,会触发健康警报,但不会自动调整 PG 数量。
[root@ceph141 ~]# ceph osd pool get mysql pg_autoscale_mode
pg_autoscale_mode: on

2.2 修改autoscale_mode的值

[root@ceph141 ~]# ceph osd  pool set mysql pg_autoscale_mode off
set pool 9 pg_autoscale_mode to off

2.3 更改pg和pgp的值

想要设置二值为某指定值,必须将autoscale_mode设置为off

[root@ceph141 ~]# ceph osd pool set mysql pg_num 2
set pool 9 pg_num to 2
[root@ceph141 ~]# ceph osd pool set mysql pgp_num 2
set pool 9 pgp_num to 2

2.4 关于为什么修改PG和PGP值不会瞬间改变的问题

  • 修改完PG和PGP值后,我们观察发现,PG值要等一段时间才能配置成功
[root@ceph141 ~]# ceph osd pool  ls detail
pool 9 'mysql' replicated size 2 min_size 1 crush_rule 0 object_hash rjenkins pg_num 27 pgp_num 26 pg_num_target 2 pgp_num_target 2 autoscale_mode off last_change 360 lfor 0/358/356 flags hashpspool,nodelete stripe_width 0 read_balance_score 2.33
#一段时间后
[root@ceph141 ~]# ceph osd pool  ls detail
pool 9 'mysql' replicated size 2 min_size 1 crush_rule 0 object_hash rjenkins pg_num 2 pgp_num 2 autoscale_mode off last_change 487 lfor 0/487/485 flags hashpspool,nodelete stripe_width 0 read_balance_score 4.55
  • 原因:
 Ceph 在调整 PG 数量时会考虑数据的重平衡和集群的稳定性
- 重平衡: 
	pg_num 和 pgp_num 发生变化时,Ceph 需要将数据从旧的 PG 映射迁移到新的 PG 映射中。这个过程需要逐步进行,以避免对集群性能造成过大影响
- 集群的稳定性:
	直接大幅调整 PG 数量可能会导致集群负载不均衡,甚至可能引发性能问题

3.创建存储池时指定pg和pgp

[root@ceph141 ~]# ceph osd pool create harbor 128 128 --autoscale_mode off
pool 'harbor' created
[root@ceph141 ~]# ceph osd pool ls detail
pool 11 'harbor' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 128 pgp_num 128 autoscale_mode off last_change 491 flags hashpspool stripe_width 0 read_balance_score 1.90

4.总结

  • PG:一个存储池可以有多个pg,数据分布式存储在不同的pg中,pg和pgp数量要保持一致。

  • size:数据存储几份,对于副本池而言,若不指定,则默认存储3副本

  • min_size:最小可用的副本数量,比如3副本,如果你设置为最小的副本数量为1,表示可以允许挂掉2个节点。但是如果你设置的为2,表示可以挂掉1个节点。

来源链接:https://www.cnblogs.com/dezyan/p/18807698

请登录后发表评论

    没有回复内容