Ceph存储池管理

ceph · 浏览次数 : 4

小编点评

**4M ./4M[root@ceph01 ~]# rados -p test03 put test_put ./4M[root@ceph01 ~]# erasingcode_profile test_profile **内容简介:** * 将文件 `test_put` 写入容器 `test03` 的内存中。 * 使用 `erasingcode_profile` 配置创建纠删码池。 * 设置 `mon_allow_pool_delete` 配置选项为 `true`,允许删除存储池。 **其他重要配置:** * `erasingcode_profile` 配置文件包含以下设置: * `crush_failure_domain`:故障域,指定在哪些 OSD 上分配故障。 * `object_hash`:对象哈希值,用于创建纠删码。 * `test_profile`:测试配置文件,包含 `crush_failure_domain` 和 `object_hash` 等设置。 * `test_profile` 配置文件示例中设置了 `crush_failure_domain` 为 `osd`,这意味着故障域会分配在不同的 OSD 上。 **生成内容时需要带的简单排版:** ``` rclone config set mon mon_allow_pool_delete true rclone config set erasingcode_profile test_profile crush-failure-domain=osd k=3 m=2 plugin=jerasuretechnique=reed_sol_van5.2.1 rclone pool create test05 erasure test_profilepool 'test05' created rclone copy --source test03 --dest test05 erasingcode_profile test_profile ```

正文

Ceph存储池

前面已经搭建好了一个基础的Ceph集群,现在来看看Ceph的存储

1. Ceph的存储流程

当客户端需要存储一个文件到Ceph集群的时候,Ceph会把这个文件切分成多个对象,默认情况下每个对象4M,不足4M按原大小。切分之后每个对象都有一个对应的对象ID,Ceph拿到这个对象ID之后执行hash算法,去计算出这个对象应该写入到哪个PG(Placement Group)

PG是一些对象的集合,这些对象组成一个group,放在某些OSD上(place),组合起来就是Placement Group。将objects以PG为单位进行管理,有以下好处:

集群中的PG数目经过规划因为严格可控,使得基于PG可以精准控制单个OSD乃至整个节点的资源消耗,如CPU、内存、网络带宽等
因为集群中的PG数目远小于objects数目,并且PG数目和每个PG的身份相对固定,以PG为单位进行数据备份策略和数据同步、迁移等,相较于直接以对象为单位而言,难度更小且更加灵活

1. 数据写入

为了保证集群里存储的数据不丢失,Ceph采用了多副本机制,也就是将一个PG复制到多个osd节点上,当存储数据时,主osd收到写入指令后,将数据写入,并向其他的备osd(这里的数量取决于你设置的副本数)发起数据写入指令

强一致性会导致数据写入有较大的延迟,因此ceph进行了优化,将数据的写入分为2步执行

  1. 第一次当所有数据都写入osd节点的缓存后,向client发送一次确认,client就认为数据写入完成,继续后面的操作
  2. 第二次当所有数据都从缓存写入到磁盘后,再向client发送一次确认,client就会认为数据彻底写入,从而根据需要删除对应的本队数据

2. 数据读取

如果是读取数据呢?是怎么读的?在哪个osd读?

ceph读取数据的话永远都是从主osd节点上读取,不会从其他备osd节点读。

2. 资源池的配置

2.1 资源池创建

  • 创建资源池的命令是
    ceph osd pool create poolname [pg_num:int] [pgp_num:int] [replicated|erasure] [earsure_code_profile]

    • poolname :资源池名称,必选
    • pg_num:int:PG数量,现在可以不选
    • pgp_num:int:下面单独解释什么是pgp,也可以不选
    • replicated|erasure:资源池类型,replicated为副本池,另一个则为纠删码池
    • earsure_code_profile:纠删码配置模板,用于设置数据块和纠删码数量,当资源池类型为纠删码时,此选项为必选
    • 如果创建资源池仅仅指定了资源池名称,那么其他参数系统会自动补齐,默认资源池类型为副本池
