ceph存储池

1、存储池

1、存储池的概念

  • 存储池就是ceph的逻辑分区,专门用来存储对象的
  1. 特点

    • 将文件切片成对象,通过hash算法,找到存储池中的pg,池中的pg根据crush算法找到osd节点

    • 存储中的PG数量对性能有重要的影响,过多和过少都不行(前面第一章讲了的),超过了一定的数量后,禁止创建存储池

    • 访问级别,不同用户对于同一个存储池有不同的权限

2、存储的类型

  1. 冗余池

    • 提供数据冗余性,让数据不容易丢失,就是写入多份的意思
  2. 缓存池(加速池)

    • 为数据的读写实现加速(在冗余池前面挂载一个缓存池,作为加速池,后面的R版本的被弃用了)
  3. 根据冗余性分类的话

    • 分为复制池

    • 纠删码池

3、复制池

1、创建资源池

  • pgp 指的是OSD在pg上的排列组合方式

[root@node1 ~]# ceph osd pool create 
Invalid command: missing required parameter pool(<poolname>)
osd pool create <pool> [<pg_num:int>] [<pgp_num:int>] [replicated|erasure] [<erasure_code_profile>] [<rule>] [<expected_num_objects:int>] [<size:int>] [<pg_num_min:int>] [<pg_num_max:int>] [on|off|warn] [--bulk] [<target_size_bytes:int>] [<target_size_ratio:float>] :  create pool
Error EINVAL: invalid command# <poolname> # pg_num:int> 存储池中的pg总数# pgp_num:int 存储池中pg有效数,通常与pg相等[root@node1 ~]# ceph osd pool  create pool01
pool 'pool01' created
[root@node1 ~]# # 查看存储池[root@node1 ~]# ceph osd pool ls 
device_health_metrics
pool01

2、查看存储池

# 查看存储类型,详情
[root@node1 ~]# ceph osd pool  ls detail 
pool 1 'device_health_metrics' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 1 pgp_num 1 autoscale_mode on last_change 45 flags hashpspool stripe_width 0 pg_num_max 32 pg_num_min 1 application mgr_devicehealth
pool 2 'pool01' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 46 flags hashpspool stripe_width 0# replicated size 3  这个就是存储池的规则,写入了一份数据,然后存储三份,也就是3个副本,确保了数据的高可用性# min_size 2 最小的副本数,也就是至少要存储到2个副本才行,否则不能存储# crush_rule 0,crush规则,使用的是默认的规则,pg与osd之间的映射(也就是数据与osd的映射之间的关系)# object_hash rjenkins 对象映射到pg的算法为 rjenkins# pg_num 32 ,pgp_num 32 pg和pgp的数量都为32个# autoscale_mode on  池子开启了自我扩展,也就是自动调整PG的数量# 查看存储池容量
[root@node1 ~]# ceph df 
--- RAW STORAGE ---
CLASS    SIZE   AVAIL     USED  RAW USED  %RAW USED
hdd    90 GiB  87 GiB  2.6 GiB   2.6 GiB       2.84
TOTAL  90 GiB  87 GiB  2.6 GiB   2.6 GiB       2.84--- POOLS ---
POOL                   ID  PGS  STORED  OBJECTS  USED  %USED  MAX AVAIL
device_health_metrics   1    1     0 B        0   0 B      0     28 GiB
pool01                  2   32     0 B        0   0 B      0     28 GiB# 查询每个osd容量
[root@node1 ~]# ceph osd df 
ID  CLASS  WEIGHT   REWEIGHT  SIZE    RAW USE  DATA     OMAP     META     AVAIL    %USE  VAR   PGS  STATUS2    hdd  0.00980   1.00000  10 GiB  291 MiB  484 KiB      0 B  290 MiB  9.7 GiB  2.84  1.00   13      up4    hdd  0.00980   1.00000  10 GiB  291 MiB  484 KiB      0 B  290 MiB  9.7 GiB  2.84  1.00   12      up7    hdd  0.00980   1.00000  10 GiB  291 MiB  488 KiB      0 B  291 MiB  9.7 GiB  2.84  1.00    8      up1    hdd  0.00980   1.00000  10 GiB  291 MiB  488 KiB      0 B  291 MiB  9.7 GiB  2.84  1.00    7      up5    hdd  0.00980   1.00000  10 GiB  291 MiB  484 KiB      0 B  291 MiB  9.7 GiB  2.84  1.00   13      up8    hdd  0.00980   1.00000  10 GiB  291 MiB  488 KiB      0 B  290 MiB  9.7 GiB  2.84  1.00   13      up0    hdd  0.00980   1.00000  10 GiB  291 MiB  484 KiB      0 B  291 MiB  9.7 GiB  2.84  1.00   10      up3    hdd  0.00980   1.00000  10 GiB  291 MiB  484 KiB      0 B  291 MiB  9.7 GiB  2.84  1.00   15      up6    hdd  0.00980   1.00000  10 GiB  291 MiB  488 KiB      0 B  291 MiB  9.7 GiB  2.84  1.00    8      upTOTAL  90 GiB  2.6 GiB  4.3 MiB  8.5 KiB  2.6 GiB   87 GiB  2.84                   
MIN/MAX VAR: 1.00/1.00  STDDEV: 0

