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

news/2024/9/17 1:04:08/文章来源:https://www.cnblogs.com/yinzhengjie/p/18407445

                                              作者:尹正杰

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

目录
  • 一.纠删码理论概述
    • 1.纠删码理论概述
    • 2.ceph纠删码以插件的形式提供
    • 3.纠删码池的优缺点
  • 二.纠删码基础命令实践
    • 1.列出纠删码配置文件
    • 2.查看指定纠删码配置文件的详细信息
    • 3.自定义纠删配置文件
    • 4.创建定制配置的纠删码池
    • 5.基于插件定制就删码配置
  • 三.纠删码池的数据实践和异常实践
    • 1.纠删码池数据实践
      • 1.1 创建纠删码池并测试读写
      • 1.2 纠删码池不支持部分image功能
    • 2.纠删码池异常实践
      • 2.1 创建纠删码池
      • 2.2 上传测试文件,并查看对应的映射信息
      • 2.3 根据映射信息停止映射的任意OSD节点
      • 2.4 再次查看映射信息并查看数据能够正常读取
      • 2.5 再停止任意一台OSD
      • 2.6 再次观察是否可以正常读取数据

一.纠删码理论概述

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.000001    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.000004    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.000005    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.000001    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.000004    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.000005    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已经被咱们用完了。

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

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

相关文章

基于Axis 1.4的Web Service入门

最近有个客户使用的是Axis 1.4创建的Web Service,很久没用了,所以整理下这块的知识。 基于JDK 1.8和Eclipse Mars开发一个简单的Hello world Web Service public interface HelloService {String hello(String name);} public class HelloServiceImpl implements HelloServic…

第四周作业

1、安装burp并实现抓取HTTP站点的数据包(HTTPS站点暂时不要求) 下方练习已完成 2、练习Tomcat PUT方法任意写文件漏洞(CVE-2017-12615),提供蚁剑连接成功截图 # 搜索镜像 docker search cve-2017-12615 # 拉取镜像 docker pull cved/cve-2017-12615 # 查看该镜像的详细信息…

MIT6.824 课程-Raft

Fault Tolerance - Raft 容错模式 我们已经学习了以下几种容错模式(fault-tolerance pattern):计算冗余:MapReduce,但是所有计算由单点 Master 进行调度。 数据冗余:GFS,也是依赖单点 Master 来对多个副本进行选主。 服务冗余:VMware-FT 依赖单个 TestAndSet 操作可以看…

9/10论文学习笔记

1.CPLEX是什么? 2.an apparent-tardiness-cost-with-setup (ATCS)是什么? a basic simulated annealing (SA)基本模拟退火算法 the threshold-accepting (TA) method 阈值接收算法

[Embodied AI Tutorial] The Basic Frameworks and Techniques for Embodied AI (Part2)

目录Embodied AI Tutorial课程内容Modeling and approaches for Embodied AIWorld ModelGet a Good PolicyPlanning And ControlSimulation technology for Embodied AIRigid body simulationCamera simulationAsserts相关链接资料查询 Embodied AI Tutorial 课程主页: slides…

MIT6.824 课程-GFS

GFS原文:https://zhuanlan.zhihu.com/p/113161014 搬运用于参考学习概述 存储(Storage)是一个非常关键的抽象,用途广泛。 GFS 论文还提到了很多关于容错、备份和一致性的问题。 GFS 本身是 Google 内部一个很成功的实用系统,其关键点被很好的组织到一块发表成为了学术论文…

MIT6.824 课程-MapReduce

MapReduce:在大型集群上简化数据处理 概要 MapReduce是一种编程模型,它是一种用于处理和生成大型数据集的实现。用户通过指定一个用来处理键值对(Key/Value)的map函数来生成一个中间键值对集合。然后,再指定一个reduce函数, 它用来合并所有的具有相同中间key的中间value 。…

[Java并发]线程安全的List

线程安全的List 目前比较常用的构建线程安全的List有三种方法:使用Vector容器 使用Collections的静态方法synchronizedList(List< T> list) 采用CopyOnWriteArrayList容器使用Vector容器 Vector类实现了可扩展的对象数组,并且它是线程安全的。它和ArrayList在常用方法的…

章10——面向对象编程(高级部分)——内部类

重点掌握匿名内部类的使用! 1、内部类可以随意访问外部类的成员,包括私有的属性,而外部类不可以。 2、内外部类有重名属性时,内部类的访问采用就近原则,如想访问外部的成员,则用外部类名.this.属性名。内部类分类,四种局部内部类第七条解释:Outer02.this本质是一个外部…

【整理】虚拟地址全解析:操作系统内存管理与进程调度的深度揭秘!

原创 freedom47概述 在现代计算机系统中,虚拟地址是内存管理的关键组成部分。 虚拟地址不仅帮助操作系统高效地管理物理内存,还在进程的内存分配中发挥重要作用。 本文将详细介绍虚拟地址的定义、作用、操作系统的内存管理、进程内存分配、32 位与 64 位架构的内存分配差异,…

2024.9.10 搜索引擎+字体

今天是人工智能的第一节课!我们主要学了引擎的搜索以及字体两部分,干货满满!有一种走了20年弯路的感觉(⊙︿⊙)第一次拥有了博客账号,在我小学的时候我妈妈会用博客记录生活,对于博客有一种熟悉的陌生感hhha 【知识小课堂1】 搜索引擎分为两类: 一、目录式分类搜索引擎,…