ceph集群rbd使用详解

一个完整的ceph集群,可以提供块存储、文件系统和对象存储。

本节主要介绍rbd存储功能如何灵活的使用,集群背景:

$ ceph -s
cluster:
id: 537175bb-51de-4cc4-9ee3-b5ba8842bff2
health: HEALTH_OK services:
mon: 3 daemons, quorum ceph-node1,ceph-node2,ceph-node3 (age 2m)
mgr: ceph-node1(active, since 2d), standbys: ceph-node2
mds: mycephfs:1 {0=ceph-node2=up:active} 1 up:standby
osd: 12 osds: 12 up (since 30h), 12 in (since 30h)
rgw: 2 daemons active (ceph-node1, ceph-node2) task status: data:
pools: 7 pools, 201 pgs
objects: 212 objects, 6.9 KiB
usage: 12 GiB used, 1.2 TiB / 1.2 TiB avail
pgs: 201 active+clean

rbd(块存储)介绍及使用

rbd介绍

RBD即RADOS Block Device的简称,RBD块存储是最稳定且最常用的存储类型。RBD块设备类似磁盘可以被格式化、挂载。RBD块设备具有快照、多副本、克隆和一致性等特性,数据以条带化的方式存储在Ceph集群的多个OSD中。

rbd工作流程

  1. 客户端创建一个pool,并指定pg数量,创建rbd设备并挂载;
  1. 用户写入数据,ceph进行对数据切块,每个块的大小默认为4M,每个块名字是object+序号;
  2. 将每个object通过哈希算法分配给对应的pg;
  3. pg根据crush算法会寻找3个osd(假设副本数为3),把这object分别保存在这3个osd上存储,这一组osd就是pgp的概念;
  4. osd实际把硬盘格式化为xfs文件系统,object存储在这个文件系统就相当于存储了一个文件rbd0.object1.file。

rbd创建及使用

某节点想要挂载、创建或使用rbd功能,必须满足以下两个条件

  1. 有操纵ceph集群的能力,也就是必须要有ceph.conf文件
  2. 要有ceph客户端相关组件,也就是ceph-common组件包
(1)创建
## 创建pool
$ ceph osd pool create myrbd1 64 64
pool 'myrbd1' created ## 将此pool启动rbd功能
$ ceph osd pool application enable myrbd1 rbd
enabled application 'rbd' on pool 'myrbd1' ## 初始化pool池
$ rbd pool init -p myrbd1 ## 创建一个10G大小的块镜像
$ rbd create --size 10240 myrbd1/image01 ## 查看存储池中的image
$ rbd ls --pool myrbd1
image01 ## 查看镜像详情
$ rbd info myrbd1/image01
rbd image 'image01':
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 121a89b2ad1f2
block_name_prefix: rbd_data.121a89b2ad1f2
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Mon Feb 21 11:24:07 2022
access_timestamp: Mon Feb 21 11:24:07 2022
modify_timestamp: Mon Feb 21 11:24:07 2022
(2)映射到客户端机器内核
## 映射到内核
# rbd map myrbd1/image01
rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable myrbd1/image01 object-map fast-diff deep-flatten".
In some cases useful info is found in syslog - try "dmesg | tail".
rbd: map failed: (6) No such device or address

以上有报错,因为ceph rbd很多特性基于内核,提示此版本内核不支持object-map fast-diff deep-flatten特性

将此特性关闭

rbd feature disable myrbd1/image01 object-map fast-diff deep-flatten

再次映射

# rbd map myrbd1/image01

## 查看机器块设备
lsblk | grep rbd
rbd0 252:0 0 10G 0 disk ## List mapped rbd images.
# rbd showmapped
id pool namespace image snap device
0 myrbd1 image01 - /dev/rbd0
(3)格式化、挂载、测试、持久化
# mkfs.xfs /dev/rbd0
# mount /dev/rbd0 /mnt/

测试读写

# for((i=1;i<=20;i++));do echo $i > $i.txt;done
# ls
10.txt 12.txt 14.txt 16.txt 18.txt 1.txt 2.txt 4.txt 6.txt 8.txt
11.txt 13.txt 15.txt 17.txt 19.txt 20.txt 3.txt 5.txt 7.txt 9.txt
# cat 1.txt
1

卸载image

# umount /dev/rbd0
# rbd unmap myrbd1/image01

如果取消映射失败,提示设备忙,则加上-o force参数

映射到其他机器,检查数据是否还存在

# mount /dev/rbd0 /mnt/rbd/
# cd /mnt/rbd
# ls
10.txt 12.txt 14.txt 16.txt 18.txt 1.txt 2.txt 4.txt 6.txt 8.txt
11.txt 13.txt 15.txt 17.txt 19.txt 20.txt 3.txt 5.txt 7.txt 9.txt
# cat 1.txt
1

