Ceph Reef(18.2.X)之纠删码池

                                              作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.纠删码理论概述

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已经被咱们用完了。
posted @ 2024-09-10 23:08  尹正杰  阅读(214)  评论(0编辑  收藏  举报