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.xdnf.cn/news/35838.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Ollama记录

先在官网下载Ollama 模型下载 ollama run qwen2:0.5b 可以快速部署很多模型 方便 可以替换openai api key from openai import OpenAIclient OpenAI(base_url https://127.0.0.1:11434/v1,api_keyollama, # required, but unused )response client.chat.completions.…

锻造船用发动机动力系统,铸强船舶“心脏”

船舶是海洋、湖泊及河流中重要的水上交通工具&#xff0c;不仅能够促进海上经济的发展&#xff0c;还能够保卫国家的制海权。船舶动力装置&#xff0c;也就是船舶的核心动力源——船用发动机动力系统对船舶的重要作用不言自明&#xff0c;关系到船舶的性能质量&#xff0c;能够…

LIN状态管理

文章目录 前言一、状态管理二、实现过程三、response_error信号的变化条件四、节点内部报告五、测试应用方式1&#xff1a;LIN ISC方式2&#xff1a;CAPL脚本方式 前言 在LIN专栏的文章中&#xff0c;我们介绍了 LIN的网络管理&#xff1a;LIN网络管理&#xff1a;休眠&唤…

云帆在线学习考试系统对国产化数据库的支持情况说明

云帆在线学习考试系统对国产化数据库的支持情况说明 云帆学习考试系统是一款优秀的学习和考试系统&#xff01;多年以来一直深耕在线教育板块&#xff0c;积累了丰富的行业经验&#xff0c;多年来的产品和技术沉淀&#xff0c;服务了众多政府机构、知名高校、企事业单位。 今…

反向传播算法中的误差项

背景 在反向传播算法中&#xff0c;我们需要计算每个神经元的误差项&#xff0c;以便更新网络中的权重。对于输出层的神经元&#xff0c;误差项的计算公式如下&#xff1a; 其中&#xff1a; E是损失函数&#xff08;例如均方误差&#xff09;。 zk 是输出层神经元的加权输入&a…

如何高效整合金蝶云星辰采购入库单与聚水潭系统

星辰-采购入库单集成到聚水潭的技术实现 在企业信息化管理中&#xff0c;数据的高效流转和准确对接至关重要。本文将分享一个实际案例&#xff1a;如何通过轻易云数据集成平台&#xff0c;将金蝶云星辰V2系统中的采购入库单数据无缝集成到聚水潭系统中&#xff0c;实现业务流程…

Uniapp的App环境下使用Map获取缩放比例

概述 目前我试过的就是你用vue后缀是拿不到比例的你可以用nvue当然uniapp的uvue应该是更加可以的我使用的是高德所以你得在高德的后台声请原生的Android的key才可以如果是vue3的开发模式的话不用使用this来获取当前对象使用scale对象来接受和改变缩放比例会比较友好然后直接走…

C++入门项目:Linux下C++轻量级Web服务器 项目详解(小白篇)

拿到一个项目首先先跑通&#xff0c;然后再慢慢来看代码&#xff0c;关于怎么将这个项目跑通&#xff0c;上一篇已经讲过&#xff0c;感兴趣的小伙伴可以移步下面的链接&#xff0c;或者其他博主的教程。 C入门项目&#xff1a;Linux下C轻量级Web服务器 跑通|运行|测试&#xf…

RuoYi集成Drools,并实现数据库获取规则

Drools是一个开源的业务规则管理系统&#xff08;BRMS&#xff09;和规则引擎&#xff0c;它允许开发者以接近自然语言的形式定义业务规则&#xff0c;并将这些规则应用到应用程序中&#xff0c;实现业务逻辑的自动化和决策过程的优化。Drools基于Java语言开发&#xff0c;使用…

什么是API接口?如何调用API接口?

一、什么是 API 接口 定义 API&#xff08;Application Programming Interface&#xff09;即应用程序编程接口。它是一组定义好的规则和协议&#xff0c;允许不同的软件应用程序之间进行通信和交互。可以把 API 想象成是餐厅的服务员&#xff0c;当顾客&#xff08;一个软件应…

BurpSuite-6(验证码识别)

声明&#xff1a;学习视频来自b站up主 泷羽sec&#xff0c;如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 视频地址&#xff1a;burp(6)暴力破解与验证码识别绕过_哔哩哔哩_bilibili 一、下载 github地址&#xff1a;GitHub - f0ng/captcha-killer-modified: captcha-killer…

【JavaEE】多线程(7)

一、JUC的常见类 JUC→java.util.concurrent&#xff0c;放了和多线程相关的组件 1.1 Callable 接口 看以下从计算从1加到1000的代码&#xff1a; public class Demo {public static int sum;public static void main(String[] args) throws InterruptedException {Thread …

Go 程序编译的步骤

Go程序编译的步骤 词法分析&#xff08;Lexical Analysis&#xff09; Go编译器首先对源代码进行词法分析&#xff0c;将代码拆分成标记&#xff08;tokens&#xff09;&#xff0c;这些标记是编程语言的最小单位&#xff0c;如关键字、变量名、操作符等。 作用&#xff1a;生…

SD-WAN服务商应该怎么挑选?

随着企业对高效、灵活网络的需求不断增长&#xff0c;SD-WAN技术逐渐成为市场热点。然而&#xff0c;面对众多服务商的多样化方案&#xff0c;如何选择最适合自己企业的服务商是一个重要的问题。SD-WAN服务商之间在技术、功能和服务等方面存在差异&#xff0c;企业需要根据自身…

三相LCL并网逆变器--仿真验证

根据前面的博客的讲解&#xff0c;确定主电路参数如下 名称/单位 值 名称/单位 值 额定功率P/kW 20 开关频率fsw/kHz 10 母线电压Udc/V 720 逆变器侧电感L1/mH 1.8 额定电流Ireated/A 30 并网测电感L2/mH 0.4 PCC电压/Us/V 220 滤波电容C/uF 4.7 电网频率f…

基于SpringBoot+Vue的服装生产管理系统-无偿分享 (附源码+LW+调试)

目录 1. 项目技术 2. 功能菜单 3. 部分功能截图 4. 研究背景 5. 设计原则 6. 可行性分析 6.1 技术可行性 6.2 经济可行性 6.3 操作可行性 7. 系统设计 7.1 系统流程和逻辑 7.2 系统结构 8. 数据库设计 8.1 数据库ER图 &#xff08;1&#xff09;管理员实体属性图…

告别充电焦虑:移动充电机器人的革命性解决方案

移动充电机器人作为新能源汽车领域的黑科技&#xff0c;正逐渐崭露头角。它的出现为电动汽车充电带来了全新的解决方案&#xff0c;解决了传统充电方式的诸多痛点。 新能源汽车具有诸多优点&#xff0c;如科技含量高、噪音小、使用成本低等&#xff0c;但 “续航焦虑”“充电焦…

【启明智显分享】ESP32-P4方案4.3寸触摸屏来袭!支持MIPI CSI摄像头接口

家人们&#xff0c;你们一直在等的ESP32-P4方案4.3寸触摸屏它来了&#xff01; 启明智显全新推出的ESP32-P4 4.3寸IPS触摸屏&#xff0c;搭载强大的双核400MHz RISC-V处理器&#xff0c;配备32MB PSRAM和16MB FLASH&#xff0c;分辨率800*480&#xff0c;性能和视觉体验再次突…

国内管理咨询公司哪家落地辅导做的好?

在当今快速变化的市场环境中&#xff0c;企业面临着前所未有的竞争压力与转型挑战。为了在这场没有硝烟的战争中脱颖而出&#xff0c;许多企业开始寻求外部专业力量的帮助&#xff0c;以期通过科学的管理咨询实现战略升级和业绩突破。而在众多的管理咨询公司中&#xff0c;思博…