RHCA - CL260 | Day06:块存储

一、管理 RADOS 块设备

1、使用 RADOS 块设备(RBD)进行块存储

块设备是服务器、笔记本电脑和其他计算系统上最常见的长期存储类型。基于旋转磁盘片的硬盘驱动器(HDD)和基于非易失性存储器的固态驱动器(SSD)都是块设备。数据已固定大小块的形式存储在块设备中。

为了更容易地管理存储,可以使用文件系统格式化块设备,并将其挂载到Linux文件系统目录。您可以使用RADOS块设备(RBD)功能从您的RedHat Ceph存储集群提供块存储。它使您能够在RedHat Ceph Storage集群的池中创建作为RBD镜像作为虚拟块设备。

1)Accessing RADOS Block Devices Storage(访问RADOS块设备存储)

使用Linux内核的krbd可以将RBD镜像映射为一个Linux块设备,另外,Openstack或其他程序通过调用用户态的librbd接口也可以访问块设备,作为虚拟机和云主机的磁盘镜像。

2)Managing and Configuring RBD Images(管理和配置RBD镜像)

我们可以使用rbd命令管理RBD镜像,默认情况下该命令会在rbd池冲创建镜像。如果没有rbd池可以自己创建该存储池。如果没有rbd池也可以通过 ceph osd pool create 创建一个自定义池来存储RBD镜像,并且使用rbd pool init pool-name 初始化存储池(相当于指定池的application)

Ceph 客户机使用本地Linux内核模块krbd挂载RBD镜像。该模块将RBD镜像映射到名称为/dev/rbd0的Linux块设备。

① rbd device map 命令,使用krbd内核模块映射镜像。rbd map命令是rbd device map命令的缩写形式。

  • 命令:rbd device map

  • 命令:rbd map

将RBD池中的test RBD镜像映射到主机客户端的/dev/rbd0设备上,示例如下:

[root@node ~]# rbd map rbd/test
/dev/rbd0

警告:有可能你需要在多个客户端同时访问RBD镜像,这个对于高可用是非常有用的,但是如果块设备包含有文件系统,则需要确保同时只能由一个客户端mount挂载该设备,否则可能会导致异常和数据丢失的情况!

② rbd device list命令,缩写为rbd showmapped,用于列出机器中映射的rbd镜像。

  • 命令:rbd device list

  • 命令:rbd showmapped

[root@node ~]# rbd showmapped
id    pool    namespace    image    snap        device
0     rbd                  test        -        /dev/rbd0

③ rbd device unmap命令,简称rbd unmap,用于从客户端机器上解除rbd镜像的映射。

  • 命令:rbd device unmap

  • 命令:rbd unmap

[root@node ~]# rbd unmap /dev/rbd0

注意:The rbd map and rbd unmap commands require root privileges.

rbd map 和 rbd unmap 命令需要root权限

2、RBD 常用命令

Command

Purpose

rbd create --size nM|G|T [pool-name]/image-name

创建RBD

rbd ls [pool-name]

列出RBD

rbd info [pool-name]/image-name

查看RBD镜像详细信息

rbd status [pool-name]/image-name

查看RBD镜像状态信息

rbd du [pool-name]/image-name

查看RBD镜像已配置和实际磁盘使用情况

rbd resize  [pool-name]/image-name --size  nM|G|T

调整RBD镜像的大小

rbd rm [pool-name]/image-name

删除RBD镜像

rbd cp [pool-name]/src-image-name [pool-name]/tgt-image-name

复制RBD镜像

rbd mv [pool--name]/src-image-name [pool-name]/new-image-name

重命名RBD镜像

rbd trash mv  [pool-name]/image-name

将RBD镜像移动到回收站

rbd trash rm  [pool-name]/image-name

从回收站中删除RBD镜像

rbd trash restore  [pool-name]/image-name

从回收站中恢复RBD镜像

rbd trash ls [pool-name]

将所有RBD镜像列在回收站中

3、持久映射 RBD 镜像

rbdmap 服务可以在开机和关机时,自动映射和取消RBD镜像设备。该服务通过 /etc/ceph/rbdmap 凭证文件映射镜像设备。这个服务读取 /etc/fstab 文件,将RBD镜像设备挂载到特定的挂载点,或者取消设备挂载。

下面是使用 rbdmap 配置永久映射包含文件系统的RBD镜像的步骤:

1.Create the mount point for the file system (创建挂载点)

2.Create a single-line entry in the /etc/ceph/rbdmap RBD map file(创建映射文件)
该文件必须指定RBD镜像名称和存储池名称,它还必须引用具有读/写权限的Cephx用户来访问镜像和相应的密钥环文件,文件格式如下:

  • poolname/imagename   id=client,keyring=/etc/ceph/ceph.client.keyring

3.Create an entry for the RBD in the /etc/fstab file on the client system.(客户端在/etc/fstab文件中添加挂载条目)
设备文件名称格式如下:

  • /dev/rbd/pool_name/image_name /mnt/rbd ext4 noauto 0 0

Specify the noauto mount option.  设置noauto挂载属性
- auto属性(当执行mount -a时自动挂载)
- noauto(不能通过mount -a自动挂载,仅执行特定的mount命令指定设备时才挂载设备)

