块存储管理系列文章

(1)RBD 基本使用 - Storage6

(2)iSCSI 网关管理 - Storage6

(3)使用 librbd 将虚拟机运行在 Ceph RBD

(4)RBD Mirror 容灾


Ceph 块存储

Ceph 块设备允许共享物理资源,并且可以调整大小。它们会在 Ceph 集群中的多个 OSD 上等量存储数据。Ceph 块设备会利用 RADOS 功能,例如创建快照、复制和一致性。Ceph 的 RADOS块设备 (RBD) 使用内核模块或 librbd 库与 OSD 交互。

Ceph 的块设备为内核模块提供高性能及无限的可扩展性。它们支持虚拟化解决方案(例如QEMU)或依赖于 libvirt 的基于云的计算系统(例如 OpenStack)。您可以使用同一个集群来同时操作对象网关、CephFS 和 RADOS 块设备。

创建RBD

(1) 客户端安装rbd包

# zypper se ceph-common
# zypper in ceph-common

(2)显示帮助信息

# rbd help <command> <subcommand>
# rbd help snap list

(3) 复制配置文件和key

# scp admin:/etc/ceph/ceph.conf .
# scp admin:/etc/ceph/ceph.client.admin.keyring .

(4)创建块设备

# ceph osd pool create rbd   replicated
# rbd create test001 --size --pool rbd
# rbd ls
test001

(5)映射块设备

# rbd map test001
/dev/rbd0

(6)查看已映射设备

# rbd showmapped
id pool image snap device
rbd test001 - /dev/rbd0

(7)格式化块设备,并且挂载

# mkfs.xfs -q /dev/rbd0
# mkdir /mnt/ceph-test001
# mount /dev/rbd/rbd/test001 /mnt/ceph-test001/

注意:rbd的指令如果省略-p / --pool参数,则会默认-p rbd,而这个rbd pool是默认生成的。

  • 检查挂载情况
# df -Th
Filesystem              Type      Size  Used Avail Use% Mounted on
/dev/rbd0 xfs 1014M 33M 982M % /mnt/ceph-test001
  • 检查rbd镜像的信息
# rbd --image test001 info
rbd image 'test001':
size GiB in objects
order ( MiB objects)
snapshot_count:
id: 408ea3f9d1c3b
block_name_prefix: rbd_data.408ea3f9d1c3b
format:
features: layering
op_features:
flags:
create_timestamp: Mon Sep ::
access_timestamp: Mon Sep ::
modify_timestamp: Mon Sep ::
  • size: 就是这个块的大小,即1024MB=1G,1024MB/256 = 4M,共分成了256个对象(object),每个对象4M
  • order 22, 22是个编号,4M是22, 8M是23,也就是2^22 bytes = 4MB, 2^23 bytes = 8MB。
  • block_name_prefix: 这个是块的最重要的属性了,这是每个块在ceph中的唯一前缀编号,有了这个前缀,把服务器上的OSD都拔下来带回家,就能复活所有的VM了。
  • format : 格式有两种,1和2

(8) 设置自动挂载

# vim /etc/ceph/rbdmap
rbd/test001 id=admin,keyring=/etc/ceph/ceph.client.admin.keyring
# systemctl start rbdmap.service
# systemctl enable rbdmap.service
# systemctl status rbdmap.service
# vim /etc/fstab
/dev/rbd/rbd/test001 /mnt/ceph-test001 xfs defaults,noatime,_netdev
# mount -a

RBD 扩容 缩容

(1)查看rbd0 原有大小为1024M

# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/rbd0 xfs 1014M 33M 982M % /mnt/ceph-test001

# rbd --image test001 info
rbd image 'test001':
size 1 GiB in 256 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 408ea3f9d1c3b
block_name_prefix: rbd_data.408ea3f9d1c3b
format: 2
features: layering
op_features:
flags:

(2)在线扩容

# rbd resize rbd/test001 --size
Resizing image: % complete...done.
# rbd --image test001 info
rbd image 'test001':
size 4 GiB in 1024 objects
order ( MiB objects)
snapshot_count:
id: 408ea3f9d1c3b
block_name_prefix: rbd_data.408ea3f9d1c3b
format:
features: layering
op_features:
flags:
create_timestamp: Mon Sep ::
access_timestamp: Mon Sep ::
modify_timestamp: Mon Sep ::

(3)文件系统扩容

# xfs_growfs /mnt/ceph-test001/
# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/rbd0 xfs 4.0G 34M .0G % /mnt/ceph-test001