测试完毕,未丢失数据。

(4)修改rbd image存储空间大小
$ rbd resize myrbd1/image01 --size 15G
Resizing image: 100% complete...done. $ rbd info myrbd1/image01
rbd image 'image01':
size 15 GiB in 3840 objects
order 22 (4 MiB objects)

image01修改至15G大小

目前查看大小还是10G:

# df -h | grep mnt
/dev/rbd0 10G 33M 10G 1% /mnt

resize后,内核会直接识别到,不用重新map,直接刷新块设备即可:

# xfs_growfs /dev/rbd0
meta-data=/dev/rbd0 isize=512 agcount=16, agsize=163840 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=2621440, imaxpct=25
= sunit=1024 swidth=1024 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=8 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 2621440 to 3932160 # df -h | grep mnt
/dev/rbd0 15G 34M 15G 1% /mnt

xfs用xfs_growfs命令刷新,ext4和ext3用resize2fs

rbd快照的使用

(1)快照: 在某个时间点的副本,当系统出现问题,可以通过恢复快照恢复之前副本状态。

创建快照

$ rbd snap create myrbd1/image01@snap01

$ rbd snap list myrbd1/image01
SNAPID NAME SIZE PROTECTED TIMESTAMP
4 snap01 10 GiB Tue Feb 22 11:33:32 2022 $ rbd info myrbd1/image01@snap01
rbd image 'image01':
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
snapshot_count: 1
id: 121a89b2ad1f2
block_name_prefix: rbd_data.121a89b2ad1f2
format: 2
features: layering, exclusive-lock
op_features:
flags:
create_timestamp: Mon Feb 21 11:24:07 2022
access_timestamp: Mon Feb 21 11:24:07 2022
modify_timestamp: Mon Feb 21 11:24:07 2022
protected: False

模拟删除数据,恢复快照

# ls
10.txt 12.txt 14.txt 16.txt 18.txt 1.txt 2.txt 4.txt 6.txt 8.txt
11.txt 13.txt 15.txt 17.txt 19.txt 20.txt 3.txt 5.txt 7.txt 9.txt
# rm -f *
# cd ..
# umount /dev/rbd0
# rbd unmap myrbd1/image01 ## 恢复
$ rbd snap rollback myrbd1/image01@snap01
Rolling back to snapshot: 100% complete...done.

注意:恢复快照前,需要先将rbd设备umount和取消内核映射,然后再进行rollback。

重新挂载,验证数据是否恢复

# rbd map myrbd1/image01
# mount /dev/rbd0 /mnt/rbd/
# ls
10.txt 12.txt 14.txt 16.txt 18.txt 1.txt 2.txt 4.txt 6.txt 8.txt
11.txt 13.txt 15.txt 17.txt 19.txt 20.txt 3.txt 5.txt 7.txt 9.txt

数据恢复完成

(2)克隆: 基于指定的块设备克隆出相同的一份出来

克隆是要基于块设备的快照进行的,我们之前用上一步所创建出来的snap01来进行演示克隆功能。

设置快照处于被保护状态(快照必须处于被保护状态才能被克隆)

## 设为被保护状态
$ rbd snap protect myrbd1/image01@snap01 ## 查看详情,主要是protected变成了TRUE
$ rbd info myrbd1/image01@snap01
rbd image 'image01':
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
snapshot_count: 1
...
protected: True

通过快照克隆一个新块设备

## 克隆
rbd clone replicapool/image01@snap01 replicapool/image01_clone ## 查看目前所有image
# rbd ls replicapool
image01
image01_clone ## 查看克隆块设备信息
# rbd info replicapool/image01_clone
rbd image 'image01_clone':
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 8549a76ff74f
block_name_prefix: rbd_data.8549a76ff74f
format: 2
features: layering
op_features:
flags:
create_timestamp: Tue Mar 29 14:40:51 2022
access_timestamp: Tue Mar 29 14:40:51 2022
modify_timestamp: Tue Mar 29 14:40:51 2022
parent: replicapool/image01@snap01
overlap: 10 GiB

这个克隆设备主要多了 parent: myrbd1/image01@snap01 这行配置,表示它的父关系

取消其父关系,使其独立,随后再进行mount测试

## 独立于父块设备
# rbd flatten myrbd1/image01_clone
Image flatten: 100% complete...done. ## 找其他机器,映射其克隆设备
# rbd map myrbd1/image01_clone
/dev/rbd1 # mount 即可