4.Confirm that the block device mapping works. (验证设备是否以及映射成功)

5.Enable the rbdmap systemd service. (启动并设置rbdmap服务为开机自启动)


对于虚拟化和云环境而言,可以基于librbd库直接访问Ceph存储。

4、调整 RBD 镜像格式

所有存储在RBD镜像中的对象数据,都有一个以RBD块设备名称前缀,我们可以使用rbd info查看镜像设备的前缀

RBD镜像中所有对象的名称都以每个RBD镜像的RBD块名称前缀字段中的值开头,并使用rbd info命令显示。在这个前缀之后,有一个句点(.),后面跟着对象号,从0开始。对象编号字段的值为12个字符的十六进制数。

查看名称为rbdimage镜像的基本信息(没有rbdimage镜像会报错,根据实际情况填写镜像名称)

  • 命令:rbd info rbdimage
[root@node ~]# rbd info rbdimage      
rbd image 'rbdimage':
        size 1024 MB in 256 objects
        order 22 (4096 kB objects)
        block_name_prefix: rbd_data.1219b74b0dc51
        format: 2
        features: layering
        flags:
        create_timestamp: Mon Nov  2 09:23:44 2022                  

查看rbd存储池中的数据(没有rbd池该命令会报错,根据实际情况填写池名称

  • 命令:rados -p rbd ls

[root@node ~]# rados -p rbd ls    
rbd_info
rbd_directory
rbdimage.rbd
rbd_data.1219b74b0dc51.000000000000
rbd_data.1219b74b0dc51.00000000001a
rbd_data.1219b74b0dc51.00000000004b
## rbd.data.1219b74b0dc51 是镜像的名称前缀(prefix),后是具体对象数据的编号

RBD Image Order(RBD镜像顺序)

Image order 指的是在一个RBD镜像中对象切割的大小,表示为C语言中按位左移操作。
例如:1<<=4.  十进制的1就是二进制的0001,将0001按位左移2位就是0100,0100对应的十进制就是4。而ceph进行的order必须是12和25之间位移

默认镜像使用的是22,也就是4MiB。你可以在使用rbd create命令是使用--order指定order大小。可以使用--object-size参数指定所使用对象的大小。该参数指定的对象大小必须在4096字节(4KiB)到33554432字节(32MiB)之间,单位为字节K或M。(例如, 4096, 8K or 4M,指定单位需使用大写字母)

例如1:在rbd池中创建一个名称为image1的镜像,该镜像支持layering分层数据功能,镜像大小为1G,对象大小为8M

[root@node ~]# rbd create rbd/image1 --image-feature=layering --size=1G --object-size=8M
[root@node ~]# rbd info rbd/image1      //查看镜像信息
rbd image 'image1':         //镜像名称
        size 1024 MB in 128 objects       //镜像大小为1G,对象大小为8M,最多存储128个对象
        order 23 (8192 kB objects)
        block_name_prefix: rbd_data.121a1643c9869

例如2:创建一个1G大小,对象大小为1M的image2镜像

[root@node ~]# rbd create rbd/image2 --image-feature=layering --size=1G --object-size=1M
[root@node ~]# rbd info rbd/image2      //查看镜像信息
rbd image 'image2':
        size 1024 MB in 1024 objects       //该镜像大小为1G,对象大小为1M,最多存储1024个对象
        order 20 (1024 kB objects)
        block_name_prefix: rbd_data.5e7574b0dc51

例如3:创建一个10G大小,对象大小为4K的image3镜像

[root@node ~]# rbd create rbdimage/image3 --image-feature=layering --size=10G --object-size=4K
[ceph@serverc ~]$ rbd info rbdimage/image3
rbd image 'image3':
        size 10240 MB in 2621440 objects      //该镜像大小为10G,对象大小为4K,最多存储2621440个对象
        order 12 (4096 bytes objects)
        block_name_prefix: rbd_data.121c5643c9869

每个RBD镜像都会绑定三个参数:

  • image_format:  The version of the RBD image format. The default value is 2, the most recent version.Version 1 is deprecated and does not support features such as cloning and mirroring.(RBD镜像格式的版本。默认值是2,即最新版本。版本1已弃用,不支持克隆和镜像等特性。

  • stripe_unit:  The number of consecutive bytes stored in one object(object_size by default) (存储在一个对象中的连续字节数(默认为object_size)

  • stripe_count: The number of RBD image objects a strip spans(1 by default).(一个条带所跨越的RBD镜像对象的数量(默认为1)

stripe_unit * stripe_count = object_size

如: strip_unit = 4M, stripe_count=1  for  default  4MB objects. 

LAB: 管理 RADOS 块设备

1. 管理RADOS块设备

有ceph用户名和密码的任何主机都可以管理ceph集群

前提条件:安装ceph-common客户端软件和配置账户、密码

[root@foundation0 ~]# ssh root@serverc
[root@serverc ~]# cephadm shell --mount /etc/ceph:/etc/ceph
[ceph: root@serverc /]# ceph -s

创建test_pool存储池

[ceph: root@serverc /]# ceph osd pool create test_pool 32 32
[ceph: root@serverc /]# ceph osd pool ls
[ceph: root@serverc /]# ceph osd lspools

将rbd设置为池的应用类型
或者: ceph osd pool application enable test_pool rbd

[ceph: root@serverc /]# rbd pool init test_pool
[ceph: root@serverc /]# ceph osd pool ls detail
[ceph: root@serverc /]# ceph df

在test_pool中创建名为test的RBD镜像。指定大小为128M。

[ceph: root@serverc /]# rbd create test_pool/test  --size=128M
[ceph: root@serverc /]# rbd ls test_pool
[ceph: root@serverc /]# rbd info test_pool/test
rbd image 'test':
        size 128 MiB in 32 objects
        order 22 (4 MiB objects)
        snapshot_count: 0
        id: 3804f5a1308
        block_name_prefix: rbd_data.3804f5a1308
        format: 2
        features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
        op_features:
        flags:
        create_timestamp: Wed Oct 25 17:46:39 2023
        access_timestamp: Wed Oct 25 17:46:39 2023
        modify_timestamp: Wed Oct 25 17:46:39 2023

为clientb创建名为 client.test_pool.clientb 的专用Ceph用户

[ceph: root@serverc /]# ceph auth get-or-create client.test_pool.clientb mon 'profile rbd' osd 'profile rbd' -o /etc/ceph/ceph.client.test_pool.clientb.keyring
[ceph: root@serverc /]# cat /etc/ceph/ceph.client.test_pool.clientb.keyring
[ceph: root@serverc /]# ceph auth get client.test_pool.clientb

## 开启另一个命令终端(Open a second terminal window)

[root@foundation0 ~]# ssh root@clientb
[root@clientb ~]# yum -y install ceph-common
[root@clientb ~]# scp root@serverc:/etc/ceph/{ceph.conf,ceph.client.test_pool.clientb.keyring} /etc/ceph/
[root@clientb ~]# export CEPH_ARGS='--id=test_pool.clientb'

通过使用内核RBD客户端在clientb节点上映射RBD镜像。

[root@clientb ~]# rbd map test_pool/test
/dev/rbd0
[root@clientb ~]# rbd showmapped
id    pool        namespace    image        snap    device
0    test_pool            test        -       /dev/rbd0
[root@clientb ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
rbd0   251:0    0  128M  0 disk
...

Format the device with an XFS filesystem. 使用XFS文件系统格式化设备。

[root@clientb ~]# mkfs.xfs /dev/rbd0

Create a mount point for the filesystem. 为文件系统创建一个挂载点。

[root@clientb ~]# mkdir /mnt/rbd

Mount the file system created on the /dev/rbd0 device. 挂载在/dev/rbd0上创建的文件系统。

[root@clientb ~]# mount /dev/rbd0 /mnt/rbd

Change the ownership of the mount point. 更改挂载点的所有权。

[root@clientb ~]# chown admin:admin /mnt/rbd
[root@clientb ~]# ls -ld /mnt/rbd
drwxr-xr-x. 2 admin admin 6 Oct 25 13:54 /mnt/rbd
[root@clientb ~]# df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
...
/dev/rbd0      xfs       121M  7.8M  113M   7% /mnt/rbd

## 测试

[root@clientb ~]# dd if=/dev/zero of=/mnt/rbd/test1 bs=10M count=1
[root@clientb ~]# df -Th /mnt/rbd
[root@clientb ~]# ceph df
[root@clientb ~]# umount /mnt/rbd

2. 持久挂载 RDB 镜像

配置客户机系统,以便它持久地将test_pool/test RBD镜像挂载为/mnt/ RBD。

[root@clientb ~]# vim /etc/ceph/rbdmap
... ...
test_pool/test    id=test_pool.clientb,keyring=/etc/ceph/ceph.client.test_pool.clientb.keyring

[root@clientb ~]# vim /etc/fstab
... ...
/dev/rbd/test_pool/test  /mnt/rbd     xfs    noauto   0  0

验证您的RBD映射配置。rbdmap命令用来映射和取消映射已配置的RBD设备。

[root@clientb ~]# rbdmap map
[root@clientb ~]# rbd showmapped
id  pool       namespace  image  snap  device
0   test_pool             test   -     /dev/rbd0

验证RBD映射设备正常工作后,启动rbdmap服务。

[root@clientb ~]# systemctl enable rbdmap
[root@clientb ~]# reboot

[root@foundation0 ~]# ssh root@clientb
[root@clientb ~]#  df -Th /mnt/rbd
[root@clientb ~]# ls /mnt/rbd

## 清理实验:

## 取消映射
[root@clientb ~]# rbdmap unmap
[root@clientb ~]# rbd showmapped

## 删除rbd配置行
[root@clientb ~]# vim /etc/fstab
#/dev/rbd/test_pool/test  /mnt/rbd     xfs    noauto   0  0
[root@clientb ~]# vim /etc/ceph/rbdmap
#test_pool/test    id=test_pool.clientb,keyring=/etc/ceph/ceph.client.test_pool.clientb.keyring

## 删除镜像
[root@clientb ~]# rbd rm test_pool/test --id test_pool.clientb
Removing image: 100% complete...done.
[root@clientb ~]# exit

二、管理 RADOS 块设备快照

1、启用 RBD 快照和克隆

2版本的RBD镜像支持很多可选的特色功能,使用rbd feature enable可以开启这些功能,使用rbd feature disable可以关闭这个功能。

例如,在rbd池的测试镜像上开启分层功能。

  • 命令:rbd feature enable  rbd/test  layering
[root@node ~]$ rbd feature enable rbd/test layering

需要禁用分层特性,使用rbd feature disable命令,如下所示:

  • 命令:rbd feature disable rbd/test  layering
[root@node ~]$ rbd feature disable rbd/test layering

The available features for an RBD image are: RBD镜像的可用特性有:

Name

Description

layering

Layering support to enable cloning(支持克隆)

striping

Striping v2 support for enhanced performance. Currently only supported by librbd.(支持性能增强)

exclusive-lock

Exclusive locking support(排他锁,支持多进程访问RADOS块设备)

object-map

Object map support(requires exclusive-lock) (对象地图,客户端看图即可知道对象位置,不需要计算)

fast-diff

Fast diff command support(requires object-map and exclusive-lock)(支持fast diff命令)

deep-flatten

Flattens all snapshots of the RBD image(flatten镜像的所有快照)

journaling

Journaling support(日志)

date-pool

EC data pool support(支持erasure coding池)

2、RBD Snapshots 快照

快照就是镜像在某个特定时间点的一份只读副本。RBD快照使用写时复制原理利用最小化存储空间实现数据备份功能。当一个读写请求应用到一个被快照的RBD镜像后,你的集群才会真正拷贝原始数据到快照的特定区域。因此,创建快照不会占用、消耗存储空间。RBD镜像还支持分层增量快照克隆结束。

快照的原理是基于COW(写时复制),默认所有快照中的数据都是对原始镜像的引用,所以快照很快,并且不占用磁盘空间

COW,当原始镜像发生写操作时,原始镜像的数据会被拷贝到快照区域,那些没有发生写操作的数据依然是对原始镜像的引用。

RedHat Ceph Storage支持使用RBD命令管理RBD快照:

1)Create snapshot(创建快照)

  • 命令:rbd snap create [pool-name/]image-name@snap-name
$ rbd snap create testpool/rbd@snap-rbd

2)List snapshots(列出快照)

  • 命令:rbd snap ls  [pool-name/]image-name

$ rbd snap ls testpool/rbd
SNAPID  NAME      SIZE     PROTECTED  TIMESTAMP
     4  snap-rbd  500 GiB             Fri Mar  8 16:19:08 2024

3)Limit the number of snapshots(限制快照数量)

  • 命令:rbd snap limit set --limit number [pool-name/]image-name

$ rbd snap limit set --limit 4 testpool/rbd

4)Remove the limit on the number of snapshots(删除限制)

  • 命令:rbd sanp limit clear  [pool-name/]image-name

$ rbd snap limit clear testpool/rbd

5)Rename snapshot(重命名快照)

  • 命令:rbd snap rename [pool-name/]{image-name@old-snap-name} [pool-name/]{image-name@new-snap-name

$ rbd snap rename testpool/rbd@snap-rbd testpool/rbd@new-snap

6)Delete snapshot(删除快照)

  • 命令:rbd snap rm [pool-name/]image-name@snap-name