3、绑定存储池应用类型

  • 如果不绑定存储池类型的话,直接存储数据,ceph会告警

  • 应用类型值的就是提供何种存储业务,块存储(rbd),文件系统存储(cephfs),还是对象存储池(rgw)

  • 区分不同存储池的类型

# 给一个池子打上一个标签
[root@node1 ~]# ceph osd pool application enable pool01 rbd
enabled application 'rbd' on pool 'pool01'# 也可以一个池子有多个标签(但是没有应用场景)
[root@node1 ~]# ceph osd  pool application enable pool01 rgw --yes-i-really-mean-it
enabled application 'rgw' on pool 'pool01'
[root@node1 ~]# ceph osd pool ls detail 
pool 1 'device_health_metrics' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 1 pgp_num 1 autoscale_mode on last_change 45 flags hashpspool stripe_width 0 pg_num_max 32 pg_num_min 1 application mgr_devicehealth
pool 2 'pool01' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 48 flags hashpspool stripe_width 0 application rbd,rgw

4、移除存储的指定标签

# 有多个存储池的类型的话,就是使用--yes-i-really-mean-it 即可
[root@node1 ~]# ceph osd pool application disable pool01 rgw --yes-i-really-mean-it
disable application 'rgw' on pool 'pool01'
[root@node1 ~]# ceph osd pool  ls detail 
pool 1 'device_health_metrics' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 1 pgp_num 1 autoscale_mode on last_change 45 flags hashpspool stripe_width 0 pg_num_max 32 pg_num_min 1 application mgr_devicehealth
pool 2 'pool01' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 49 flags hashpspool stripe_width 0 application rbd

5、验证存储池是3副本

# 创建一个1M的文件
[root@node1 ~]# dd if=/dev/zero of=123.txt bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.000645748 s, 1.6 GB/s# 存储到池子里面去
[root@node1 ~]# rados -p pool01 put 123.txt ./123.txt
[root@node1 ~]# rados -p pool01 ls 
123.txt# 发现对象为1个,但是占用了3M的空间,证明这个pool01是3副本的规则
[root@node1 ~]# ceph df 
--- RAW STORAGE ---
CLASS    SIZE   AVAIL     USED  RAW USED  %RAW USED
hdd    90 GiB  87 GiB  2.6 GiB   2.6 GiB       2.85
TOTAL  90 GiB  87 GiB  2.6 GiB   2.6 GiB       2.85--- POOLS ---
POOL                   ID  PGS  STORED  OBJECTS   USED  %USED  MAX AVAIL
device_health_metrics   1    1     0 B        0    0 B      0     28 GiB
pool01                  2   32   1 MiB        1  3 MiB      0     28 GiB

4、存储池对象的管理

1、上传对象

# rados -p 存储池名 put 对象名 对象路径

2、下载对象

# rados -p 存储池名 get 对象名 对象路径

3、查看对象

# rados -p 存储池名 ls 

4、删除对象

# rados -p u存储名 rm 对象名

5、查询对象存储的OSD

  • ceph osd map pool01 对象名
# 先要查看到PG
[root@node1 ~]# ceph pg dump# 简略输出PG
[root@node1 ~]# ceph pg dump pgs_brief
PG_STAT  STATE         UP       UP_PRIMARY  ACTING   ACTING_PRIMARY
2.1f     active+clean  [4,3,8]           4  [4,3,8]               4
2.1e     active+clean  [7,5,3]           7  [7,5,3]               7# 都是以2开头的,因为这个池子的id是2
# [] 里面对应的就是OSD编号
# active+clean 干净可用的# 一共有32个PG
[root@node1 ~]# ceph pg dump pgs_brief | grep ^2 | wc -l
dumped pgs_brief
32# 去找一下,32个PG里面有数据
[root@node1 ~]# ceph pg dump | grep ^2 | awk '{print $1,$2}'# 上面的方法是最原始的方法,当数据多起来的时候,就不行了# ceph里面有查询pg,osd的方法
[root@node1 ~]# ceph osd map pool01 123.txt
osdmap e49 pool 'pool01' (2) object '123.txt' -> pg 2.613d0fb4 (2.14) -> up ([6,1,4], p6) acting ([6,1,4], p6)
[root@node1 ~]# 