[root@ceph01 ~]# ceph osd pool create test_pool
pool 'test_pool' created

pgp是什么 (Placement Group for Placement purpose)

我们现在都知道pg是什么,用比较容易理解的话来说就相当于Linux上的目录,目录下面会存放文件嘛,只不过pg存放的是对象,那如果pg数量太少,对象数量太多,我们是不是应该创建更多的pg出来?对。就是应该创建更多的pg,但是并不是直接创建,而是当任何池的pg_num增加时,此池的每个PG都将一分为二,但它们都保持映射到其父OSD。 直到这个时候,Ceph才开始重新平衡。现在,当你增加同一个池的pgp_num值时,PG开始从父级迁移到其他OSD,并开始群集重新平衡。这就是PGP发挥重要作用的原因。

简单来说,如果只是pg的数量发生变化的话,那么这个osd上的pg会发生裂变由原来的一个一分为二,但是数据依旧保存在这个osd上,但是如果修改了pgp的数量,那么此时会开始发生迁移,之前发生裂变的pg可能会被重新调度到其他的osd上

2.2 绑定池类型

当我们的存储池被创建出来之后,我们需要指定他的类型,不建议复用

[root@ceph01 ~]# ceph osd pool application enable test_pool rbd
enabled application 'rbd' on pool 'test_pool'
[root@ceph01 ~]# ceph osd pool create test02
pool 'test02' created
[root@ceph01 ~]# ceph osd pool application enable test02 rgw
enabled application 'rgw' on pool 'test02'[root@ceph01 ~]# ceph osd pool application enable test03 cephfs
enabled application 'cephfs' on pool 'test03'

这时候我们就有3个存储池,绑定的类型分别是 rbd,rgw,cephfs

关闭

我们刚刚是使用enable绑定的类型,那么同样可以使用disable去关闭掉

[root@ceph01 ~]# ceph osd pool application disable test03 cephfs
Error EPERM: Are you SURE? Disabling an application within a pool might result in loss of application functionality; pass --yes-i-really-mean-it to proceed anyway

这个时候他会报错,目的是让你确认,你得加上 --yes-i-really-mean-it这个才可以删除

[root@ceph01 ~]# ceph osd pool application disable test03 cephfs --yes-i-really-mean-it
disable application 'cephfs' on pool 'test03'

3. 对象的管理

我们创建了资源池,也绑定了类型,那么现在可以使用rados来操作ceph集群了

3.1 上传对象

[root@ceph01 ~]# rados -p test03 put test-obj /etc/hosts
  • -p 是指定资源池

  • put是操作

  • test-obj 是对象的id,自己指定

  • /etc/hosts 是需要上传的文件

  • 整条命令就是说将本地的/etc/hosts文件上传到test03,对象的id是test-obj

3.2 查看对象

[root@ceph01 ~]# rados -p test03 put test-obj /etc/hosts
[root@ceph01 ~]# rados -p test03 ls
test-obj

我们使用ls就可以看到我们刚刚上传的文件了

3.3 下载对象

[root@ceph01 ~]# rados -p test03 get test-obj ./hosts
[root@ceph01 ~]# cat hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 ceph01
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.101.10 ceph01
192.168.101.20 ceph02
192.168.101.30 ceph03

3.4 删除对象

[root@ceph01 ~]# rados -p test03 rm test-obj 
[root@ceph01 ~]# rados -p test03 ls

3.5 查询对象所在pg

# 重新上传一个对象
[root@ceph01 ~]# rados -p test03 put test-obj /etc/hosts
[root@ceph01 ~]# ceph osd map test03 test-obj
osdmap e93 pool 'test03' (4) object 'test-obj' -> pg 4.d6b75f59 (4.19) -> up ([7,2,5], p7) acting ([7,2,5], p7)

我们可以看到这个对象位于 7,2,5这三个pg上,主osd是7

3.6 限制资源池配额