$ rbd snap rm testpool/rbd@new-snap

7)Purge snapshot(删除镜像的所有快照)

  • 命令:rbd snap purge [pool-name/]image-name

$ rbd snap purge testpool/rbd

8)Roll back snapshot(还原快照)

  • 命令:rbd snap rollback [pool-name/]image-name@snap-name

$ rbd snap rollback testpool/rbd@snap-rbd

9)Protect snapshot(保护快照,被保护的快照,无法被删除)

  • 命令:rbd snap protect [pool-name/]image-name@snapshot-name

$ rbd snap protect testpool/rbd@snap-rbd
$ rbd snap rm testpool/rbd@snap-rbd
2024-03-08T16:30:48.540+0800 7fce6dba2640 -1 librbd::Operations: snapshot is protected
Removing snap: 0% complete...failed.
rbd: snapshot 'snap-rbd' is protected from removal.

10)Unprotect snapshot(取消快照保护)

  • 命令:rbd snap unprotect [pool-name/]image-name@snapshot-name

$ rbd snap unprotect testpool/rbd@snap-rbd

提示:在创建快照之前,使用fsfreeze命令挂起对文件系统的访问。带有--freeze选项的fsfreeze命令会停止对文件系统的访问,并在磁盘上创建一个稳定的镜像。如果在不使用fsfreeze的情况下拍摄文件系统快照,则快照可能会损坏。快照完成后,带unfreeze选项的fsfreeze命令恢复对文件系统的访问。

  • 命令:fsfreeze --freeze 挂载点             #锁定文件系统
  • 命令:fsfreeze --unfreeze 挂载点         #取消锁定文件系统

