分布式存储系统之Ceph集群RBD基础使用

前文我们了解了Ceph集群cephx认证和授权相关话题 , 回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16748149.html;今天我们来聊一聊ceph集群的RBD接口使用相关话题;
RBD是ceph集群向外提供存储服务的一种接口,该接口是基于ceph底层存储集群librados api构建的接口;即RBD是构建在librados之上向外提供存储服务的;对于客户端来说RBD主要是将rados集群之上的某个存储池里的空间通过librados抽象为一块或多块独立image,这些Image在客户端看来就是一块块硬盘;那对于RBD抽象出来的硬盘,客户端该怎么使用呢?
RBD使用场景
我们知道Linux主机是由内核空间和用户空间组成;对于Linux主机来说,要想访问底层的硬盘设备,通常都是基于内核的驱动将对应磁盘设备识别成一块存储空间,然后通过用户空间程序执行内核空间的函数来实现操作磁盘;即操作磁盘的操作 , 最终只有内核有权限;这也意味着,如果一台Linux主机想要使用ceph之上通过RBD抽象出来的磁盘 , 对应内核空间必须得有一个模块(rbd.ko)能够驱动RBD抽象的硬盘;即Linux内核里的这个模块就是扮演着RBD的客户端;除了以上场景我们用Linux主机的内核模块来驱动RBD抽象出来的硬盘之外,还有一种场景;我们知道kvm虚拟机在创建虚拟机的时候可以指定使用多大内存,几颗cpu,使用何种磁盘等等信息;其中磁盘设备可以是一个文件系统里的一个磁盘镜像文件虚拟出来的硬盘;即kvm虚拟机是可以通过某种方式来加载我们指定的磁盘镜像;同样的逻辑,kvm虚拟机要想使用RBD虚拟出来的磁盘,它该怎么连入ceph使用RBD磁盘呢?其实很简单,kvm虚拟机自身并没有连入ceph的能力,它可以借助libvirt , libvirt可以通过RBD协议连入ceph集群,将rbd虚拟出的磁盘镜像供给kvm虚拟机使用;而RBD协议自身就是一个c/s架构,rbd的服务是由librbd提供,它不同于其他服务需要监听某个套接字,librbd它不需要监听任何套接字;不同于Linux主机的是,kvm虚拟机是通过libvirt这个工具使用RBD协议连接至ceph集群,而Linux主机使用使用内核模块(RBD)连接ceph集群;很显然一个是用户空间程序,一个是内核空间程序;不管是何种客户端工具以何种方式连入ceph集群使用RBD磁盘;客户端经由RBD存储到rados之上的数据 , 都会先找到对应存储池,然后被librados切分为等额大小的数据对象 , 分散的存放在rados的osd对应的磁盘上;这意味着我们需要先在ceph之上创建RBD存储池,同时对应存储池需要被初始化为一个RBD存储才能正常被客户端使用;
RBD管理命令
RBD相关的管理有如image的创建、删除、修改和列出等基础CRUD操作,也有分组、镜像、快照和回收站等相的管理需求,这些均能够通过rbd命令完成;其命令格式为:rbd [-c ceph.conf] [-m monaddr] [--cluster cluster-name] [-p|--pool pool] [command...]
1、创建并初始化RBD存储池
创建存储池:ceph osd pool create {pool-name} {pg-num} {pgp-num}
启用rbd应用:ceph osd pool application enable {pool-name} rbd
rbd初始化:rbd pool init -p {pool-name}
[root@ceph-admin ~]# ceph osd pool create ceph-rbdpool 64 64pool 'ceph-rbdpool' created[root@ceph-admin ~]# ceph osd pool lstestpoolrbdpool.rgw.rootdefault.rgw.controldefault.rgw.metadefault.rgw.logcephfs-metadatpoolcephfs-datapoolerasurepoolceph-rbdpool[root@ceph-admin ~]# ceph osd pool application enable ceph-rbdpool rbdenabled application 'rbd' on pool 'ceph-rbdpool'[root@ceph-admin ~]# ceph osd pool ls detailpool 1 'testpool' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 16 pgp_num 16 last_change 153 flags hashpspool stripe_width 0 compression_algorithm zstd compression_max_blob_size 10000000 compression_min_blob_size 10000 compression_mode passivepool 2 'rbdpool' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 128 pgp_num 128 last_change 142 lfor 0/140 flags hashpspool,selfmanaged_snaps max_bytes 1024000000 max_objects 50 stripe_width 0 application rbdremoved_snaps [1~3]pool 3 '.rgw.root' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 8 pgp_num 8 last_change 84 owner 18446744073709551615 flags hashpspool stripe_width 0 application rgwpool 4 'default.rgw.control' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 8 pgp_num 8 last_change 87 owner 18446744073709551615 flags hashpspool stripe_width 0 application rgwpool 5 'default.rgw.meta' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 8 pgp_num 8 last_change 89 owner 18446744073709551615 flags hashpspool stripe_width 0 application rgwpool 6 'default.rgw.log' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 8 pgp_num 8 last_change 91 owner 18446744073709551615 flags hashpspool stripe_width 0 application rgwpool 7 'cephfs-metadatpool' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 64 pgp_num 64 last_change 148 flags hashpspool,pool_snaps stripe_width 0 application cephfspool 8 'cephfs-datapool' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 128 pgp_num 128 last_change 99 flags hashpspool stripe_width 0 application cephfspool 10 'erasurepool' erasure size 3 min_size 2 crush_rule 1 object_hash rjenkins pg_num 32 pgp_num 32 last_change 130 flags hashpspool stripe_width 8192pool 11 'ceph-rbdpool' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 64 pgp_num 64 last_change 184 flags hashpspool stripe_width 0 application rbd[root@ceph-admin ~]# rbd pool init -p ceph-rbdpool[root@ceph-admin ~]#

推荐阅读