作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
目录一.纠删码理论概述
1.纠删码理论概述
纠删码(Enasure Coding,简称"EC")始于20世纪60年代,它是一种数据保护方法。
从原理上说,它将数据分割成片段,把冗余数据扩展,编码,并将其存储在不同的位置,比如磁盘,存储节点或者其他地理位置。
总数据块 = 原始数据块(包含原始数据切片及副本) + 校验块,常见表示为: "N = K + M"。
当冗余级别为N时,将这些数据块分别存储在N个硬盘上,这样就能容忍小于M个(假设初始数据有K个)硬盘发生故障。当磁盘不超过M个硬盘发生故障时,只需任意选取K个正常的数据块就能计算得到所有的原始数据。
在云存储中,我们通常会使用副本的方式来保证系统的可用性。问题是当存储达到PB级别后要求的容量将会非常高,通过纠删码技术可以保证相同可用性的情况下,节省大量存储空间,从而大大的降低TCO(总体成本)。
Ceph从Firefly(对应"0.80.11"版本,2014-05-01~2016-04-01)版本开始支持纠删码。
更多关于纠删码的了解,可参考前面基础教学RAID 5相关的理论说明。
官方文档:
https://docs.ceph.com/en/reef/rados/operations/erasure-code/
2.ceph纠删码以插件的形式提供
ceph纠删码实现了高速的计算,但有两个缺点:速度慢,只支持对象的部分操作。ceph中ES编码是以插件的形式来提供的。
ES编码有三个指标: 空间利用率,数据可靠性和恢复效率。
Ceph提供以下几种纠删码插件: clay(coupled-layer),jerasure,lrc,shec,isa等。
- jerasure:
最为通用的和灵活的纠删码插件,它也是纠删码池默认使用的插件,任何一个OSD成员的丢失,都需要余下的所有OSD成员参与恢复过程。
使用此类插件时,管理员还可以通过technique选项指定要使用的编码技术:
- reed_sol_van:
最灵活的编码技术,管理员仅需提供K和M参数即可。
- cauchy_good:
最快的编码技术,但需要小心设置PACKETSIZE参数。
- reed_sol_r6_op,liberation,blaum_roth或liber8tion:
仅支持使用m=2的编码技术,公特性类似于RAID 6。
- lrc:
全称为"Locally Repairable Erasure Code",即本地修复纠删码。
除了默认的M个编码块之外,它会额外在本地创建指定数量(l)的奇偶校验块,从而在一个OSD丢失时,可以仅通过l个奇偶校验块完成恢复。
- shec:
shec(k,m,l),k为数据块,m为校验块,l计算校验块时需要的数据块数量。
- isa:
仅支持运行在Intel CPU之上的纠删码插件,它支持reed_sol_van和cauchy两种技术。
3.纠删码池的优缺点
优点:
节省存储空间,当有对象数据损坏时,可以起到一定的冗余效果。
缺点:
仅支持对象存储,对于RBD存储则不支持。
生产环境如何选择呢:
- 如果是测试环境,且存储的是对象相关数据,则可以考虑使用纠删码池,必经可以节省一定的存储空间。
- 如果是生产环境,我个人建议还是使用多副本的池,纠删码池咱们了解即可,必经节省空间我们可以考虑使用压缩技术。
二.纠删码基础命令实践
1.列出纠删码配置文件
[root@ceph141 ~]# ceph osd erasure-code-profile ls
default
[root@ceph141 ~]#
2.查看指定纠删码配置文件的详细信息
[root@ceph141 ~]# ceph osd erasure-code-profile get default
k=2
m=2
plugin=jerasure
technique=reed_sol_van
[root@ceph141 ~]#
3.自定义纠删配置文件
1.创建自定义纠删配置文件(如果所需的体系结构必须承受两个OSD的丢失,并且存储开销为40%)
[root@ceph141 ~]# ceph osd erasure-code-profile set yinzhengjie-profile k=4 m=2 crush-failure-domain=osd
[root@ceph141 ~]#
2.查看纠删码配置文件列表
[root@ceph141 ~]# ceph osd erasure-code-profile ls
default
yinzhengjie-profile
[root@ceph141 ~]#
3.查看指定纠删码配置文件的详细信息
[root@ceph141 ~]# ceph osd erasure-code-profile get yinzhengjie-profile
crush-device-class=
crush-failure-domain=osd
crush-root=default
jerasure-per-chunk-alignment=false
k=4
m=2
plugin=jerasure
technique=reed_sol_van
w=8
[root@ceph141 ~]#
语法格式:
ceph osd erasure-code-profile set <name> [<directory=direcotry>] [<plugin=plugin>] [<crush-device-class-class=crush-device-class>] [<crush-failure-domain=crush-failure-domain>]
相关参数说明:
- directory:
加载纠删码插件的目录路径,默认为"/usr/lib/ceph/erasure-code"。
- plugin:
用于生成及恢复纠删码的插件名称,默认为"jerasure"。
- crush-device-class:
设备类别,例如hdd或者ssd,默认为none(即无视类别),我们可以通过crush来自定义实现。
- crush-failure-domain:
故障域,默认为host,支持使用包括: osd,host,rack,row,room等。
- --force:
强制覆盖现有的同名配置文件。
4.创建定制配置的纠删码池
[root@ceph141 ~]# ceph osd pool create erasure-pool-myprofile 8 8 erasure yinzhengjie-profile
pool 'erasure-pool-myprofile' created
[root@ceph141 ~]#
[root@ceph141 ~]# ceph osd pool ls detail | grep erasure-pool-myprofile
pool 12 'erasure-pool-myprofile' erasure profile yinzhengjie-profile size 6 min_size 5 crush_rule 1 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 418 lfor 0/0/416 flags hashpspool stripe_width 16384
[root@ceph141 ~]#
命令格式:
ceph osd pool create <pool-name> <pg-num> <pgp-num> erasure [coasure-code-profile] [cursh-rule-name] ...
温馨提示:
- 1.其中"erasure ... size 6"代表有有6(K+M)个OSD磁盘。
- 2.未指定要使用的纠删码配置文件时,创建命令会为其自动创建一个,并在创建相关的CURSH规则集时利用到它。
- 3.对于N版本的Ceph默认配置文件自动定义K=2和M=1,这意味着ceph将通过三个OSD扩展对象数据,并且可以丢失其中一个OSD而不会丢失数据。因此,在冗余效果上,它相当于一个大小为2的副本池,不过,其存储空间有效利用率为"2/3"而非"1/2"。
- 4.对于R版本的Ceph默认配置文件自动定义K=2,M=2。
5.基于插件定制就删码配置
1.基于纠删码算法定制专属配置(创建了一个使用lrc的配置文件"yinzhengjie-LRCprofile",其本地奇偶检验块为3,故障域为OSD。)
[root@ceph141 ~]# ceph osd erasure-code-profile set yinzhengjie-LRCprofile plugin=lrc k=4 m=2 l=3 crush-failure-domain=osd
[root@ceph141 ~]#
2.查看纠删码配置信息
[root@ceph141 ~]# ceph osd erasure-code-profile ls
default
yinzhengjie-LRCprofile
yinzhengjie-profile
[root@ceph141 ~]#
[root@ceph141 ~]# ceph osd erasure-code-profile get yinzhengjie-LRCprofile
crush-device-class=
crush-failure-domain=osd
crush-root=default
k=4
l=3
m=2
plugin=lrc
[root@ceph141 ~]#
3.创建定制配置的纠删码池
[root@ceph141 ~]# ceph osd pool create erasure-pool-lrcprofile 16 16 erasure yinzhengjie-LRCprofile
pool 'erasure-pool-lrcprofile' created
[root@ceph141 ~]#
4.查看效果
[root@ceph141 ~]# ceph osd pool ls detail | grep yinzhengjie-LRCprofile
pool 13 'erasure-pool-lrcprofile' erasure profile yinzhengjie-LRCprofile size 8 min_size 5 crush_rule 2 object_hash rjenkins pg_num 16 pgp_num 16 autoscale_mode on last_change 422 flags hashpspool,creating stripe_width 16384
[root@ceph141 ~]#
三.纠删码池的数据实践和异常实践
1.纠删码池数据实践
1.1 创建纠删码池并测试读写
1.创建纠删码池
[root@ceph141 ~]# ceph osd pool create jasonyin 16 16 erasure
pool 'jasonyin' created
[root@ceph141 ~]#
2.查看存储池
[root@ceph141 ~]# ceph osd pool ls detail | grep jasonyin
pool 14 'jasonyin' erasure profile default size 4 min_size 3 crush_rule 3 object_hash rjenkins pg_num 16 pgp_num 16 autoscale_mode on last_change 453 flags hashpspool stripe_width 8192
[root@ceph141 ~]#
3.往存储池上传文件
[root@ceph141 ~]# rados put hosts /etc/hosts -p jasonyin
[root@ceph141 ~]#
[root@ceph141 ~]# rados ls -p jasonyin
hosts
[root@ceph141 ~]#
4.下载文件
[root@ceph141 ~]# rados get hosts myhosts -p jasonyin
[root@ceph141 ~]#
[root@ceph141 ~]# cat myhosts
127.0.0.1 localhost
127.0.1.1 yinzhengjie
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
10.0.0.141 ceph141
10.0.0.142 ceph142
10.0.0.143 ceph143
172.30.100.142 www.yinzhengjie.com
[root@ceph141 ~]#
5.基于标准输入上传文件到存储池
[root@ceph141 ~]# echo "ABCDEFGHIJKLMNOPQRSTUVWXYZ" | rados -p jasonyin put uppercase.txt -
6.读取数据并输出到终端
[root@ceph141 ~]# rados ls -p jasonyin
hosts
uppercase.txt
[root@ceph141 ~]#
[root@ceph141 ~]# rados get uppercase.txt -p jasonyin -
ABCDEFGHIJKLMNOPQRSTUVWXYZ
[root@ceph141 ~]#
1.2 纠删码池不支持部分image功能
1.启用RBD功能
[root@ceph141 ~]# ceph osd pool application enable jasonyin rbd
enabled application 'rbd' on pool 'jasonyin'
[root@ceph141 ~]#
2.创建image操作
[root@ceph141 ~]# rbd create wordpress -p jasonyin -s 2048 # 很明显,创建rbd时无法自动指定镜像特性
2024-09-07T08:15:21.832+0800 7fb36bfff640 -1 librbd::image::ValidatePoolRequest: handle_overwrite_rbd_info: pool missing required overwrite support
2024-09-07T08:15:21.832+0800 7fb36bfff640 -1 librbd::image::CreateRequest: 0x562675e49260 handle_validate_data_pool: pool does not support RBD images
rbd: create error: (22) Invalid argument
[root@ceph141 ~]#
温馨提示:
纠删码池主要作用针对是对象,比如rgw使用纠删码池还是蛮多的,但是rbd用的并不多。因此就删码不支持RBD images的参数操作。
2.纠删码池异常实践
2.1 创建纠删码池
[root@ceph141 ~]# ceph osd erasure-code-profile get yinzhengjie-profile
crush-device-class=
crush-failure-domain=osd
crush-root=default
jerasure-per-chunk-alignment=false
k=4
m=2
plugin=jerasure
technique=reed_sol_van
w=8
[root@ceph141 ~]#
[root@ceph141 ~]# ceph osd pool create xixi 16 16 erasure yinzhengjie-profile
pool 'xixi' created
[root@ceph141 ~]#
[root@ceph141 ~]# ceph osd pool ls detail | grep xixi
pool 15 'xixi' erasure profile yinzhengjie-profile size 6 min_size 5 crush_rule 4 object_hash rjenkins pg_num 16 pgp_num 16 autoscale_mode on last_change 480 flags hashpspool stripe_width 16384
[root@ceph141 ~]#
2.2 上传测试文件,并查看对应的映射信息
[root@ceph141 ~]# rados put fstab /etc/fstab -p xixi
[root@ceph141 ~]#
[root@ceph141 ~]# rados ls -p xixi
fstab
[root@ceph141 ~]#
[root@ceph141 ~]# ceph osd map xixi fstab
osdmap e480 pool 'xixi' (15) object 'fstab' -> pg 15.45a53d91 (15.1) -> up ([3,1,2,0,4,5], p3) acting ([3,1,2,0,4,5], p3)
[root@ceph141 ~]#
2.3 根据映射信息停止映射的任意OSD节点
[root@ceph141 ~]# ceph orch daemon stop osd.5
Scheduled to stop osd.5 on host 'ceph143'
[root@ceph141 ~]#
[root@ceph141 ~]# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 1.46489 root default
-3 0.48830 host ceph141
0 hdd 0.19530 osd.0 up 1.00000 1.00000
1 hdd 0.29300 osd.1 up 1.00000 1.00000
-5 0.48830 host ceph142
2 hdd 0.19530 osd.2 up 1.00000 1.00000
4 hdd 0.29300 osd.4 up 1.00000 1.00000
-7 0.48830 host ceph143
3 hdd 0.29300 osd.3 up 1.00000 1.00000
5 hdd 0.19530 osd.5 down 1.00000 1.00000
[root@ceph141 ~]#
2.4 再次查看映射信息并查看数据能够正常读取
[root@ceph141 ~]# ceph osd map xixi fstab
osdmap e482 pool 'xixi' (15) object 'fstab' -> pg 15.45a53d91 (15.1) -> up ([3,1,2,0,4,NONE], p3) acting ([3,1,2,0,4,NONE], p3)
[root@ceph141 ~]#
[root@ceph141 ~]# rados ls -p xixi
fstab
[root@ceph141 ~]#
[root@ceph141 ~]# rados get fstab /tmp/fb -p xixi
[root@ceph141 ~]#
[root@ceph141 ~]# cat /tmp/fb
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/ubuntu-vg/ubuntu-lv during curtin installation
/dev/disk/by-id/dm-uuid-LVM-o76xLmF5JF2s58eBv4xdQGfddG6HnRVYRSidGXsaDDAi5krFpwANJdmCQC56uDoK / ext4 defaults 0 1
# /boot was on /dev/sda2 during curtin installation
/dev/disk/by-uuid/e4ff435b-e5ed-49f7-bb96-97e86dc230aa /boot ext4 defaults 0 1
/swap.img none swap sw 0 0
[root@ceph141 ~]#
[root@ceph141 ~]#
温馨提示:
很明显此时是可以正常读取的。
2.5 再停止任意一台OSD
[root@ceph141 ~]# ceph orch daemon stop osd.4
Scheduled to stop osd.4 on host 'ceph142'
[root@ceph141 ~]#
[root@ceph141 ~]# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 1.46489 root default
-3 0.48830 host ceph141
0 hdd 0.19530 osd.0 up 1.00000 1.00000
1 hdd 0.29300 osd.1 up 1.00000 1.00000
-5 0.48830 host ceph142
2 hdd 0.19530 osd.2 up 1.00000 1.00000
4 hdd 0.29300 osd.4 down 1.00000 1.00000
-7 0.48830 host ceph143
3 hdd 0.29300 osd.3 up 1.00000 1.00000
5 hdd 0.19530 osd.5 down 1.00000 1.00000
[root@ceph141 ~]#
2.6 再次观察是否可以正常读取数据
[root@ceph141 ~]# ceph osd map xixi fstab
osdmap e489 pool 'xixi' (15) object 'fstab' -> pg 15.45a53d91 (15.1) -> up ([3,1,2,0,NONE,NONE], p3) acting ([3,1,2,0,NONE,NONE], p3)
[root@ceph141 ~]#
[root@ceph141 ~]# rados ls -p xixi # 会阻塞在当前终端,无法读取数据。
温馨提示:
- 此时由于坏了2个OSD,且坏掉的OSD并没有空闲的,在其他节点无法重新创建,因此无法进行数据的读取。
- 实际生产使用中,若还有空闲的OSD可能会立刻创建出来新的数据,从而导致数据是可以正常访问的,但咱们的案例中,OSD已经被咱们用完了。
标签:码池,纠删,ceph141,Ceph,root,osd,pool,ceph
From: https://www.cnblogs.com/yinzhengjie/p/18407445