3、RBD Clones 克隆

RBD克隆是以受保护的RBD快照为基础的RBD镜像的读/写副本。新克隆的RBD镜像数据都是对原始数据的引用(剩空间,原理还是COW)。RBD克隆也可以被平面化(flattened),这将其转换为完全独立于其原始来源的RBD镜像(完整克隆)。

The cloning process has three steps(克隆需要三个步骤):

1)Create a snapshot (创建快照)

  • 命令:rbd snap create pool/image@snapshot

2)Protect the snapshot from deletion (保护快照不被删除)

  • 命令:rbd snap protect pool/image@snapshot

3)Create the clone using the protected snapshot(使用受保护的快照创建克隆)

  • 命令:rbd clone pool/imagename@snapshotname pool/clonename

4)remove clone(删除克隆)

  • 命令:rbd rm pool/clonename

新克隆的镜像盘支持COW(写时复制)和COR(读时复制),默认是COW。
COW当有写操作时,会拷贝父快照中的数据到clone的镜像盘。

客户端发送写操作时会复制数据并在Clone镜像盘修改数据

用户读取clone镜像,如果镜像中有数据则直接读取,如果没有,则需要读取父镜像数据!

## 也可以配置clone的镜像盘支持COR

COR copies objects to the clone when they are first read. COR在第一次读取对象时将对象复制到克隆。