(4)在线缩小(XFS文件系统不支持缩小)

# rbd -p rbd resize test001 --size  --allow-shrink

RBD 快照和回滚

  • 快照: 某块设备在一个特定时间点的一份只读副本,可以通过创建和恢复快照来保持RBD镜像的状体已经从快照恢复原始数据。
  • 快照是在集群中操作,并不知道客户端是否有额外的数据,当有很重的IO时,会有dirt脏数据没有刷到磁盘上去,快照是无法保持这部分数据。
  • Ceph 支持快照分层,这可让您轻松快速地克隆 VM 映像。
  • Ceph 使用 rbd 命令和许多高级接口(包括QEMU、 libvirt 、OpenStack 和 CloudStack)支持块设备快照。
  • 注意:做快照前,请先客户端停止IO并同步块数据。

1)     在block设备上创建文件

# echo "Ceph This is snapshot test" > /mnt/ceph-test001/snapshot_test_file

# cat /mnt/ceph-test001/snapshot_test_file 

Ceph This is snapshot test

2)     创建快照

语法:rbd snap create <pool-name>/<image-name>@<snap-name>

# rbd snap create rbd/test001@test001_snap

3)     显示创建的快照

# rbd snap ls rbd/test001
SNAPID NAME SIZE TIMESTAMP
test001_snap 1GiB Mon Feb ::

4)     删除文件

# rm -rf /mnt/ceph-test001/snapshot_test_file

5)     通过快照恢复

语法:rbd snap rollback <pool-name>/<image-name>@<snap-name>

# rbd snap rollback rbd/test001@test001_snap
# umount /mnt/ceph-test001
# mount –a # ll /mnt/ceph-test001/
total
-rw-r--r-- root root Jul : snapshot_test_file

6)     清除快照,表示所有的快照都删除

语法:rbd --pool {pool-name} snap purge {image-name}

rbd snap purge {pool-name}/{image-name}

# rbd snap purge rbd/test001

7)     删除快照,表示只删除指定的快照

语法:rbd snap rm <pool-name>/<image-name>@<snap-name> 
# rbd snap rm rbd/test001@test001_snap
# rbd snap ls rbd/test001 # 再次显示快照已经没有了

快照分层 / RBD克隆

  • 分层:支持创建某一设备快照的很多写时复制( COW)克隆。分层快照使得ceph块设备客户端可以很快地创建映射,分层特性允许客户端创建多个Ceph RBD克隆实例。
  • 快照是只读的,但COW克隆是完全可写的

(1)Clone必须rbd的image是类型 II

# rbd info test001
rbd image 'test001':
size GiB in objects
order ( MiB objects)
snapshot_count:
id: 408ea3f9d1c3b
block_name_prefix: rbd_data.408ea3f9d1c3b
format:
features: layering
op_features:
flags:
create_tim

(2)SUSE默认是类型II,如不是,创建时添加 --image-format 2参数

# rbd create test001 --size  --image-format
# rbd create test002 --size --image-format # rbd info test002
rbd image 'test002':
size MB in objects
order ( kB objects)
block_name_prefix: rb..b3dd.74b0dc51
format:

(3)创建COW克隆,首先要保护这个快照

克隆会访问父快照。如果用户意外删除了父快照,则所有克隆都会损坏。为了防止数据丢失,您需要先保护快照,然后才能克隆它。

# rbd snap create rbd/test001@test001_snap       # 创建快照
# rbd snap protect rbd/test001@test001_snap # 保护
# rbd -p rbd ls -l
NAME SIZE PARENT FMT PROT LOCK
test001 GiB
test001@test001_snap GiB yes <=== protect
test002 GiB

(4)快照克隆

语法:rbd clone {pool-name}/{parent-image}@{snap-name} {pool-name}/{child-image-name}

# rbd clone rbd/test001@test001_snap rbd/test001_snap_clone

注意:可以将快照从一个存储池克隆到另一个存储池中的映像。例如,可以在一个存储池中将只读映像和快照作为模板维护,而在另一个存储池中维护可写入克隆

# ceph osd pool create rbd_clone   replicated
# rbd clone rbd/test001@test001_snap rbd_clone/test001_snap_rbd_clone

(5) 检查新镜像信息