需要注意:根据块设备的快照克隆的块设备UUID不发生改变,所以克隆的块设备不能和原块设备挂载同一台主机上,否则会产生冲突:

/dev/rbd0: UUID="14e60e20-3620-4177-a453-400b00caad1b" TYPE="xfs"
/dev/rbd1: UUID="14e60e20-3620-4177-a453-400b00caad1b" TYPE="xfs"

rbd快照删除

$ rbd snap remove myrbd1/image01@snap01
Removing snap: 100% complete...done.
$ rbd snap list myrbd1/image01

导入导出RBD镜像

1.导出rbd镜像

# rbd export myrbd1/image01 /home/nfs/image01_bak
Exporting image: 100% complete...done.

2.导入镜像,恢复数据

先删除image01

## 快照要提前删完
# rbd snap remove replicapool/image01@snap01
Removing snap: 100% complete...done. ## 删除镜像
# rbd remove replicapool/image01
Removing image: 100% complete...done.

重新导入镜像

# rbd import /home/nfs/image01_bak myrbd1/image01  --image-format 2
Importing image: 100% complete...done.

重新挂载测试数据是否存在

# rbd map replicapool/image01
/dev/rbd0 # mount /dev/rbd0 /mnt/
# ls /mnt/
10.txt 12.txt 14.txt 16.txt 18.txt 1.txt 2.txt 4.txt 6.txt 8.txt
11.txt 13.txt 15.txt 17.txt 19.txt 20.txt 3.txt 5.txt 7.txt 9.txt

没什么问题

rbd使用普通用户挂载

首先,某节点想要挂载、创建或使用rbd功能,必须满足以下两个条件

  1. 有操纵ceph集群的能力,也就是必须要有ceph.conf文件
  2. 要有ceph客户端相关组件,也就是ceph-common组件包
(1)查看当前所有用户及权限
$ ceph auth list
installed auth entries: mds.ceph-node1
key: AQBoFg9iVjO6DhAADSCzL/Njv16XONHBAPuRLA==
caps: [mds] allow
caps: [mon] allow profile mds
caps: [osd] allow rwx
mds.ceph-node2
key: AQCGFg9icS7TCBAAGvFfz/C5Av0P6Hu1Ws5SUw==
caps: [mds] allow
caps: [mon] allow profile mds
caps: [osd] allow rwx
...

默认情况下,ceph每个组件都会创建对应的用户,每个用户都有自己对应的的权限。

授权类型

权限 说明
r 向用户授予读取权限。读取集群各个组件(MON/OSD/MDS/CRUSH/PG)的状态。访问监视器(mon)以检索 CRUSH 运行图时需具有此能力。
w 向用户授予针对对象的写入权限。
x 授予用户调用类方法(包括读取和写入)的能力,以及在监视器中执行 auth 操作的能力。
* 授予用户对特定守护进程/存储池的读取、写入和执行权限,以及执行管理命令的能力
class-read 授予用户调用类读取方法的能力,属于是 x 能力的子集。
class-write 授予用户调用类写入方法的能力,属于是 x 能力的子集。
profile osd 授予用户以某个 OSD 身份连接到其他 OSD 或监视器的权限。授予 OSD 权限,使 OSD 能够处理复制检测信号流量和状态报告。
profile mds 授予用户以某个 MDS 身份连接到其他 MDS 或监视器的权限。
profile bootstrap-osd 授予用户引导 OSD 的权限(初始化 OSD 并将 OSD 加入 ceph 集群),授 权给部署工具,使其在引导 OSD 时有权添加密钥。
profile bootstrap-mds 授予用户引导元数据服务器的权限,授权部署工具权限,使其在引导 元数据服务器时有权添加密钥。

获取指定用户权限信息:

$ ceph auth get client.admin
exported keyring for client.admin
[client.admin]
key = AQA0bgdi30YtIRAABefFzbzVQw0vCttrjeqirA==
caps mds = "allow *"
caps mgr = "allow *"
caps mon = "allow *"
caps osd = "allow *"
(2)创建普通用户,并赋予对应的权限
## 创建 client.vfan 用户,并授权可读 MON、可读写 OSD
$ ceph auth add client.vfan mon 'allow r' osd 'allow rw pool=myrbd1'
added key for client.vfan $ ceph auth get client.vfan
exported keyring for client.vfan
[client.vfan]
key = AQCq2CViGig9HxAA64YqzL85idfTn3TRzE18dQ==
caps mon = "allow r"
caps osd = "allow rw pool=myrbd1" ## 如果该用户已存在,此命令只以密钥文件格式返回用户名和密钥。授权可读 MON,可读写 OSD
$ ceph auth get-or-create client.tom mon 'allow r' osd 'allow rw pool=myrbd1'
[client.tom]
key = AQDh2SVi+cFJJhAAXZomi67Sfd7vbbUE9MmHDw== ## 如果该用户已存在,此命令只返回密钥。授权可读 MON,可读写 OSD
$ ceph auth get-or-create-key client.tony mon 'allow r' osd 'allow rw pool=myrbd1'
AQAV2iVizi0pLhAA1RXFbxcYeDZqJxtKW9ZzSg==
(3)传输用户密钥至客户端主机