可以使用如下命令激活COR模式:

  • 命令:ceph config set client rbd_clone_copy_on_read true

  • 命令:ceph config set global rbd_clone_copy_on_read true

在扁平化克隆时,Ceph将所有缺失的数据从父类复制到克隆中,然后删除对父类的引用。克隆成为一个独立的RBD镜像,不再是受保护快照的子快照。

  • 命令:rbd flatten [pool-name]/child-image-name

LAB: 管理 RADOS 块设备快照

有ceph用户名和密码的任何主机都可以管理ceph集群

前提条件:安装ceph-common客户端软件(如果没有则安装该软件)和配置账户、密钥

1. 创建、还原块设备快照操作

[root@foundation0 ~]# ssh root@serverc
[root@serverc ~]# cephadm shell
[ceph: root@serverc /]# ceph -s     //查看集群状态

创建存储池(32个PG),设置存储池应用类型为RBD

或者执行 rbd pool init rbd ,设置存储池的application类型

[ceph: root@serverc /]# ceph osd pool create rbdpool 32 32
[ceph: root@serverc /]# ceph osd pool application enable rbdpool rbd

创建名称为image1的镜像(大小为128M)

[ceph: root@serverc /]# rbd create rbdpool/image1 --size=128M
[ceph: root@serverc /]# exit

将rbd/image1镜像映射为块设备

[root@serverc ~]# rbd map --pool rbdpool image1
/dev/rbd0

用XFS文件系统格式化块设备

[root@serverc ~]# mkfs.xfs /dev/rbd0
[root@serverc ~]# blockdev --getro /dev/rbd0     //确认该块设备为可读可写设备(非只读设备)
0

客户端创建挂载点,挂载设备,任意写入文件内容测试

[root@serverc ~]# mkdir /mnt/image
[root@serverc ~]# mount /dev/rbd0 /mnt/image/
[root@serverc ~]# echo hello world > /mnt/image/hello.txt
[root@serverc ~]# umount /mnt/image

创建一个名为firstsnap的初始快照

[root@clienta ~]# cephadm shell
[ceph: root@serverc /]# rbd snap create rbdpool/image1@firstsnap
[ceph: root@serverc /]# rbd snap list rbdpool/image1
SNAPID  NAME       SIZE     PROTECTED  TIMESTAMP
     4  firstsnap  128 MiB             Wed Oct 25 18:08:01 2023
[ceph: root@serverc /]# exit

做完快照后,可以回到客户端,模拟数据被误删,使用快照就可以还原数据

[root@serverc ~]# mount /dev/rbd0 /mnt/image/
[root@serverc ~]# ls /mnt/image/
hello.txt     //查看刚才写的数据还在

## 模拟误删除

[root@serverc ~]# rm -rf /mnt/image/hello.txt
[root@serverc ~]# ls /mnt/image/
[root@serverc ~]# umount /mnt/image
[root@serverc ~]# rbd unmap /dev/rbd0

注意:ceph不支持在线还原快照,必须要把设备 umount,unmap

进入ceph管理容器,执行还原快照的命令

[root@clienta ~]# cephadm shell
[ceph: root@serverc /]# rbd snap rollback rbdpool/image1@firstsnap   //还原快照
Rolling back to snapshot: 100% complete...done.
 
[ceph: root@clienta /]# exit

重新映射块设备并测试

[root@serverc ~]# rbd map rbdpool/image1
/dev/rbd0
[root@serverc ~]# mount /dev/rbd0 /mnt/image/
[root@serverc ~]# ls /mnt/image/
hello.txt
[root@serverc ~]# cat /mnt/image/hello.txt
hello world

## 取消挂载

[root@clienta ~]# umount /mnt/image
[root@clienta ~]# rbd unmap /dev/rbd0
[root@clienta ~]# rbd showmapped

2. 通过快照映射块设备操作

注意:原始镜像是可读可写的镜像,快照是只读的

