RBD, RADOS Block Device
第一步、配置客户端
检查内核模块
检查 Kernel 具有 rbd 模块:如下命令若无输出则表示模块已加载
server> modprobe rbd
RHEL 6.x、CentOS 6.x 等低版本内核的 Linux 操作系统,其内核中默认没有集成 RBD 驱动,RHEL 7.x、CentOS 7.x、Ubuntu14.04 及其他 Linux 衍生版本带有 3.10.x 内核的操作系统中已经默认集成了 RBD 驱动。RBD 的使用依赖内核版本,为了提高性能和避免 Bug,建议内核版本不小于 3.10;
配置认证信息
Ceph 提供认证,其要求 Client 必须具有凭证与权限,以此才能访问存储;
Ceph 默认创建 client.admin 用户,该用户具有足够的权限,但是我们这里将演示如何创建独立的用户:
server> ceph auth get-or-create client.rbd mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=rbd' [client.rbd] key = AQBAO29jy4slJhAA+eUkcCRKjKo08uBb8G63IQ== server> ceph auth get-or-create client.rbd | ssh root@172.31.252.100 tee /etc/ceph/ceph.client.rbd.keyring client> cat /etc/ceph/ceph.client.rbd.keyring >> /etc/ceph/keyring
在后续的测试中,我们发现,如果重启系统,将无法继续挂载 RBD 镜像:
// 并提示如下错误: ... Sep 6 12:52:33 n01 kernel: [ 875.165082] rbd: rbd0: blacklist of client2508785 failed: -13 Sep 6 12:52:33 n01 kernel: [ 875.165082] rbd: rbd0: failed to acquire lock: -13 Sep 6 12:52:33 n01 kernel: [ 875.165355] rbd: rbd0: no lock owners detected ... // 解决方案 // 这可能与认证配置相关,后面将进一步讨论 ceph auth caps client.n01 mon 'profile rbd' osd 'profile rbd' // 参考文献 https://lists.ceph.io/hyperkitty/list/ceph-users@ceph.io/thread/KAV6MXLIYJWP3OEK4WFXDWHYRLLLA3LF/
发送配置文件
server> scp ceph.conf root@172.31.252.100:/etc/ceph client> ceph -s --name client.rbd cluster: id: cf79beac-61eb-11ed-a2e0-080027d3c643 health: HEALTH_OK services: mon: 3 daemons, quorum ceph-node-01,ceph-node-02,ceph-node-03 (age 12h) mgr: ceph-node-02.gktsek(active, since 12h), standbys: ceph-node-01.ymsncp osd: 3 osds: 3 up (since 12h), 3 in (since 12h) data: pools: 1 pools, 1 pgs objects: 2 objects, 577 KiB usage: 25 MiB used, 30 GiB / 30 GiB avail pgs: 1 active+clean
第二步、创建存储池
创建 RBD 镜像
// 创建存储池 server> ceph osd pool create rbd pool 'rbd' created // 创建块设备 client> rbd create rbd1 --size 1024 --name client.rbd
查看 RBD 信息
client> rbd ls --name client.rbd client> rbd -p rbd ls --name client.rbd client> rbd -p rbd list --name client.rbd client> rbd --image rbd1 info --name client.rbd rbd image 'rbd1': size 1 GiB in 256 objects order 22 (4 MiB objects) snapshot_count: 0 id: 12273add56623 block_name_prefix: rbd_data.12273add56623 format: 2 features: layering, exclusive-lock, object-map, fast-diff, deep-flatten op_features: flags: create_timestamp: Sat Nov 12 07:15:58 2022 access_timestamp: Sat Nov 12 07:15:58 2022 modify_timestamp: Sat Nov 12 07:15:58 2022
调整 RBD 大小
# rbd -n client.rbd resize --image rbd1 --size 2048 Resizing image: 100% complete...done. # rbd -n client.rbd info --image rbd1 rbd image 'rbd1': size 2 GiB in 512 objects order 22 (4 MiB objects) snapshot_count: 0 id: 12273add56623 block_name_prefix: rbd_data.12273add56623 format: 2 features: layering, exclusive-lock, object-map, fast-diff, deep-flatten op_features: flags: create_timestamp: Sat Nov 12 07:15:58 2022 access_timestamp: Sat Nov 12 07:15:58 2022 modify_timestamp: Sat Nov 12 07:15:58 2022
删除 RDB 镜像
rbd -p "<pool-name>" remove --image "<img-name>"
第三步、挂载块设备
### librbd
librbd 是一个访问 rbd 块存储的库,大家知道 librados 提供了 RBD 、Ceph FS 和Radosgw 三种存储接口,其中 librbd 就是利用 librados 与RBD 进行交互的。
前面提到 librbd 主要用于为虚拟机提供块设备,现在最常用的是在 IaaS 层提供虚拟机,比如 OpenStack 是基于 KVM/QEMU 虚拟化模拟器提供虚拟机服务的,为虚拟机系统盘和数据盘提供块设备的就是大量使用 Ceph 提供的 RBD 块存储。
### krbd(Kernel RBD)
KRBD 是Kernel Rados Block Device 的简称,用来通过 Kernel 中的 RBD 模块实现访问后端存储。
在操作系统内使用 modprobe 命令加载 RBD 模块到内核(默认没有加载)。
映射设备
# rbd -n client.rbd map --image rbd1 /dev/rbd0 # rbd -n client.rbd showmapped id pool namespace image snap device 0 rbd rbd1 - /dev/rbd0
使用块设备
mkfs.ext4 /dev/rbd0 mount /dev/rbd0 /mnt/ cd /mnt/ ls # dd if=/dev/zero of=/mnt/testfile count=100 bs=1M 100+0 records in 100+0 records out 104857600 bytes (105 MB, 100 MiB) copied, 0.227465 s, 461 MB/s
持久化挂载
# vim /etc/ceph/rbdmap rbd/rbd1 id=rbd,keyring=/etc/ceph/ceph.client.rbd.keyring # systemctl enable rbdmap.service