5、存储池配额管理

1、配额方式

  • 对象数量配额

  • 容量配额

  • 限制这个存储池使用的空间

1、查询配额管理

[root@node1 ~]# ceph osd pool  get-quota  pool01
quotas for pool 'pool01':max objects: N/Amax bytes  : N/A# 输出都是N/A则没有开启配额
# max objects 没有开启对象配额
# max bytes 没有开启容量配额

2、设置对象配额

[root@node1 ~]# ceph osd pool  set-quota  pool01 max_objects 3
set-quota max_objects = 3 for pool pool01[root@node1 ~]# ceph osd pool  get-quota  pool01
quotas for pool 'pool01':max objects: 3 objects  (current num objects: 1 objects)max bytes  : N/A# 这个存储池最大存储个对象# 上传了三个对象之后,再要上传或者删除文件都会卡主
# 当配额满了之后,触发时,IO会被无限期的延长,直到配额不满足的时候,才行# 解决方法,扩展配额

3、解除对象配额

[root@node1 ~]# ceph osd pool set-quota pool01 max_objects 0
set-quota max_objects = 0 for pool pool01

4、容量配额

  • 当配额的对象的为容量时,只有存储池在上传对象的这一刻,没有达到配额,哪怕对象的容量达到了存储池配额,也能进行上传,但是下一次传输对象的话,就会传不上去,因为,达到了对象配额最大了
# 设置10M
[root@node1 ~]# ceph osd pool  set-quota pool01 max_bytes 10M
set-quota max_bytes = 10485760 for pool pool01[root@node1 ~]# ceph osd pool get-quota  pool01
quotas for pool 'pool01':max objects: 3 objects  (current num objects: 1 objects)max bytes  : 10 MiB  (current num bytes: 1048576 bytes)[root@node1 ~]# ceph osd pool set-quota pool01 max_bytes 0
set-quota max_bytes = 0 for pool pool01
[root@node1 ~]# ceph osd pool  get-quota pool01
quotas for pool 'pool01':max objects: N/Amax bytes  : N/A

6、存储池操作

1、修改存储池重命名

  • 重命名不会影响对象在OSD上面的移动

  • 因为独有的存储池的ID不会发生变化,对应的PG也不会发生变化(分裂,合并)

  • 存储池的名字不会影响存储池的PG

  • 当PG发生分裂或者合并的话,就会影响对象

  • 存储池改名,会对上层的业务有一定的影响,如果ceph对接了openstack或者k8s的话,则需要修改配置文件

[root@node1 ~]# ceph osd pool rename pool01 cloud
rpool 'pool01' renamed to 'cloud'
[root@node1 ~]# ceph osd pool ls 
device_health_metrics
cloud

7、存储池的快照

  • 几乎上没有用到

  • 存储池基于对象层的快照,也就是为每一个对象拍摄快照

  • 快照也是存储在存储池中的

1、创建快照

[root@node1 ~]# ceph osd pool mksnap cloud snap1
created pool cloud snap snap1

2、查看快照

# 查看有几个快照
rados -p 存储池 lssnap[root@node1 ~]# rados -p cloud lssnap
1	snap1	2024.12.06 09:21:29
1 snaps# 查看快照中的内容
rados -p 存储池 -s 快照名 ls [root@node1 ~]# rados -p cloud -s snap1 ls
selected snap 1 'snap1'
123.txt

3、还原快照

  • 非常的鸡肋,删除了一个对象,但是查看的时候,还是有这个对象,只是下载不过来,因为这个是快照的对象

  • 手动还原的话,就是将这个快照中对象下载到本地,然后重新上传到存储池中

[root@node1 ~]# rados -p cloud rm 123.txt# 删除了也还只是有一个对象,因为这个是快照里面的
[root@node1 ~]# rados -p cloud ls 
123.txt# 下载的时候报错了
[root@node1 ~]# rados -p cloud get 123.txt 123.txt
error getting cloud/123.txt: (2) No such file or directory# 然后基于这个快照下载这个对象,然后上传这个对象
[root@node1 ~]# rados -p cloud -s snap1 get 123.txt 123.txt
selected snap 1 'snap1'
[root@node1 ~]# ls
123.txt  anaconda-ks.cfg  ceph.pub[root@node1 ~]# rados -p cloud put 123.txt 123.txt 
[root@node1 ~]# rados -p cloud ls 
123.txt# 前面是对象名,后面是下载到本地的对象名
[root@node1 ~]# rados -p cloud get 123.txt 1.txt
[root@node1 ~]# ls
123.txt  1.txt  anaconda-ks.cfg  ceph.pub