打开另一个命令终端(Open another terminal window)

[root@foundation0 ~]# ssh root@clientb
[root@clientb ~]# export CEPH_ARGS='--id=test_pool.clientb'
[root@clientb ~]# rbd map rbdpool/image1@firstsnap     //将rbd/image1镜像的firstsnap快照映射为块设备
/dev/rbd0
[root@clientb ~]# rbd showmapped
id  pool     namespace  image   snap       device
0   rbdpool             image1  firstsnap  /dev/rbd0

[root@clientb ~]# blockdev --getro /dev/rbd0      //确认快照设备为只读设备
1

验证快照是只读的,无法写操作

[root@clientb ~]# mkdir /mnt/snapshot/
[root@clientb ~]# mount /dev/rbd0  /mnt/snapshot/
mount: /mnt/snapshot: WARNING: device write-protected, mounted read-only.

[root@clientb ~]# umount /mnt/snapshot
[root@clientb ~]# rbd unmap --pool rbdpool image1@firstsnap
[root@clientb ~]# rbd showmapped

3. 通过快照进行克隆盘操作

注意:需要克隆镜像快照,必须要开启快照保护功能

Protect the firstsnap snapshot. 保护firstsnap快照。

[root@serverc ~]# rbd snap protect rbdpool/image1@firstsnap

克隆第一个snap块设备快照,以创建一个名为clone1的读写子镜像,该镜像使用rbdpool池。

[root@serverc ~]# rbd clone rbdpool/image1@firstsnap rbdpool/clone1

## clientb操作

[root@clientb ~]# rbd map --pool rbd clone1  
[root@clientb ~]# mkdir /mnt/clone  
[root@clientb ~]# mount /dev/rbd0 /mnt/clone
[root@clientb ~]# ls -l /mnt/clone
hello.txt
[root@clientb ~]# dd if=/dev/zero of=/mnt/clone/file1 bs=1M count=10
[root@clientb ~]# ls /mnt/clone

[root@clientb ~]# rbd map --pool rbdpool clone1   //将clone1镜像映射为块设备
/dev/rbd0
[root@clientb ~]# mkdir /mnt/clone      //创建挂载点并测试
[root@clientb ~]# mount /dev/rbd0 /mnt/clone     //镜像是可以写入非只读,可挂载
[root@clientb ~]# ls -l /mnt/clone
total 4
-rw-r--r--. 1 root root 12 Oct 25  2023 hello.txt

## 测试写入数据

[root@clientb ~]# dd if=/dev/zero of=/mnt/clone/file1 bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB, 10 MiB) copied, 0.0205534 s, 510 MB/s
[root@clientb ~]# ls /mnt/clone
file1  hello.txt

## 清理实验:

[root@clientb ~]# umount /mnt/clone
[root@clientb ~]# rbd unmap --pool rbdpool clone1
[root@clientb ~]# rbd showmapped
[root@clientb ~]# exit

4. 通过克隆盘进行flatten操作

查看克隆盘信息,可以看到该克隆盘依赖于原始镜像的快照

[root@serverc ~]# rbd info rbdpool/clone1
rbd image 'clone1':
        size 128 MiB in 32 objects
        order 22 (4 MiB objects)
        snapshot_count: 0
        ... ...
                parent: rbdpool/image1@firstsnap    //firstsnap 镜像快照

执行flatten之后,克隆盘的parent信息就没了,该克隆盘是完全独立的!

[root@serverc ~]# rbd flatten rbdpool/clone1
Image flatten: 100% complete...done.
[root@serverc ~]# rbd info rbdpool/clone1     //相关 parent 信息已经不存在

5. 总结客户端使用方式:

1)基于KRBD(Linux内核模块):Linux客户端直接访问ceph块共享

2)基于librbd库:虚拟机通过调用librbd库访问Ceph块共享

三、导入和导出 RBD 镜像

增量备份和恢复:

使用 rbd export-diff 和 rbd import-diff 来备份和恢复镜像的增量数据。

全量备份和恢复:

使用 rbd export 和 rbd import 来备份和恢复整个镜像或快照。

镜像迁移:

使用 rbd export 和 rbd import 将镜像从一个集群迁移到另一个集群。

通过这些命令,你可以灵活地管理和操作 RBD 镜像的数据,无论是备份、恢复还是迁移。

命令

用途

示例命令

rbd export-diff

导出增量差异数据

rbd export-diff --from-snap snap1 rbd/test@snap2 /mnt/diff-export.dat

rbd import-diff

导入增量差异数据

rbd import-diff /mnt/diff-export.dat rbd/test

rbd export

导出整个镜像或快照

rbd export rbd/test@snap1 /mnt/test-snap1.img

rbd import

导入镜像文件

rbd import /mnt/test.img rbd/test

1、导出 RBD 镜像

RedHat Ceph Storage支持使用RBD export命令将RBD镜像导出为文件。该命令将RBD镜像或RBD镜像快照作为输入,并将其导出到指定的目标文件。rbd export命令的语法如下:

  • 命令:rbd export [--export-format ]

1. --export-format format(1 or 2)

功能: 指定导出文件的格式。

