本文发布于Cylon的收藏册,转载请著名原文链接~

上一章提到了 RBD 块设备相关的基本配置,这章主要描述 RBD 操作部分

ceph块设备接口(RDB)

Ceph块设备,也称为RADOS块设备(简称RBD),是一种基于RADOS存储系统支持超配(thin-provisioned)、可伸缩的条带化数据存储系统,它通过librbd库与OSD进行交互。RBD为KVM等虑拟化技术和云OS(如OpenStack和CloudStack)提供高性能和无限可扩展性的存储后端,这些系统依赖于libvirt和QEMU实用程序与RBD进行集成。

客户端基于librbd库即可将RADOS存储集群用作块设备,不过,用于rbd的存储池需要实现启用rbd功能并进行初始化。例如,下面的命令创建rbddata的存储池,在启动rbd功能后对其进行初始化。

1
2
3
4
ceph osd pool create rbdpool 64  # 创建存储池
rbd pool init -p rbdpool # 
rbd create rbdpool/img1 --size 2G 
rbd ls -p rbdpool

不过rbd存储池并不能直接用于块设备,而是需要事先在其中按需创建影响(image)

RBD是建立在librados之上的客户端,全程为Rados Block Devices,是对rados存储服务做抽象,将rados位于存储池当中所提供的存储空间,使用对象式存储数据的能力的机制。

rbd虚拟磁盘设备要想使linux内核所识别使用,要求linux在内核级支持Ceph,内核级有一个Ceph模块,专门用来驱动Ceph设备的。这个驱动就叫librbd。此模块自己是一个客户端,能够连接至RBD服务上,检索出他所管理的镜像文件。从而镜像文件完全可以被linux主机作为一块完整的硬盘来使用。

创建存储池镜像

  • --object-size 任何数据存储在存储池中都被切分为固定大小的对象,对象通常称之为条带,切分的对象大小,默认4M
  • --image-feature 指定镜像文件的特性,每种特性代表镜像文件能支持哪些种功能,可被单独启用或禁用。
    • layering(+), 分层克隆
    • exclusive-lock 排它锁,是否支持分布式排它锁,已用来限制一个镜像文件同时只能被一个客户端使用。
    • object-map(+*) 对象映射,是否支持对象位图,主要用于加速导入、导出及已用容量统的。
    • fast-diff(+*), 快速比较,主要用于做快照之间的比较
    • deep-flatten(+-) , 深层展评
    • journaling 日志,用户在修改image数据时是否记录日志。 shared image
  • --no-progress:不显示创建过程
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ rbd help create
usage: rbd create [--pool <pool>] [--image <image>] 
                  [--image-format <image-format>] [--new-format] 
                  [--order <order>] [--object-size <object-size>] 
                  [--image-feature <image-feature>] [--image-shared] 
                  [--stripe-unit <stripe-unit>] 
                  [--stripe-count <stripe-count>] [--data-pool <data-pool>] 
                  [--journal-splay-width <journal-splay-width>] 
                  [--journal-object-size <journal-object-size>] 
                  [--journal-pool <journal-pool>] 
                  [--thick-provision] --size <size> [--no-progress] 
                  <image-spec> 

Create an empty image.

ceph osd pool create kube 64 64
ceph osd pool application enable kube rbd
rbd pool init kube

rbd create --size 2G --pool kube --image vol01 # 使用各个选项

rbd create --size 2G kube/vol02  # <image-spec> 

获取对象更详细信息

PARENT 父镜像

FMT 格式,一般只有v2

PROT

LOCK

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$ rbd ls -l --pool kube
NAME   SIZE PARENT FMT PROT LOCK 
vol01 5 GiB          2 

$ rbd ls -l --pool kube --format json --pretty-format
[
    {
        "image": "vol01",
        "size": 5368709120,
        "format": 2
    }
]

获取镜像文件更详细一部镜像信息,可以使用rbd info命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
$ rbd info kube/vol01
rbd image 'vol01':
        size 5 GiB in 1280 objects
        order 22 (4 MiB objects)
        id: 5e386b8b4567
        block_name_prefix: rbd_data.5e386b8b4567
        format: 2
        features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
        op_features: 
        flags: 
        create_timestamp: Mon Jun 24 05:42:00 2019


$ rbd info --pool kube --image vol01
rbd image 'vol01':
        size 5 GiB in 1280 objects
        order 22 (4 MiB objects)
        id: 5e386b8b4567
        block_name_prefix: rbd_data.5e386b8b4567
        format: 2
        features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
        op_features: 
        flags: 
        create_timestamp: Mon Jun 24 05:42:00 2019


$ rbd info --pool kube vol01        
rbd image 'vol01':  # 镜像文件是谁
        size 5 GiB in 1280 objects # 镜像总体是多大空间,被分割成多少个对象
        order 22 (4 MiB objects) # 顺序是22,顺序是指块大小的标识序号 # 如64k开始64m结束,4M大小正好排在第22位
        id: 5e386b8b4567 # 镜像文件自身id
        block_name_prefix: rbd_data.5e386b8b4567
        format: 2 # 镜像文件格式
        features: layering, exclusive-lock, object-map, fast-diff, deep-flatten # 启动的特性
        op_features:  
        flags: 
        create_timestamp: Mon Jun 24 05:42:00 2019
        