# rbd ls
test001
test001_snap_clone
test002
# rbd ls -p rbd_clone
test001_snap_rbd_clone
# rbd info rbd/test001_snap_clone
rbd image 'test001_snap_clone':
size GiB in objects
order ( MiB objects)
snapshot_count:
id: 4153d12df2e2e
block_name_prefix: rbd_data.4153d12df2e2e
format:
features: layering
op_features:
flags:
create_timestamp: Mon Sep ::
access_timestamp: Mon Sep ::
modify_timestamp: Mon Sep ::
parent: rbd/test001@test001_snap
overlap: GiB
  • 显示children of snapshot
# rbd children rbd/test001@test001_snap
rbd/test001_snap_clone
rbd_clone/test001_snap_rbd_clone

(6)平展克隆的映像

不在使用父镜像快照,所谓的完整克隆而不是之前的链接克隆,提高性能。

语法:# rbd --pool pool-name flatten --image image-name

# rbd flatten rbd/test001_snap_clone
Image flatten: % complete...done. # rbd flatten rbd_clone/test001_snap_rbd_clone
  • 会发现父镜像/快照的名字不存在了,并且克隆是独立的
# rbd info rbd/test001_snap_clone
rbd image 'test001_snap_clone':
size GiB in objects
order ( MiB objects)
snapshot_count:
id: 4153d12df2e2e
block_name_prefix: rbd_data.4153d12df2e2e
format:
features: layering
op_features:
flags:
create_timestamp: Mon Sep ::
access_timestamp: Mon Sep ::
modify_timestamp: Mon Sep ::

(7)取消保护快照

# rbd info rbd/test001@test001_snap          
rbd image 'test001':
size GiB in objects
order ( MiB objects)
snapshot_count:
.......
protected: True

# rbd snap unprotect rbd/test001@test001_snap   # 取消保护的

# rbd info rbd/test001@test001_snap 
rbd image 'test001':
        size 4 GiB in 1024 objects
        order 22 (4 MiB objects)
  ......
        protected: False

迁移RBD

(1)导出 RBD 镜像

语法:rbd export [image-name] [dest-path]

# rbd export test001 /tmp/test001_rbd_image
Exporting image: 100% complete...done

(2)导入 RBD 镜像

语法:# rbd import [path] [dest-image]

# rbd import /tmp/test001_rbd_image test002      
Importing image: 100% complete...done. # rbd ls
test001
test002 # rbd info test002
rbd image 'test002':
        size 4 GiB in 1024 objects
        order 22 (4 MiB objects)
        snapshot_count: 0
        id: 40b02f91b3a9d
        block_name_prefix: rbd_data.40b02f91b3a9d
        format: 2
        features: layering
        op_features:
        flags:

如何确认 RBD 镜像被那个客户端使用?

(1)通过 rbd status 命令确认镜像被那个客户端所使用

# rbd -p rbd ls
test001
test002
# rbd status rbd/test001
Watchers:
watcher=192.168.2.39:/ client. cookie=

可以看到该镜像或者instance属于192.168.2.39 IP地址

(2)RBD 头部信息
  • 查看镜像信息
# rbd info test001
rbd image 'test001':
size GiB in objects
order ( MiB objects)
snapshot_count:
id: 408ea3f9d1c3b
block_name_prefix: rbd_data.408ea3f9d1c3b
format:
features: layering
  • 通过头部信息查找
# rados -p rbd listwatchers rbd_header.408ea3f9d1c3b
watcher=192.168.2.39:/ client. cookie=
  • 脚本通过遍历池信息查找
# for each in `rados -p rbd ls | grep rbd_header`; do echo $each: && rados -p \
  rbd listwatchers $each && echo -e '\n';done

rbd_header.408ea3f9d1c3b:
watcher=192.168.2.39:/ client. cookie=

删除 RBD

1)     注释映射信息

# vim /etc/ceph/rbdmap
rbd/test001 id=admin,keyring=/etc/ceph/ceph.client.admin.keyring

2)     注释下面挂载信息

# vim /etc/fstab
/dev/rbd/rbd/test001 /mnt/ceph-test001 xfs defaults,noatime,_netdev

3)     显示映射关系

# rbd showmapped
id pool image snap device
rbd test001 - /dev/rbd0

4)     卸载映射关系,删除test001块设备

# rbd unmap /dev/rbd0
# rbd rm rbd/test001