选项:

1: 默认格式,适用于大多数场景。

2: 优化格式,支持更大的镜像和更高的性能。

解释::如果你不指定 --export-format,默认使用格式 1。 格式 2 通常用于非常大的镜像,以提高导出和导入的性能。

2. (image-spec | snap-spec)

功能: 指定要导出的 RBD 镜像或快照。

选项:

image-spec: 镜像名称(例如 poolname/imagename)。

snap-spec: 镜像快照名称(例如 poolname/imagename@snapname)。

解释: 如果是 image-spec,导出的是整个镜像。 如果是 snap-spec,导出的是镜像的某个快照。

3. [dest-path]

功能: 指定导出文件的目标路径。

解释:导出的文件将存储在指定的本地路径中。

例如:导出一个名为test的RBD镜像到/tmp/test.dat文件

[root@clienta ~]# rbd export rbd/test /tmp/test.dat       

2、导入 RBD 镜像

RedHat Ceph Storage支持使用RBD import命令从文件导入RBD镜像。该命令创建一个新镜像,并从指定的源路径导入数据。rbd import命令的格式如下:

  • 命令:rbd import [--export-format  format(1 or 2)  [--image-format  format-id]   [--object-size  size-in-B/K/M]  [--strip-unit  size-in-B/K/M]  --strip-count num]  [--image-feature   feature-name]… [--image-shared]   src-path   [image-spec]

  • 命令:rbd import [--image-format ] <src-path> <image-spec>

--image-format :指定导入镜像的格式(1 或 2)。

1:默认格式。

2:优化格式,支持更高的性能和特性。

<src-path>:指定要导入的源文件路径。

<image-spec>:指定目标镜像。

例如: 管道导出和导入流程

[root@clienta ~]# rbd export rbd/image1 - | rbd import - bup/img1

3、导出 RBD 镜像的增量差异数据

导出 RBD 镜像的增量差异数据。仅导出从一个快照到另一个快照之间的变化数据。

  • 命令:rbd export-diff [--from-snap <from-snapshot>] <image-spec@to-snapshot> <dest-path>

--from-snap <from-snapshot>:指定起始快照。
<image-spec@to-snapshot>:指定目标镜像和结束快照。
<dest-path>:指定导出文件的目标路径。

例如:导出从快照 snap1 到快照 snap2 的差异数据:

rbd export-diff --from-snap snap1 rbd/test@snap2 /mnt/diff-export.dat

用途场景:
1.备份镜像的增量数据。
2.在迁移或恢复时,减少数据传输量。

4、导入增量差异数据到 RBD 镜像

导入增量差异数据到 RBD 镜像。 将导出的增量差异文件应用到目标镜像。

  • 命令:rbd import-diff <diff-file> <image-spec>

<diff-file>:指定要导入的增量差异文件。
<image-spec>:指定目标镜像。

例如 :将增量差异文件 /mnt/diff-export.dat 导入到镜像 rbd/test:

rbd import-diff /mnt/diff-export.dat rbd/test

用途场景
1.恢复镜像的增量数据。
2.在迁移或备份后,将增量数据应用到目标镜像。

LAB: 导入和导出 RBD 镜像

有ceph用户名和密码的任何主机都可以管理ceph集群

前提条件ceph-common客户端软件(如果没有则安装该软件)和账户、密码

1. 导入和导出 RBD 镜像

[root@foundation0 ~]# ssh root@serverc
[root@serverc ~]# cephadm shell
[ceph: root@serverc /]# ceph -s

打开另一个终端,远程serverf(一个单节点的ceph存储)

[root@foundation0 ~]# ssh root@serverf
[root@serverf ~]# cephadm shell
[ceph: root@serverf /]# ceph -s

创建一个名为rbd的池,然后为Ceph块设备启用rbd客户机应用程序,并使其可用于rbd特性。

[ceph: root@serverc /]# ceph osd pool create rbd 32
[ceph: root@serverc /]# ceph osd pool application enable rbd rbd
[ceph: root@serverc /]# ceph osd pool ls

在第二个存储服务器serverf上面也创建一个rbd存储池

[ceph: root@serverf /]# ceph osd pool create rbd 32
[ceph: root@serverf /]# ceph osd pool application enable rbd rbd
[ceph: root@serverf /]# ceph osd pool ls

创建RBD镜像。退出cephadm shell,映射镜像,然后使用XFS文件系统对其进行格式化。

[ceph: root@serverc /]# rbd create test --size 128M --pool rbd
[ceph: root@serverc /]# exit
[root@serverc ~]# rbd map --pool rbd test
/dev/rbd0
[root@serverc ~]# mkfs.xfs /dev/rbd0
[root@serverc ~]# mkdir /mnt/rbd
[root@serverc ~]# mount /dev/rbd0 /mnt/rbd
[root@serverc ~]# cp /etc/ceph/ceph.conf /mnt/rbd/file0
[root@serverc ~]# ls /mnt/rbd
file0
[root@serverc ~]# umount /mnt/rbd

使用--mount参数运行cephadm shell 绑定挂载 /home/admin/rbd-export。

  • 命令:rbd export rbd/test@snap1 /mnt/test-snap1.img