# object-map, fast-diff, deep-flatten种特性在被linux客户端作为磁盘加载到内核中使用时是不被支持的。需将其禁用掉        

禁用或启用某种特性 rbd featrue

1
2
3
rbd feature disable|enable

rbd feature disable kube/vol01 object-map fast-diff deep-flatten
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ rbd info --pool kube vol01
rbd image 'vol01':
        size 5 GiB in 1280 objects
        order 22 (4 MiB objects)
        id: 5e386b8b4567
        block_name_prefix: rbd_data.5e386b8b4567
        format: 2
        features: layering, exclusive-lock
        op_features: 
        flags: 
        create_timestamp: Mon Jun 24 05:42:00 2019

Ceph客户端使用块设备步骤

  • 创建出镜像文件。
  • 在镜像文件上禁用默认启用的五个特性中的后三个。
  • 在客户端上使用指定命令以指定的用户的身份连入客户端。
  • 配置客户端上yum仓库文件

ceph命令默认是以admin为账号的,使用--user指定其他用户。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ ceph -s
2019-06-25 10:48:11.283 7f999daa3700 -1 auth: unable to find a keyring on /etc/ceph/ceph.client.admin.keyring,/etc/ceph/ceph.keyring,/etc/ceph/keyring,/etc/ceph/keyring.bin,: (2) No such file or directory
2019-06-25 10:48:11.283 7f999daa3700 -1 monclient: ERROR: missing keyring, cannot use cephx for authentication
[errno 2] error connecting to the cluster

$ ceph --user kube -s
  cluster:
    id:     69fb9b55-3fb5-42d0-8cf7-239a3b569791
    health: HEALTH_WARN
            1 pool(s) full
            application not enabled on 1 pool(s)
 
  services:
    mon: 3 daemons, quorum stor01,stor02,stor03
    mgr: stor01(active), standbys: stor04
    mds: cephfs-1/1/1 up  {0=stor02=up:active}
    osd: 8 osds: 8 up, 8 in
    rgw: 1 daemon active
 
  data:
    pools:   9 pools, 352 pgs
    objects: 254  objects, 3.7 KiB
    usage:   49 GiB used, 51 GiB / 100 GiB avail
    pgs:     352 active+clean

需要操作系统支持ceph.ko模块

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
$ modinfo ceph
filename:       /lib/modules/3.10.0-957.12.1.el7.x86_64/kernel/fs/ceph/ceph.ko.xz
license:        GPL
description:    Ceph filesystem for Linux
author:         Patience Warnick <patience@newdream.net>
author:         Yehuda Sadeh <yehuda@hq.newdream.net>
author:         Sage Weil <sage@newdream.net>
alias:          fs-ceph
retpoline:      Y
rhelversion:    7.6
srcversion:     43DA49DF11334B2A5652931
depends:        libceph
intree:         Y
vermagic:       3.10.0-957.12.1.el7.x86_64 SMP mod_unload modversions 
signer:         CentOS Linux kernel signing key
sig_key:        2C:7C:17:70:5C:86:D4:20:80:50:D3:F5:54:56:9A:7B:D3:BF:D1:BF
sig_hashalgo:   sha256

显示设备map信息

1
2
3
$ rbd showmapped
id pool image snap device    
0  kube vol01 -    /dev/rbd0 

显示设备挂在到哪里

1
2
3
4
5
6
$ rbd showmapped
id pool image snap device    
0  kube vol01 -    /dev/rbd0 

NAME   SIZE PARENT FMT PROT LOCK 
vol01 5 GiB          2      excl 

卸载挂载

1
2
3
$ umount /dev/rbd0  # 需要先卸载rbd挂载
$ rbd unmap /dev/rbd0 
$ rbd showmapped

调整镜像文件空间容量

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
$  rbd help resize 
usage: rbd resize [--pool <pool>] [--image <image>] --size <size> 
                  [--allow-shrink] [--no-progress] 
                  <image-spec> 

Resize (expand or shrink) image.

Positional arguments
  <image-spec>         image specification
                       (example: [<pool-name>/]<image-name>)

Optional arguments
  -p [ --pool ] arg    pool name
  --image arg          image name
  -s [ --size ] arg    image size (in M/G/T) [default: M] 
  --allow-shrink       permit shrinking # 允许收缩,不要收缩到已有数据占用容量、以下
  --no-progress        disable progress output
  
1
2
3
4
5
6
$ rbd resize -s 10G kube/vol01
Resizing image: 100% complete...done.

$ rbd ls -p kube -l
NAME    SIZE PARENT FMT PROT LOCK 
vol01 10 GiB  

删除镜像文件

镜像文件被删除是不可恢复的

1
2
3
4
5
$ rbd rm kube/vol01
Removing image: 100% complete...done.

$ rbd ls -p kube -l
$ 

