1、存储池
1、存储池的概念
- 存储池就是ceph的逻辑分区,专门用来存储对象的
-
特点
-
将文件切片成对象,通过hash算法,找到存储池中的pg,池中的pg根据crush算法找到osd节点
-
存储中的PG数量对性能有重要的影响,过多和过少都不行(前面第一章讲了的),超过了一定的数量后,禁止创建存储池
-
访问级别,不同用户对于同一个存储池有不同的权限
-
2、存储的类型
-
冗余池
- 提供数据冗余性,让数据不容易丢失,就是写入多份的意思
-
缓存池(加速池)
- 为数据的读写实现加速(在冗余池前面挂载一个缓存池,作为加速池,后面的R版本的被弃用了)
-
根据冗余性分类的话
-
分为复制池
-
纠删码池
-
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扩容情况
-
扩容PG,PG对象数量较多的情况
- PG 对象较多时,扩容 PG 会导致 PG 分裂,即现有 PG 被拆分成多个更小的 PG,新生成的 PG 会分布到不同的 OSD 上,可能需要移动数据以保持副本的一致性。
-
缩容PG,PG对象数量较少的情况
- PG 对象较少时,扩容 PG 不会导致数据的迁移,而是直接创建新的 PG,不涉及数据的重新分配。
-
体现了数据负载均衡能力和容错能力,能在合适的时机对PG进行分裂或者扩展
-
图解
画pg分为2个,然后数据进行迁移 -
扩容PG
-
直接扩容PG的话,PG会进行分裂,那么PG中的对象需要消耗一定计算和带宽资源,因为PG分裂的话,所对应的新的PG和OSD之间的映射关系有CRUSH算法算出来,然后那些OSD的数据进行复制移动到新的OSD上面,这样的话就需要消耗一点的资源
-
因此的话,扩容PG在业务的低谷进行
- 扩容PGP
-
3个PG对应3个pgp,扩容PGP的话,不会影响原来的PG与OSD的映射关系
-
当对象来存储的话,将会存储到新的PG在OSD上面的分布(当有新的PG的话),会影响后来新创建的PG
-
新创建的pg会有新的排列组合方式,就会使用这种新的排列方式
- 一般来说的话,现在就是自动扩展的
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、纠删码池的工作原理
- 在被切成片的时候,还需要再次切成块进行存储
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、纠删码推荐的关系
-
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规则
- 也就是存储池在使用这个规则的时候,不能删除,更改,或者替换成其他的规则