RBD 基本使用 - Storage6的更多相关文章

  1. SUSE CaaS Platform 4 - 使用 Ceph RBD 作为持久存储(动态)

    图1 架构图 图2 各存储插件对动态供给方式的支持状况 1.所有节点安装 # yum install ceph-common 复制 ceph.conf 到 worker 节点上 # scp admin ...

  2. SUSE CaaS Platform 4 - Ceph RBD 作为 Pod 存储卷

    RBD存储卷 目前 CaaSP4 支持多种 Volume 类型,这里选择 Ceph RBD(Rados Block Device),主要有如下好处: Ceph 经过多年开发,已经非常熟,社区也很活跃: ...

  3. rbd snap(1)

    来自官方文档: 快照介绍 快照是映像在某个特定时间点的一份只读副本. 对当前镜像打过快照以后,Active层仍在当前镜像,快照文件为只读. Note 如果在做快照时映像仍在进行 I/O 操作,快照可能 ...

  4. rbd cache (一)

    cache 1.why The existence of cache is based on a mismatch between the performance characteristics of ...

  5. Tier和RBD Cache的区别

    相同点 缓存 数据不会持久保存在ssd或者内存:预读回写直写 都需要解决缓存数据和磁盘数据不一致和“内存页”置换的问题. 差异点 缓存的位置不同,tier是rados层在osd端进行数据缓存,也就是说 ...

  6. 理解 QEMU/KVM 和 Ceph(2):QEMU 的 RBD 块驱动(block driver)

    本系列文章会总结 QEMU/KVM 和 Ceph 之间的整合: (1)QEMU-KVM 和 Ceph RBD 的 缓存机制总结 (2)QEMU 的 RBD 块驱动(block driver) (3)存 ...

  7. 理解 QEMU/KVM 和 Ceph(1):QEMU-KVM 和 Ceph RBD 的 缓存机制总结

    本系列文章会总结 QEMU/KVM 和 Ceph 之间的整合: (1)QEMU-KVM 和 Ceph RBD 的 缓存机制总结 (2)QEMU 的 RBD 块驱动(block driver) (3)存 ...

  8. 理解 OpenStack + Ceph (3):Ceph RBD 接口和工具 [Ceph RBD API and Tools]

    本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...

  9. Ceph: validate that the RBD cache is active

    Ceph: validate that the RBD cache is active Quick and simple test to validate if the RBD cache is en ...

随机推荐

  1. 信道估计系列之LS

    在无线通信系统中,系统的性能主要受到无线信道的制约.基站和接收机之间的传播路径复杂多变,从简单的视距传输到受障碍物反射.折射.散射影响的传播.在无线传输环境中,接收信号会存在多径时延,时间选择性衰落和 ...

  2. (八)分布式通信----主机Host

    上节中有谈到的是通信主机(TransportHost),本节中主机(ServiceHost)负责管理服务的生命周期. 项目中将两个主机拆分开,实现不同的功能: 通信主机:用于启动通信监听端口: 生命周 ...

  3. java后台图片上传预检失败解决方案

    1.首先因为服务器端会先发送一个option请求到后台  在后台返回一个post给页面 页面在处理post请求给接口 2.先写一个过滤器, 我们自己定义一个过滤器 package com.adtime ...

  4. xcode删除一个项目

    退出xcode. 在Finder中删除项目文件夹.

  5. 洛谷-P1414 又是毕业季II -枚举因子

    P1414 又是毕业季II:https://www.luogu.org/problemnew/show/P1414 题意: 给定一个长度为n的数列.要求输出n个数字,每个数字代表从给定数列中最合理地取 ...

  6. HDU 4565 So Easy! 广义斐波拉数 数论 (a+sqrt(b))^n%mod 模板

    So Easy! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  7. Different Integers 牛客网暑期ACM多校训练营(第一场) J 离线+线状数组或者主席树

    Given a sequence of integers a1, a2, ..., an and q pairs of integers (l 1, r1), (l2, r2), ..., (lq, ...

  8. 【Hystrix】实现服务隔离和降级

    一.背景 1.1 服务熔断 1.2 服务降级 1.3 服务隔离 1.4 总结 二.使用Hystrix实现服务隔离和降级 2.1 Hytrix 简介 2.2 线程池方式 2.3 信号量 三.项目搭建 3 ...

  9. requests + BeautifulSoup + json

    requests: response.text      以 unicode 格式显示响应的文本 response.content    以 二进制 格式显示响应的文本 BeautiSoup: sou ...

  10. js获取一个月的天数

    在使用其他语言获取每月天数的时候,一般都是存储到一个数组中进行获取,但是如果是二月份的话就需要首先判断是否闰年,再确定是28还是29了. js可以通过Date对象很方便的获取到每月的天数,在初始化Da ...