rbd回收站trash

将镜像挪入回收站中

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$ rbd ls -p kube -l
NAME   SIZE PARENT FMT PROT LOCK 
vol01 2 GiB          2           
vol02 2 GiB          2       

$ rbd trash move kube/vol01

$ rbd ls -p kube -l       
NAME   SIZE PARENT FMT PROT LOCK 
vol02 2 GiB          2           

$ rbd trash list -p kube
5ebf6b8b4567 vol01

从trash恢复镜像

1
2
3
4
5
6
7
8
$ rbd trash list -p kube
5ebf6b8b4567 vol01
 
$ rbd trash restore -p kube --image vol01 --image-id 5ebf6b8b4567

$ rbd ls -p kube 
vol01
vol02

如何对镜像文件做快照、克隆

快照是什么?

快照是一种能够瞬间生成数据访问目录,能够支持备份技术的一种数据管理手段。有全量快照与增量快照两种。全量快照一般使用镜像分离技术实现,而增量快照则由COW写时拷贝快照技术ROW写时重定向。 写时复制是指,当写的时候,将数据复制到快照上去修改源数据;写时重定向是指,写的时候直接去写快照,改变快照上的数据,源卷上的数据不变。

snap相关命令

命令 说明
snap create (snap add) 创建快照
snap limit clear 清除快照数量限制
snap limit set 设定一个镜像文件上所能够创建的快照问价你的上线
snap list (snap ls) 列出快照
snap protect 保护快照
snap purge 清理快照
snap remove (snap rm) 移除快照
snap rename 重命名快照
snap rollback (snap revert) 回滚快照,做快照恢复
snap unprotect 解除保护,protect的相反操作。

为镜像创建快照

rbd snap create只需为哪个镜像创建什么快照就可以了

1
2
3
4
5
6
rbd snap create kube/vol01@snap1

$ rbd snap list kube/vol01

SNAPID NAME   SIZE TIMESTAMP                
     4 snap1 2 GiB Thu Jun 27 14:00:36 2019 

快照恢复

首先先将服务停止(拆除)

1
2
umount /rdb # 卸载挂载
rbd unmap /dev/rbd0 # 拆除连接

回到管理节点做回滚操作

使用rbd snap rollback

1
2
$ rbd snap rollback kube/vol01@snap1
Rolling back to snapshot: 100% complete...done.

回到客户端再一次将映射挂载访问

1
2
3
4
5
6
7
rbd --user kube map /dev/rbd0 # 映射
mount /dev/rbd0 /rdb # 挂载

# 查看数据

$ ls
lost+found  passwd

删除快照

1
rbd snap rm kube.vol01@snap1

限制镜像文件所能够创建的快照数量

1
2
3
4
5
6
rbd snap limit set kube/vol01 --limit 2

$  rbd snap create kube/vol01@snap03
rbd: failed to create snapshot: (122) Disk quota exceeded

rbd snap limit clear kube/vol01 # 清除限制

多层快照技术

对原始镜像文件做一次快照,将此快照置于保护模式下。快照所能访问的数据一定是做快照那一刻原始卷上的所有数据的。就算修改原始卷内容,也不会影响快照访问。基于快照再做一层快照。而二级快照是可以当镜像来用的。因此基于保护快照可以创建N个克隆。每一个克隆都可以按照自己的意愿去做希望所做的后续修改操作。

模板池,提供克隆模板的。

工作流程

  • 创建镜像
  • 对镜像做快照
  • 对快照做保护
  • 对快照做克隆

在管理断创建快照,将此快照当做保护模式下的快照,当做创建克隆时的模板

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ rbd snap create kube/vol01@clonetpl1

$ rbd snap ls
rbd: image name was not specified

$ rbd snap ls kube/vol01
SNAPID NAME        SIZE TIMESTAMP                
     4 snap1      2 GiB Thu Jun 27 14:00:36 2019 
     5 snap02     2 GiB Thu Jun 27 14:41:25 2019 
     8 clonetpl1 10 GiB Thu Jun 27 20:43:48 2019 

置入保护模式

1
2
3
$ rbd snap protect kube/vol01@clonetpl1

rbd snap unprotect kube/vol01:clonetpl1 # 解除保护

给快照再次做快照,称之为clone。==可支持跨存储池进行克隆==

1
2
3
4
$ rbd clone kube/vol01@clonetpl1 test/myimg01 # 是一个镜像,可被当做真正镜像使用

$ rbd ls -p test
myimg01

rbd chlidren显示一个快照的子项

1
2
3
$ rbd children kube/vol01@clonetpl1  
kube/myimg01
test/myimg01

数据展平 flatten

当vol01被删除时,他的上层快照myimg01就无根了,因此需要做数据展平,已确保他所应用的每一个底层快照上的所有数据都被复制到当前镜像中。

1
2
$ rbd flatten kube/myimg01
Image flatten: 100% complete...done.

本文发布于Cylon的收藏册,转载请著名原文链接~

链接:Ceph RBD - 关于RBD的操作与管理

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」 许可协议进行许可。