4、一键还原快照

  • 直接将快照中的对象还原到存储池中

[root@node1 ~]# rados -p cloud rm 123.txt
[root@node1 ~]# rados -p cloud ls 
123.txt
[root@node1 ~]# rados -p cloud rollback 123.txt snap1
rolled back pool cloud to snapshot snap1
[root@node1 ~]# rados -p cloud ls 
123.txt
[root@node1 ~]# rados -p  cloud get 123.txt 2.txt
[root@node1 ~]# ls
123.txt  1.txt  2.txt  anaconda-ks.cfg  ceph.pub

5、删除快照

rados -p cloud rmsnap snap1
[root@node1 ~]# rados -p cloud lssnap
0 snaps

6、快照总结

  • 生产中,上面的2个方式都没有使用,因为这些东西没有可控性

  • 一般是基于应用进行快照,基于RBD快照,基于文件系统快照,基于对象存储备份或者是双活

6、配置存储池的中的参数

1、查看存储池所有参数

[root@node1 ~]# ceph osd pool get cloud all
size: 3   # 副本数量为3个,存储池规则
min_size: 2   # 最少是2个副本数量
pg_num: 32
pgp_num: 32
crush_rule: replicated_rule  # 存储池类型
hashpspool: true
nodelete: false  # 这个存储池没有被保护,也就是可以删除
nopgchange: false
nosizechange: false
write_fadvise_dontneed: false
noscrub: false
nodeep-scrub: false
use_gmt_hitset: 1
fast_read: 0
pg_autoscale_mode: on  # PG会自动扩展
bulk: false# 查看指定类型参数
[root@node1 ~]# ceph osd pool  get cloud size
size: 3

2、设置存储池参数

# 设置一个PG对应2个副本
[root@node1 ~]# ceph osd pool set cloud size 2# 改成2的话,数据就会缩容,扩展的话,会增加的数据的,也就是复制的数据而已,副本之间的复制即可
[root@node1 ~]# ceph pg dump pgs_brief 
PG_STAT  STATE         UP       UP_PRIMARY  ACTING   ACTING_PRIMARY
2.1f     active+clean    [4,3]           4    [4,3]               4
2.1e     active+clean    [7,5]           7    [7,5]               7
2.1d     active+clean    [8,3]           8    [8,3]               8
2.1c     active+clean    [8,3]           8    [8,3]               8

3、PG数量调整

  • PG数量调大的话
    • 如果存储池中的PG的对象较多的话,则调大PG,会引起PG的分裂,在新的OSD上产生新的PG,对象复制到新的PG中

    • 存储中PG对象较少,则直接产生新的PG,不会造成数据的移动

    • 在存储池中,不要随意调整PG的数量,由MGR的pg自我扩展数量来调整

# 设置PG参数
# 将PG数量增加即可
[root@node1 ~]# ceph osd pool set cloud pg_num 35
set pool 2 pg_num to 35
[root@node1 ~]# ceph osd pool get cloud all
size: 2
min_size: 1
pg_num: 35
pgp_num: 35   # 自动的就行调整
crush_rule: replicated_rule
hashpspool: true
nodelete: false# 35个PG
[root@node1 ~]# ceph pg dump pgs_brief | grep ^2 |wc -l
dumped pgs_brief
35# 扩容PG数量,PG中的对象会进行移动,在新的OSD上生成一个PG
# 就是虽然扩展了PG数量,但是了原始的OSD还是没有变,那么根据crush算法,要算出新的PG与OSD的映射关系,进行重新的平衡

3、保护存储池

[root@node1 ~]# ceph osd pool set cloud nodelete true
set pool 2 nodelete to true
[root@node1 ~]# ceph osd pool get cloud all
size: 2
min_size: 1
pg_num: 35
pgp_num: 35
crush_rule: replicated_rule  # 复制池
hashpspool: true
nodelete: true  # 设置存储池不能被删除
nopgchange: false
nosizechange: false
write_fadvise_dontneed: false
noscrub: false
nodeep-scrub: false
use_gmt_hitset: 1
fast_read: 0
pg_autoscale_mode: on
bulk: false

7、PG核心规则