当客户端访问 ceph 集群时,ceph 会使用以下四个密钥环文件预设置密钥环设置:

/etc/ceph/<$cluster name>.<user $type>.<user $id>.keyring # 保存单个用户的 keyring
/etc/ceph/cluster.keyring # 保存多个用户的 keyring
/etc/ceph/keyring # 未定义集群名称的多个用户的 keyring
/etc/ceph/keyring.bin # 编译后的二进制文件

创建普通用户密钥权限文件:

$ ceph auth get client.vfan -o ceph.client.vfan.keyring
$ cat ceph.client.vfan.keyring
[client.vfan]
key = AQCq2CViGig9HxAA64YqzL85idfTn3TRzE18dQ==
caps mon = "allow r"
caps osd = "allow rw pool=myrbd1"

此文件还可以进行用户恢复操作,具体命令ceph auth import -i ceph.client.vfan.keyring,这种恢复方式,用户key值不会发生改变。

将密钥权限文件传输至客户端主机:

$ sudo scp ceph.client.vfan.keyring ceph-node2:/etc/ceph/
(4)客户端使用普通用户测试访问集群
# ceph --user vfan -s
cluster:
id: 537175bb-51de-4cc4-9ee3-b5ba8842bff2
health: HEALTH_OK services:
mon: 3 daemons, quorum ceph-node1,ceph-node2,ceph-node3 (age 2m)
mgr: ceph-node1(active, since 2d), standbys: ceph-node2
mds: mycephfs:1 {0=ceph-node2=up:active} 1 up:standby
osd: 12 osds: 12 up (since 30h), 12 in (since 30h)
rgw: 2 daemons active (ceph-node1, ceph-node2) task status: data:
pools: 8 pools, 265 pgs
objects: 273 objects, 14 MiB
usage: 8.1 GiB used, 792 GiB / 800 GiB avail
pgs: 265 active+clean

默认情况下,ceph是用admin用户,可以使用--user指定用户。

(5)普通用户挂载rbd

因为之前创建用户赋予权限时没有给osd的x权限,现在重新赋予一下权限:

$ ceph auth caps client.vfan mon 'allow r' osd 'allow rwx pool=myrbd1'updated caps for client.vfan

映射到内核,挂载rbd

$ sudo rbd map myrbd1/image01 --user vfan
$ sudo mount /dev/rbd0 /mnt/
$ ls /mnt/
10.txt 12.txt 14.txt 16.txt 18.txt 1.txt 2.txt 4.txt 6.txt 8.txt
11.txt 13.txt 15.txt 17.txt 19.txt 20.txt 3.txt 5.txt 7.txt 9.txt

取消映射

$ sudo rbd unmap myrbd1/image01 --user vfan
(6)其他操作如更改镜像大小、创建快照、克隆等功能,均与admin用户操作相同,只不过每条命令后边会添加--user [用户名]的操作,例如:
$ rbd resize replicapool/image01 --size 15G --user vfan
Resizing image: 100% complete...done.

至此rbd常用功能已演示完毕,接下来介绍cephfs和对象存储的使用。