限制资源池有2种,一种是限制最大对象数,一种是限制最大字节数

限制资源有一点非常不友好,就是你到达了最大数量的限制之后你再去上传,他不会报错,会一直卡在那

# 设置最大字节为5M
[root@ceph01 ~]# ceph osd pool set-quota test03 max_bytes 5M
set-quota max_bytes = 5242880 for pool test03

取消配置只需要设置成0就可以了

[root@ceph01 ~]# ceph osd pool set-quota test03 max_bytes 0

3.7 测试配额

# 创建一个4M的文件
[root@ceph01 ~]# dd if=/dev/zero of=./4M count=1 bs=4M
1+0 records in
1+0 records out
4194304 bytes (4.2 MB, 4.0 MiB) copied, 0.00513982 s, 816 MB/s

# 上传文件
[root@ceph01 ~]# rados -p test03 put 4M ./4M
[root@ceph01 ~]# rados -p test03 ls
test-obj
4M
[root@ceph01 ~]# ceph osd pool  get-quota test03
quotas for pool 'test03':
  max objects: N/A
  max bytes  : 5 MiB  (current num bytes: 4194535 bytes)
[root@ceph01 ~]# rados -p test03 put test_put ./4M
[root@ceph01 ~]# ceph osd pool  get-quota test03
quotas for pool 'test03':
  max objects: N/A
  max bytes  : 5 MiB  (current num bytes: 8388839 bytes)

是不是有疑问了,不是最大限制5M吗,这都上传了8M了啊

是这样的,在你的空间还没有满之前,哪怕就剩下1K了,这时候你上传多大的文件都可以传进去,但是当他已经超过之后,你就传不进去了。我们再来传一个

[root@ceph01 ~]# rados -p test03 put test_put02 ./4M

你会发现他一直卡在这,对吧。他不会报错,他也不会告诉你超过配额了。

配额超过之后他是不允许你执行任何上传,下载操作的。注意。下载也是不行的,你只能执行get这是没有问题的

3. 存储池快照

ceph的快照功能有点鸡肋,原因是他并不跟虚拟机的快照功能一样,还原快照就直接回到当时的那个场景,ceph的快照是这样的。

首先你对现在的存储池打一个快照,然后你想恢复的话,需要从某个快照里面去将某个文件get到本地,然后再从本地上传到存储池内

# 打快照
[root@ceph01 ~]# rados -p test03 ls
test-obj
[root@ceph01 ~]# rados -p test03 mksnap snap01
created pool test03 snap snap01
[root@ceph01 ~]# rados -p test03 lssnap
1	snap01	2024.05.25 10:30:05
1 snaps
# 删除存储池的文件
[root@ceph01 ~]# rados -p test03 rm test-obj
# 查看文件,这时候他还会显示,应该是个bug,但是这个文件已经是被删掉了,不信的话可以get一下
[root@ceph01 ~]# rados -p test03 ls
test-obj

# 将文件还原
[root@ceph01 ~]# rados -p test03 -s snap01 get test-obj ./test-obj
selected snap 1 'snap01'
[root@ceph01 ~]# ls test-obj
test-obj

# 上传到存储池内
[root@ceph01 ~]# rados -p test03 put test-obj ./test-obj
[root@ceph01 ~]# rados -p test03 ls
test-obj

怎么样,现在是不是觉得非常的鸡肋。如果要还原的文件过多,那么就需要一个个下载到本地然后重新上传回去。非常之麻烦

4. 修改池属性

当池被创建出来之后,我们需要修改他的一些属性,比如修改副本数,修改pg数等等

4.1 列出属性

[root@ceph01 ~]# ceph osd pool get test03 all
size: 3
min_size: 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
bulk: false

4.2 调整副本数为4

[root@ceph01 ~]# ceph osd pool set test03 size 4
set pool 4 size to 4
[root@ceph01 ~]# ceph osd pool get test03 size
size: 4