1、pg扩容情况

  1. 扩容PG,PG对象数量较多的情况

    • PG 对象较多时,扩容 PG 会导致 PG 分裂,即现有 PG 被拆分成多个更小的 PG,新生成的 PG 会分布到不同的 OSD 上,可能需要移动数据以保持副本的一致性。
  2. 缩容PG,PG对象数量较少的情况

    • PG 对象较少时,扩容 PG 不会导致数据的迁移,而是直接创建新的 PG,不涉及数据的重新分配。
  3. 体现了数据负载均衡能力和容错能力,能在合适的时机对PG进行分裂或者扩展

  4. 图解
    画pg分为2个,然后数据进行迁移

  5. 扩容PG

  • 直接扩容PG的话,PG会进行分裂,那么PG中的对象需要消耗一定计算和带宽资源,因为PG分裂的话,所对应的新的PG和OSD之间的映射关系有CRUSH算法算出来,然后那些OSD的数据进行复制移动到新的OSD上面,这样的话就需要消耗一点的资源

  • 因此的话,扩容PG在业务的低谷进行

  1. 扩容PGP
  • 3个PG对应3个pgp,扩容PGP的话,不会影响原来的PG与OSD的映射关系

  • 当对象来存储的话,将会存储到新的PG在OSD上面的分布(当有新的PG的话),会影响后来新创建的PG

  • 新创建的pg会有新的排列组合方式,就会使用这种新的排列方式

img

  • 一般来说的话,现在就是自动扩展的

2、pg自我扩展模式

  • 根据这个mgr中的模块可以实现自我扩展,N版本,默认就是开启的
# 关掉扩展模式
[root@node1 ~]# ceph osd pool set cloud pg_autoscale_mode off
set pool 2 pg_autoscale_mode to off# 开启扩展模式
[root@node1 ~]# ceph osd pool set cloud pg_autoscale_mode on
set pool 2 pg_autoscale_mode to on
[root@node1 ~]# ceph osd pool get cloud all
size: 2
min_size: 1
pg_num: 32
pgp_num: 32
crush_rule: replicated_rule
hashpspool: true
nodelete: true
nopgchange: false
nosizechange: false
write_fadvise_dontneed: false
noscrub: false
nodeep-scrub: false
use_gmt_hitset: 1
fast_read: 0
pg_autoscale_mode: on
bulk: false

8、存储池中的命令空间

1、命名空间概念

2、命名空间查看

# 前面为空的话,就是默认的命名空间
[root@node1 ~]# rados -p cloud ls --allpasswd# 上传对象的时候,可以使用-N,命名空间的名字
[root@node1 ~]# rados -p cloud put group /etc/group -N group1
[root@node1 ~]# rados -p cloud ls --allpasswd
group1	group# 查看指定命名空间的对象
[root@node1 ~]# rados -p cloud ls -N group1
group# 查看的时候以json格式输出
[root@node1 ~]# rados -p cloud ls --all --format=json
[{"namespace":"","name":"passwd"},{"namespace":"group1","name":"group"}][root@node1 ~]# 
  • 命名空间在ceph原生应用(librados),用户相册,使用这个可以进行隔离

9、删除存储池

1、必要条件

  • monitor要允许删除存储池

  • 存储池没有被保护

# 允许删除monitor删除存储池
[root@node1 ceph]# ceph config set mon mon_allow_pool_delete true# 关掉存储池的保护
[root@node1 ceph]# ceph osd pool set cloud nodelete false
set pool 2 nodelete to false# 删掉存储池
[root@node1 ceph]# ceph osd pool delete cloud  cloud --yes-i-really-really-mean-it
pool 'cloud' removed

10、纠删码池

1、纠删码池

  • 和复制池一样,都是为ceph提供存储池的冗余性,与复制池比较的话,拥有更大存储利用率,同样是三个副本的场景中,复制池可以用33%的利用率,但是纠删码池的话,有75%的利用率,这个就是纠删码池的性价比,在海量存储池使用纠删码池来提供业务

  • n=k+m,n指的就是数据块+编码块的总数 (也就是一个对象要切成多少个块才行)

  • k 数据块个数,将一个对象切分成多少个数据块

  • m 编码个数,切分出来的数据块生成多少个编码块

  • 任意个m恢复任意个K,因此在纠删码池中,m决定了存储池的冗余性,决定了能够丢失多少个块,而不是丢失数据

  • 3个副本,一个文件大小为3M的话,存储的方式为1M+1M+1M+1M+1M 即可,因为要分成3个块,每一个块的大小为1M

2、纠删码池的工作原理