[root@serverc ~]# mkdir -p /home/admin/
[root@serverc ~]# cephadm shell --mount /home/admin/
[ceph: root@serverc /]# rbd export rbd/test /mnt/export.dat   //导出镜像
Exporting image: 100% complete...done.

[ceph: root@serverc /]# exit
[root@serverc ~]# ls /home/admin/
ceph  export.dat

将export.dat文件复制到 serverf 的 /home/目录

[root@serverc ~]# rsync -avP /home/admin/export.dat serverf:/home/

1. -a  --archive
功能: 归档模式,表示递归传输并保留所有属性(如权限、时间戳、符号链接等)。
详细说明:
相当于同时使用 -rlptgoD 选项的组合:
- -r: 递归传输目录及其内容。
- -l: 保留符号链接。
- -p: 保留文件权限。
- -t: 保留文件时间戳。
- -g: 保留文件的属组。
- -o: 保留文件的属主。
- -D: 保留设备文件和特殊文件。

2. -v  --verbose
功能: 显示详细的输出信息,帮助用户了解传输的进度和内容。


3. -P  --partial --progress
功能: 显示传输进度并支持断点续传。
- --partial: 保留未完成的传输文件,以便在传输中断时可以继续传输。
- --progress: 显示传输进度条,包括已传输的字节数、传输速度和剩余时间。

在 serverf 上面通过文件导入镜像

  • 命令:rbd import /mnt/test.img rbd/test

[root@serverf ~]# ls /home/    //在serverf上确认是否同步
admin  devops  export.dat  student

[root@serverf ~]# yum -y install ceph-common
[root@serverf ~]# rbd import /home/export.dat rbd/test   //导入镜像
Importing image: 100% complete...done.
[root@serverf ~]# rbd --pool rbd ls   //查看rbd池的rbd镜像
test

[root@serverf ~]# rbd map test    //重新映射并验证查看是否有导入RBD镜像的内容
/dev/rbd0
[root@serverf ~]# mount /dev/rbd0 /mnt
[root@serverf ~]# df -Th /mnt
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/rbd0      xfs   121M  7.8M  113M   7% /mnt
[root@serverf ~]# ls /mnt
file0

## 清理

[root@serverf ~]# umount /mnt
[root@serverf ~]# rbd unmap /dev/rbd0

2. 导出和导入差异数据

在serverc 和 serverf 上创建快照

[root@serverc ~]# rbd snap create rbd/test@firstsnap
[root@serverf ~]# rbd snap create rbd/test@firstsnap

将文件系统挂载到/dev/rbd0设备上(主存储挂载设备,写入测试数据)

[root@serverc ~]# mount /dev/rbd0 /mnt/rbd
[root@serverc ~]# dd if=/dev/zero of=/mnt/rbd/file1 bs=1M count=5
[root@serverc ~]# ls /mnt/rbd/
file0  file1
[root@serverc ~]# umount /mnt/rbd

创建镜像快照,导出差异数据,将数据拷贝到serverf

  • 命令:rbd export-diff [--from-snap <from-snapshot>] <image-spec@to-snapshot> <dest-path>
[root@serverc ~]# cephadm shell --mount /home/admin/
[ceph: root@serverc /]# rbd snap create rbd/test@secondsnap
Creating snap: 100% complete...done.

[ceph: root@serverc /]# rbd export-diff --from-snap firstsnap rbd/test@secondsnap  /mnt/export-diff.dat
Exporting image: 100% complete...done.

[ceph: root@serverc /]# exit
[root@serverc ~]# rsync -avP /home/admin/export-diff.dat  serverf:/home/

serverf导入增量数据,验证效果

  • 命令:rbd import-diff <diff-file> <image-spec>
[root@serverf ~]# ls /home/
admin  devops  export.dat  export-diff.dat  student

[root@serverf ~]# rbd import-diff /home/export-diff.dat rbd/test
Importing image diff: 100% complete...done.
[root@serverf ~]#  rbd snap list rbd/test
SNAPID  NAME        SIZE     PROTECTED  TIMESTAMP
     4  firstsnap   128 MiB             Sun Feb 16 11:40:10 2025
     5  secondsnap  128 MiB             Sun Feb 16 11:44:15 2025    //增量数据中的快照

[root@serverf ~]# rbd map rbd/test
/dev/rbd0
[root@serverf ~]# mount /dev/rbd0 /mnt
[root@serverf ~]# ls /mnt       //查看是否有2个文件
file0  file1
[root@serverf ~]# umount /mnt

可以在foundation执行 rht-vmctl fullreset all 重置所有虚拟机还原快照,恢复环境

思维导图

小结:

本篇为 【RHCA认证 - CL260 | Day06:块存储】的学习笔记,希望这篇笔记可以让您初步了解如何管理 RADOS 块设备、管理 RADOS 块设备快照、导入和导出 RBD 镜像,不妨跟着我的笔记步伐亲自实践一下吧!


Tip:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关环境、视频,可评论666并私信小安,请放下你的羞涩,花点时间直到你真正的理解。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小安运维日记

Hey~ 感谢您的充电支持!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值