4.3 禁止删除存储池

[root@ceph01 ~]# ceph osd pool set test03 nodelete true
set pool 4 nodelete to true

nodelete 就是这个存储池不允许被删除

我们来删删看

[root@ceph01 ~]# ceph osd pool rm test03 
Error EPERM: WARNING: this will *PERMANENTLY DESTROY* all data stored in pool test03.  If you are *ABSOLUTELY CERTAIN* that is what you want, pass the pool name *twice*, followed by --yes-i-really-really-mean-it.
# 他报错说要删除存储池的话需要写2次存储池的名字以及加上--yes-i-really-really-mean-it
[root@ceph01 ~]# ceph osd pool rm test03  test03 --yes-i-really-really-mean-it
Error EPERM: pool deletion is disabled; you must first set the mon_allow_pool_delete config option to true before you can destroy a pool

现在他依然报错,因为我们刚刚设置了不允许被删除,现在我们取消

[root@ceph01 ~]# ceph osd pool set test03 nodelete false
set pool 4 nodelete to false
# 再来删除
[root@ceph01 ~]# ceph osd pool rm test03  test03 --yes-i-really-really-mean-it
Error EPERM: pool deletion is disabled; you must first set the mon_allow_pool_delete config option to true before you can destroy a pool

可以看到他一样不让删除,他的意思是要删除的话必须 将 mon_allow_pool_delete设置为true,默认为false

# 修改这个值
[root@ceph01 ~]# ceph config set mon mon_allow_pool_delete true
# 删除池
[root@ceph01 ~]# ceph osd pool rm test03 test03 --yes-i-really-really-mean-it
pool 'test03' removed

5. 纠删码池管理

纠删码池在ceph的局限性是只能做对象网关,但是他不会保存多个副本,空间利用率大大提升

5.1 原理

当上传某个文件的时候,他会将文件拆成多个数据块,然后存放的时候会再补充若干个校验块,他的冗余能力为纠删码的块数。假如我们现在有一个3M的文件,被拆分成3个1M的数据块,然后还有2个校验块,如果挂掉了2个数据块,正好可以通过还剩下的1个数据块+2个校验块来还原数据。如果3个数据块都坏掉了那就还原不了

5.2 创建纠删码池

[root@ceph01 ~]# ceph osd pool create test04 erasure
pool 'test04' created

之前不是说创建纠删码就必须给他指定一个配置文件吗?我没指定怎么也创建出来了呢?我们来看看

[root@ceph01 ~]# ceph osd pool ls detail |grep erasure
pool 5 'test04' 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 110 flags hashpspool stripe_width 8192

这里我们可以看到他使用的默认的配置文件,查看默认配置文件

# 查看有哪些配置文件
[root@ceph01 ~]# ceph osd erasure-code-profile ls
default
# 查看配置文件的详细配置
[root@ceph01 ~]# ceph osd erasure-code-profile get default
k=2
m=2
plugin=jerasure
technique=reed_sol_van

5.2.1 创建自己的配置文件

[root@ceph01 ~]# ceph osd erasure-code-profile set test_profile crush-failure-domain=osd k=3 m=2
[root@ceph01 ~]# ceph osd erasure-code-profile ls
default
test_profile
  • k:就是数据块的个数
  • m: 就是校验块的数量
  • crush-failure-domain:故障域,意思就是要求故障域分配在不同的osd上,不需要分配在不同的主机上,为什么不是host,因为分配在不同的主机上的话,需要k+m台主机,但是我们现在只有3台主机,所以需要改

5.2.2 使用自己的配置文件创建池

[root@ceph01 ~]# ceph osd pool create test05 erasure test_profile
pool 'test05' created
[root@ceph01 ~]# ceph osd pool get test05 all
size: 5
min_size: 4
pg_num: 32
pgp_num: 32
crush_rule: test05
hashpspool: true
allow_ec_overwrites: false
nodelete: false
nopgchange: false
nosizechange: false
write_fadvise_dontneed: false
noscrub: false
nodeep-scrub: false
use_gmt_hitset: 1
erasure_code_profile: test_profile
fast_read: 0
pg_autoscale_mode: on
bulk: false