img

  • 在被切成片的时候,还需要再次切成块进行存储

3、纠删码池的创建

# 存储池的类型
[root@node1 ceph]# ceph osd pool create pool01 erasure
pool 'pool01' created# 查看详细情况
[root@node1 ceph]# ceph osd pool ls detail 
pool 1 'device_health_metrics' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 1 pgp_num 1 autoscale_mode on last_change 57 flags hashpspool stripe_width 0 pg_num_max 32 pg_num_min 1 application mgr_devicehealth
pool 3 'pool01' 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 98 flags hashpspool stripe_width 8192

4、查看纠删码池的规则

# 查看所有纠删码规则
[root@node1 ceph]# ceph osd erasure-code-profile ls
default# 查看纠删码的详细规则
[root@node1 ceph]# ceph osd erasure-code-profile get default
k=2  # 数据块个数
m=2  # 纠删码块个数
plugin=jerasure  # 使用的插件
technique=reed_sol_van# 如果n=4的话,则4个块会选择4台不同的主机,也就是故障域为主机

5、刚创建出来的纠删码池,为什么不可用

[root@node1 ceph]# ceph -s cluster:id:     47a615ea-b2dc-11ef-a364-000c29679dd7health: HEALTH_WARNDegraded data redundancy: 32 pgs undersizedservices:mon: 3 daemons, quorum node1,node2,node3 (age 7h)mgr: node1.ajdllh(active, since 7h), standbys: node2.gkqxdyosd: 9 osds: 9 up (since 7h), 9 in (since 23h)data:pools:   2 pools, 33 pgsobjects: 0 objects, 0 Busage:   2.6 GiB used, 87 GiB / 90 GiB availpgs:     32 active+undersized1  active+clean[root@node1 ceph]# ceph pg dump pgs_brief 
PG_STAT  STATE              UP                  UP_PRIMARY  ACTING              ACTING_PRIMARY3.1f     active+undersized  [2,0,1,2147483647]           2  [2,0,1,2147483647]               2
3.1e     active+undersized  [2,5,2147483647,3]           2  [2,5,2147483647,3]               2
3.1d     active+undersized  [5,0,2147483647,4]           5  [5,0,2147483647,4]               5
3.1c     active+undersized  [6,2147483647,7,1]           6  [6,2147483647,7,1]               6
3.1b     active+undersized  [1,3,2147483647,7]           1  [1,3,2147483647,7]               1
3.1a     active+undersized  [1,4,3,2147483647]           1  [1,4,3,2147483647]               1# 最后一个OSD没有主机选择,所以故障了[root@node1 ceph]# ceph osd erasure-code-profile get default
k=2
m=2
plugin=jerasure
technique=reed_sol_van# n=4的话,4个块就会分布在4台主机上面,所以的话,最后一个块没有主机选择,所以就会故障# 默认的域是主机,4个主机,不符合,所以就会发生故障

6、自定义纠删码规则

  • 编写一个profile
[root@node1 /]# ceph osd erasure-code-profile set ecdemo k=3 m=2  crush-failure-domain=osd
[root@node1 /]# ceph osd erasure-code-profile ls 
default
ecdemo
[root@node1 /]# ceph osd erasure-code-profile get ecdemo
crush-device-class=
crush-failure-domain=osd
crush-root=default
jerasure-per-chunk-alignment=false
k=3
m=2
plugin=jerasure
technique=reed_sol_van
w=8 # 一个编码块可以允许8个数据块# 故障域为5的话,就是切成块分布在5个OSD上面即可,就不会报错了# ecdemo  纠删码的名称
# k=3 3个数据块,m=2 就是2个纠删块# 创建纠删码池
[root@node1 /]# ceph osd pool create pool01 erasure ecdemo
cpool 'pool01' created# 这样的话,就不会报错了,创建的5个数据块,会分布在5个不同的OSD上面即可
[root@node1 /]# ceph pg dump pgs_brief 
PG_STAT  STATE         UP           UP_PRIMARY  ACTING       ACTING_PRIMARY
5.1f     active+clean  [3,6,0,8,1]           3  [3,6,0,8,1]               3
5.1e     active+clean  [7,3,5,4,2]           7  [7,3,5,4,2]               7
5.1d     active+clean  [4,2,6,5,1]           4  [4,2,6,5,1]               4
5.1c     active+clean  [0,1,2,5,6]           0  [0,1,2,5,6]               0
5.1b     active+clean  [0,7,3,1,8]           0  [0,7,3,1,8]               0
5.1a     active+clean  [1,0,2,6,7]           1  [1,0,2,6,7]               1#	k:在不同 OSD 之间拆分的数据区块数量。默认值为 2。
#	m:数据变得不可⽤之前可以出现故障的 OSD 数量。默认值为 1。
#	plugin: 此可选参数定义要使⽤的纠删代码算法。
#	crush-failure-domain:CRUSH 故障域,默认设置为 host
#	crush-device-class: 典型的类别可能包括 hdd、ssd 或nvme。
#	crush-root:此可选参数设置 CRUSH 规则集的根节点。
#	key=value: 插件可以具有对该插件唯⼀的键值参数。
#  technique:每个插件提供⼀组不同的技术来实施不同的算法。