CEPH-2:rbd功能详解及普通用户应用ceph集群的更多相关文章

  1. Redis详解(十)------ 从零开始搭建集群

    在上一篇博客我们介绍了------Redis哨兵(Sentinel)模式,哨兵模式主要是解决高可用问题,在master节点宕机时,slave节点能够自动切换成为master节点 本篇博客我们来介绍Re ...

  2. CentOS7+CDH5.14.0安装全流程记录,图文详解全程实测-8CDH5安装和集群配置

    Cloudera Manager Server和Agent都启动以后,就可以进行CDH5的安装配置了.      准备文件 从 http://archive.cloudera.com/cdh5/par ...

  3. Keepalived详解(五):Keepalived集群中MASTER和BACKUP角色选举策略【转】

    一.Keepalived集群中MASTER和BACKUP角色选举策略 在keepalived集群中,其实并没有严格意义上的主.备节点,虽然可以在keepalived配置文件中设置state选项为MAS ...

  4. 大数据入门第十七天——storm上游数据源 之kafka详解(一)入门与集群安装

    一.概述 1.kafka是什么 根据标题可以有个概念:kafka是storm的上游数据源之一,也是一对经典的组合,就像郭德纲和于谦 根据官网:http://kafka.apache.org/intro ...

  5. 大数据入门第十六天——流式计算之storm详解(一)入门与集群安装

    一.概述 今天起就正式进入了流式计算.这里先解释一下流式计算的概念 离线计算 离线计算:批量获取数据.批量传输数据.周期性批量计算数据.数据展示 代表技术:Sqoop批量导入数据.HDFS批量存储数据 ...

  6. 联想ThinkPad S3-S440虚拟机安装,ubuntu安装,Hadoop(2.7.1)详解及WordCount运行,spark集群搭建

    下载ubuntu操作系统版本 ubuntu-14.10-desktop-amd64.iso(64位) 安装过程出现错误: This kernel requires an X86-64 CPU,but ...

  7. Kafka详解二:如何配置Kafka集群

    问题导读1.Kafka有哪几种配制方法?2.如何启动一个Consumer实例来消费消息? Kafka集群配置比较简单,为了更好的让大家理解,在这里要分别介绍下面三种配置 单节点:一个broker的集群 ...

  8. CEPH-4:ceph RadowGW对象存储功能详解

    ceph RadosGW对象存储使用详解 一个完整的ceph集群,可以提供块存储.文件系统和对象存储. 本节主要介绍对象存储RadosGw功能如何灵活的使用,集群背景: $ ceph -s clust ...

  9. CEPH-3:cephfs功能详解

    ceph集群cephfs使用详解 一个完整的ceph集群,可以提供块存储.文件系统和对象存储. 本节主要介绍文件系统cephfs功能如何灵活的使用,集群背景: [cephadmin@yq01-aip- ...

随机推荐

  1. SQL注入蠕虫分析//未完待续

    蠕虫代码: DECLARE @S VARCHAR(4000);SET @S=CAST(0x4445434C415245204054205641524348415228323535292C4043205 ...

  2. Python基础—名称空间(Day10)

    一.名称空间和作用域 1.全局名称空间(名称空间.命名空间): py文件运行时代码从上之下依次执行,看到一个变量就会将这个变量与对应值的内存地址的关系存到名称空间里,代码要运行时(print时)从名称 ...

  3. 私有化轻量级持续集成部署方案--05-持续部署服务-Drone(上)

    提示:本系列笔记全部存在于 Github, 可以直接在 Github 查看全部笔记 持续部署概述 持续部署是能以自动化方式,频繁而且持续性的,将软件部署到生产环境.使软件产品能够快速迭代. 在之前部署 ...

  4. IPv6 OSPFv3路由协议测试——信而泰网络测试仪实操

    关键词 IPv6; OSPFv3; OSPFv2. 前言:在网络部署中,动态路由协议是重要的组成部分.良好的路由协议,是保证网络可靠.稳定运行的基础.为了适应IPv6协议栈的变化,OSPFv3协议在保 ...

  5. 年底获奖人太多?奖状可以用Smartbi电子表格这么做!

    又到一年年终时,你的年终奖到手了吗?奖金没领到,发个奖状压压惊 今天给大家分享年终奖相关的年终奖状的批量套打功能,保证你的奖状及时到手! 示例说明 现有多个人员的奖励需要通知,需要生成可翻页的奖状.并 ...

  6. git子模块的使用

    1. 在项目中添加子模块 命令: git submodule add <url> 例子: git submodule add https://github.com/chaconinc/Db ...

  7. 【计理01组30号】Java 实现日记写作软件

    项目分析 代码设计 com.shiyanlou.entity User.java package com.shiyanlou.entity; public class User { private S ...

  8. oj教程--坑

    1.OJ判断是只看输出结果的. 2.纯字符串用puts()输出. 3.有很多数学题是有规律的,直接推公式或用递归.循环. 4.擅用三目运算符 5.将乘法转换成加法减少时间 6.空间换时间 7.数组越界

  9. 记一次加密的ts视频下载

    想要下载一个视频,但是网站上不能直接下载.试过IDM,以及Streaming Video Recorder 都不行.因为视频被加密了. ts 是分片的视频文件,m3u8 是播放索引列表(还可配置其他参 ...

  10. Tableau学习Step6一如何制作炫彩地图

    Tableau学习Step6一如何制作炫彩地图 本文首发于博客冰山一树Sankey,去博客浏览效果更好. 一.统计地图概述 1.1 统计地图的基本概念 统计地图的本质:数据的正确对应 将数据信息和地理 ...