与Ceph存储池管理相似的内容:

Ceph存储池管理

目录Ceph存储池1. Ceph的存储流程1. 数据写入2. 数据读取2. 资源池的配置2.1 资源池创建pgp是什么 (Placement Group for Placement purpose)2.2 绑定池类型关闭3. 对象的管理3.1 上传对象3.2 查看对象3.3 下载对象3.4 删除对象

将虚拟机跑在ceph之中

目录openStack对接ceph1. cinder对接ceph1.1 ceph创建存储池1.2 ceph授权1.3 下发ceph文件1.4 修改globals文件1.5 部署cinder1.6 创建卷null2. nova对接ceph2.1 创建卷2.2 更新cinder权限2.3 修改globa

[转帖]harbor镜像仓库清理操作

https://www.cnblogs.com/FengGeBlog/p/15517706.html 两年前清理过一次harbor镜像,而现在又要面临清镜像的操作了,笔者目前所在的公司镜像是存放在ceph集群内部的,目前约200T,且该存储池是两副本,那么占用空间是400T左右。真的是相当浪费空间了

[转帖]Ceph学习之路(二)之Ceph的工作原理及流程

Ceph学习之路(二)之Ceph的工作原理及流程 https://www.cnblogs.com/linuxk/p/9414920.html 一、RADOS的对象寻址 Ceph 存储集群从 Ceph 客户端接收数据——不管是来自 Ceph 块设备、 Ceph 对象存储、 Ceph 文件系统、还是基于

Ceph 架构以及部署

目录Ceph架构存储类型为什么用到Ceph?1. NFS2. MooseFSMooseFS瓶颈3. GlusterFS4. CephCeph的组件Ceph部署前期准备1.1 修改主机名1.2 关闭防火墙以及selinux1.3 配置hosts1.4 配置时间同步2. 安装cephadm2.1 安装g

[转帖]ceph学习一之基础知识

https://www.cnblogs.com/liuxingxing/p/13551406.html 一、ceph简介 Ceph是一个可靠、自动重均衡、自动恢复的分布式存储系统,根据场景划分可以将Ceph分为三大块,分别是对象存储、块设备和文件系统服务。块设备存储是Ceph的强项。 Ceph的主要

[转帖]FIO 存储性能压测

测试环境 3台服务器:ceph配置内外网分离,外网使用万兆线,内网使用千兆线,osd共21个。 1台客户端:安装fio工具、内核客户端,使用万兆线。 测试目的 针对fio工具中的iodepth(队列深度)和numjobs(线程数)参数,分析使用fio工具时,哪个参数对带宽值测试结果影响比较大。 测试

每天5分钟复习OpenStack(十三)存储缓存技术Bcache

Ceph作为一个分布式存储,在项目中常见的形态有两者,一种是采用 SSD 或NVME 磁盘做Ceph的日志盘,使用SATA磁盘来做数据盘。这样的好处是比较经济实惠。另一种则是全部采用 SSD 或NVME磁盘,其性能更好,但是其价格比较昂贵。在第一种形态中,我们能像中间件那样加上一层缓存层,从而实现给

ceph客户端配置自动挂载存储服务

1. 安装支持ceph的内核模块 可选: centos/ubuntu: yum install -y ceph-common 或 apt install -y ceph-common 2. 拷贝认证密钥 cephadmin@ceph-deploy:~/ceph-cluster$ sudo scp c

k8s使用rbd作为存储

k8s使用rbd作为存储 如果需要使用rbd作为后端存储的话,需要先安装ceph-common 1. ceph集群创建rbd 需要提前在ceph集群上创建pool,然后创建image [root@ceph01 ~]# ceph osd pool create pool01 [root@ceph01