7、纠删码推荐的关系

  1. k和m的关系

    • k值大的话,表示可以使用存储利用率比较的高

    • 利用率的话, k/(k+m)

    • M值大的话,表示冗余率就高

8、删除纠删码规则

# 因此的话,存储池使用该规则的时候,不能被删除
[root@node1 /]# ceph osd erasure-code-profile rm ecdemo
Error EBUSY: pool01 pool(s) are using the erasure code profile 'ecdemo'

9、profile规则

  • 也就是存储池在使用这个规则的时候,不能删除,更改,或者替换成其他的规则

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/485289.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

知从科技闪耀汽车智能底盘大会:共探软件安全新篇章

在汽车科技蓬勃发展的浪潮中&#xff0c;智能底盘技术正成为引领行业变革的关键力量。11月27日-28日&#xff0c;盖世汽车 2024 第四届汽车智能底盘大会盛大召开&#xff0c;上海知从科技有限公司受邀出席此次盛会&#xff0c;与众多汽车领域的精英齐聚一堂&#xff0c;共话智能…

STM32-C语言基础知识

C语言基础知识 stdint.h简介 给寄存器某个位赋值 给位6赋值为1流程&#xff1a;先清0&#xff0c;再赋值 带参数的宏定义 建议使用do {…}while(0)来构造宏定义 条件编译 条件编译后面必须跟宏语句&#xff0c;如#if _LED_H 指针使用常见的2大问题 1、未初始化 2、越界使…

专业140+总分420+上海交通大学819考研经验上交电子信息与通信工程,真题,大纲,参考书。博睿泽信息通信考研论坛,信息通信考研Jenny

考研结束&#xff0c;专业819信号系统与信号处理140&#xff0c;总分420&#xff0c;终于梦圆交大&#xff0c;高考时敢都不敢想目标&#xff0c;现在已经成为现实&#xff0c;考研后劲很大&#xff0c;这一年的复习经历&#xff0c;还是历历在目&#xff0c;整理一下&#xff…

Python 调用 Umi-OCR API 批量识别图片/PDF文档数据

目录 一、需求分析 二、方案设计&#xff08;概要/详细&#xff09; 三、技术选型 四、OCR 测试 Demo 五、批量文件识别完整代码实现 六、总结 一、需求分析 市场部同事进行采购或给客户报价时&#xff0c;往往基于过往采购合同数据&#xff0c;给出现在采购或报价的金额…

MySQL用法---MySQL Workbench创建数据库和表

1. 连接数据库 打开软件&#xff0c;点击左下角卡片&#xff0c;输入设置的数据库密码&#xff0c;勾选单选框 2. 了解主页面的组成部分 3. 创建数据库 先点击工具栏的创建按钮 再输入数据库名称 点击 Apply 创建 4. 创建数据表 展开数据库&#xff0c;在Tables上右键&…

Leecode刷题C语言之可以被进一步捕获的棋子数

执行结果:通过 执行用时和内存消耗如下&#xff1a; 代码如下&#xff1a; int numRookCaptures(char** board, int boardSize, int* boardColSize) {int cnt 0, st 0, ed 0;int dx[4] {0, 1, 0, -1};int dy[4] {1, 0, -1, 0};for (int i 0; i < 8; i) {for (int j…

Python、R循环神经网络RNN、指数平滑ETS、ARIMA模型预测网络流量、ATM机取款、旅游需求时间序列数据...

全文链接&#xff1a;https://tecdat.cn/?p38496 分析师&#xff1a;Pengyuan Wen 在当今经济研究与商业决策领域&#xff0c;精准的时间序列预测具有极为关键的意义。社会消费品零售总额作为反映人民消费水平以及国民经济状况的核心指标&#xff0c;其发展趋势的精准把握对中…

第二篇:k8s工作流程

我们来看通过deployment部署pod的常规流程&#xff1a; kubectl向apiserver发送部署请求&#xff08;例如使用 kubectl create -f deployment.yml&#xff09;apiserver将 Deployment 持久化到etcd&#xff1b;etcd与apiserver进行一次http通信。controller manager通过watch a…

DevOps系统设计和技术选型

命名是一件痛苦的事情&#xff0c;除非你不想要一个好名字。 我正在做的这个管理系统叫什么合适&#xff0c;或者是什么类型的系统&#xff0c;想去想来不知所措&#xff0c;后来想想这么小的东西纠结什么&#xff0c;先从小的细节一点点来&#xff0c;能用就行&#xff0c;就用…

大模型基础环境部署之二:安装CUDA(详细实操版)

在完成 Nvidia 驱动的安装之后&#xff0c;接下来进行 CUDA 的安装以及版本确认。 一、安装 CUDA 1、运行 CUDA 安装程序 /mnt/data/Nvidia/CUDA# ./cuda_12.1.0_530.30.02_linux.run在安装过程中&#xff0c;确保不要选择安装驱动&#xff0c;以免覆盖已经安装好的 Nvidia …

在 Ansys Mechanical 中使用命名选择

介绍 在设置模型时&#xff0c;我通常会使用几何选择选项来确定边界条件、载荷、材料属性和模型的其他重要方面的范围。 这对于没有很多面或身体的小模型来说已经足够好了。随着我的模型变得越来越大和越来越复杂&#xff0c;单击确定边界条件和材料属性的范围变得很乏味&…

【Elasticsearch】实现气象数据存储与查询系统

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

精密制造中智能扭矩系统的关键作用

【大家好&#xff0c;我是唐Sun&#xff0c;唐Sun的唐&#xff0c;唐Sun的Sun。】 电子、半导体、医疗器械等精密制造行业对于产品质量和性能的要求达到了前所未有的高度。在这一背景下&#xff0c;智能扭矩系统成为了确保零部件装配高精度和一致性的关键要素&#xff0c;对提升…

使用mtools搭建MongoDB复制集和分片集群

mtools介绍 mtools是一套基于Python实现的MongoDB工具集&#xff0c;其包括MongoDB日志分析、报表生成及简易的数据库安装等功能。它由MongoDB原生的工程师单独发起并做开源维护&#xff0c;目前已经有大量的使用者。 mtools所包含的一些常用组件如下&#xff1a; mlaunch支…

软件测试最新项目合集【商城、外卖、银行、金融等等.......】

项目一&#xff1a;ShopNC商城 项目概况&#xff1a; ShopNC商城是一个电子商务B2C电商平台系统&#xff0c;功能强大&#xff0c;安全便捷。适合企业及个人快速构建个性化网上商城。 包含PCIOS客户端Adroid客户端微商城&#xff0c;系统PC后台是基于ThinkPHP MVC构架开发的跨…

Artec Leo 3D扫描仪 革新家具行业的数字化展示【沪敖3D】

随着科技的飞速进步&#xff0c;三维扫描技术已被广泛应用于包括家居行业在内的多个行业。面对现代消费者对家居产品日益增长的个性化和多样化需求&#xff0c;传统的家居设计和展示方法已难以满足市场需求。三维扫描技术的出现&#xff0c;为家居行业带来了新的发展机遇&#…

爬虫项目基础知识详解

文章目录 Python爬虫项目基础知识一、爬虫与数据分析1.1 Python中的requests库Requests 库的安装Requests 库的 get() 方法爬取网页的通用代码框架HTTP 协议及 Requests 库方法Requests 库主要方法解析 1.2 python中的json库1.3 xpath学习之python中lxml库html了解html结构html…

Tomcat,javaweb, servlet , springBoot

在server.xml里配置服务器 <scope>provided</scope>打包的时候&#xff0c;这个jar包不会被打进去&#xff0c;因为tomcat已将封装了这个jar包&#xff0c;没必要要这个

棋牌项目Go的日志打印问题

棋牌项目Go的日志打印问题 项目使用 go work 管理模块 github.com/spf13/viper 通过 application.yml 加载配置 $ tree . ├── README.md ├── common │ ├── application.yml │ ├── config │ │ └── config.go │ ├── go.mod │ ├── go.su…

【Linux操作系统】多线程控制(创建,等待,终止、分离)

目录 一、线程与轻量级进程的关系二、进程创建1.线程创建线程创建函数&#xff08;pthread&#xff09;查看和理解线程id主线程与其他线程之间的关系 三、线程等待&#xff08;回收&#xff09;四、线程退出线程退出情况线程退出方法 五、线程分离线程的优点线程的缺点 一、线程…