每天10分钟玩转Ceph(二)探索RBD块存储接口
- 2020 年 3 月 2 日
- 筆記
实战目标
Ceph集群创建资源池,创建RBD块,RBD块的使用
1. Ceph RBD存储使用
1.1 RBD块存储概述
部署完Ceph集群之后,如何在Ceph集群中存储文件呢?ceph提供了三种接口供用户使用,分别是:
- rbd,块存储,以块的方式使用,通常适用于和虚拟化如KVM结合,用于给虚拟化提供块存储设备
- object storage,对象存储,通过radosgw提供对象存储api,供用户上传put和get下载对象文件
- cephfs文,件存储,以cephfs挂载文件系统的方式使用ceph
A block is a sequence of bytes (for example, a 512-byte block of data). Block-based storage interfaces are the most common way to store data with rotating media such as hard disks, CDs, floppy disks, and even traditional 9-track tape. The ubiquity of block device interfaces makes a virtual block device an ideal candidate to interact with a mass data storage system like Ceph.
RBD(Rados Block Device)即Ceph提供的块存储接口,提供一个连续的序列化空间(可以理解为一个image),块存储能够实现传统存储介质如硬盘,CD,磁带库等存储的功能,RBD能够为虚拟机提供一个大规模,可扩展的存储空间,简单点来说,能够为虚拟机提供磁盘,可以在磁盘上做磁盘分区,格式化等操作,其具有如下特点:
Thin-provisioned,预分配,即瘦模式,随使用空间增长而增长
Images up to 16 exabytes,镜像最大可以支持16EB
Configurable striping,支持配置条带模式,
In-memory caching,内存缓存
Snapshots,快照
Copy-on-write cloning,copy-on-write克隆,用于大规模分发机器
Kernel driver support,内核驱动支持,内核支持rbd,cephfs
KVM/libvirt support,支持KVM和libvirt,用于KVM虚拟化场景
Back-end for cloud solutions,终端云解决方案,支持OpenStack,CloudStack,K8S等
Incremental backup,增量备份
Disaster recovery (multisite asynchronous replication),灾难恢复,支持多地域异步复制
1.2 创建资源池pool
我们先以Ceph RBD的方式来介绍Ceph集群的使用,通过在Ceph集群中创建一个RBD块文件供用户进行使用,要使用Ceph,首先需要一个资源池pool,pool是Ceph中数据存储抽象的概念,其由多个pg(Placegroup)和pgp组成,创建的时候可以指定pg的数量,pg的大小一般为2^n次方,如下先创建一个pool
1、创建一个pool,其名字为happylau,包含64个PG/PGP,
[root@node-1 ~]# ceph osd pool create happylau 64 64 pool 'happylau' created
2、可以查看pool的信息,如查看当前集群的pool列表——lspools,可以使用df查看资源池的存储空间
查看pool列表 [root@node-1 ~]# ceph osd lspools 1 happylau #查看存储空间使用情况 [root@node-1 ~]# ceph df GLOBAL: SIZE AVAIL RAW USED %RAW USED 147 GiB 144 GiB 3.0 GiB 2.07 POOLS: NAME ID USED %USED MAX AVAIL OBJECTS happylau 1 14 MiB 0.03 46 GiB 24
3、查看pg_num和pgp_num,副本数size大小
查看pg和pgp数量 [root@node-1 ~]# ceph osd pool get happylau pg_num pg_num: 64 [root@node-1 ~]# ceph osd pool get happylau pgp_num pgp_num: 64 查看size大小,默认为三副本 [root@node-1 ~]# ceph osd pool get happylau size size: 3
关于pg_num和pgp_num的数量,官方推荐的计算方案为,每个OSD推荐使用100个PG,OSD的数量*100/pool副本数量,然后取最近2的^n次方的值,套公式,其值为:PGs=3*100/3=100,取最近的值为128,此时的设置低于官方建议。
(OSDs * 100) Total PGs = ------------ pool size
4、调整pool的pg_num和pgp_num数量,调整pg和pgp会涉及到数据迁移,如果线上业务情评估好,在低峰期做操作,避免数据rebalancing造成业务影响
[root@node-1 ~]# ceph osd pool set happylau pg_num 128 [root@node-1 ~]# ceph osd pool set happylau pgp_num 128
5、调整副本数,可以根据需要调整资源池pool的副本数,默认为三个,也可以手动调整pool副本数量的个数,以下调整pool资源池副本数量为2个副本
[root@node-1 ~]# ceph osd pool set happylau size 2 set pool 1 size to 2 查看校验pool副本个数 [root@node-1 ~]# ceph osd pool get happylau size size: 2
此时,如果集群中有数据,Ceph会自动做数据均衡(rebalancing),将多余的pg同步到其他osd,确保当前pool资源池的副本数为2个,此时使用ceph -s查看集群,可以看到pool资源池的pg的数量
[root@node-1 ~]# ceph -s cluster: id: 760da58c-0041-4525-a8ac-1118106312de health: HEALTH_WARN application not enabled on 1 pool(s) services: mon: 1 daemons, quorum node-1 mgr: node-1(active) osd: 3 osds: 3 up, 3 in data: pools: 1 pools, 128 pgs #PGs数量 objects: 24 objects, 14 MiB usage: 3.0 GiB used, 144 GiB / 147 GiB avail pgs: 128 active+clean io: client: 3.2 KiB/s wr, 0 op/s rd, 0 op/s wr
由上可以看到Ceph集群当前的整体情况,包含有cluster,services,data,io信息,health状态可以看到集群当前处于告警HEALTH_WARN状态,告警提示内容为“application not enabled on 1pool(s)”,资源池pool未启用application,Ceph推荐开启application的功能。
6、开启application功能,application即设置资源池pool存储接口类型,包含三种:rbd,cephfs和,rgw,可以根据资源池pool的类型,设置不同的application,如下开启资源池为rbd类型
[root@node-1 ~]# ceph osd pool application enable happylau rbd enabled application 'rbd' on pool 'happylau' [root@node-1 ~]# ceph osd pool application get happylau { "rbd": {} }
再次查看Ceph,可以看到Ceph此时处于Health状态
[root@node-1 ~]# ceph -s cluster: id: 760da58c-0041-4525-a8ac-1118106312de health: HEALTH_OK services: mon: 1 daemons, quorum node-1 mgr: node-1(active) osd: 3 osds: 3 up, 3 in data: pools: 1 pools, 128 pgs objects: 24 objects, 14 MiB usage: 3.0 GiB used, 144 GiB / 147 GiB avail pgs: 128 active+clean
至此,Ceph资源池pool相关操作到此完毕,接下来在pool中创建镜像。
1.3 RBD块使用
Ceph RBD块存储主要为虚拟化如KVM提供块存储设备,KVM需要依赖于qemu和libvirt和RBD块存储交互,这也是和云平台如OpenStack,CloudStack,Kubernetes交互的基础,因此非常有必要掌握Ceph原生RBD块存储的使用。由于当前Ceph集群未与虚拟化或者云平台进行集成,因此采用原生的rbd接口与Ceph进行交互(云平台通过调用rbd接口完成块存储生命周期管理)。
1、rbd块存储接口交互的工具为rbd,通过rbd命令来实现RBD块的创建,如创建一个10G的块存储
[root@node-1 ~]# rbd create -p happylau --image ceph-rbd-demo.img --size 10G
2、如上创建了一个ceph-rbd-demo.img的RBD块文件,大小为10G,可以通过ls和info查看RBD镜像的列表和详情信息
查看RBD镜像列表 [root@node-1 ~]# rbd -p happylau ls ceph-rbd-demo.img 查看RBD详情,可以看到镜像包含2560个objects,每个ojbect大小为4M,对象以rbd_data.10b96b8b4567开头 [root@node-1 ~]# rbd -p happylau info ceph-rbd-demo.img rbd image 'ceph-rbd-demo.img': size 10 GiB in 2560 objects order 22 (4 MiB objects) id: 10b96b8b4567 block_name_prefix: rbd_data.10b96b8b4567 format: 2 features: layering, exclusive-lock, object-map, fast-diff, deep-flatten op_features: flags: create_timestamp: Mon Mar 2 15:32:39 2020
3、RBD存储块已创建起来了,如何使用呢?如果已和虚拟化环境结合,创建好虚拟机然后在磁盘中写数据即可,但此时还未与虚拟化结合(结合难度也比较大,后续再专门讨论),rbd提供了一个map的工具,可以将一个RBD块映射到本地块进行使用,大大简化了使用过程,rbd map时候,exclusive-lock, object-map, fast-diff, deep-flatten的features不支持,因此需要先disable,否则会提示RBD image feature set mismatch报错信息
关闭默认的featrues [root@node-1 ~]# rbd -p happylau --image ceph-rbd-demo.img feature disable deep-flatten [root@node-1 ~]# rbd -p happylau --image ceph-rbd-demo.img feature disable fast-diff [root@node-1 ~]# rbd -p happylau --image ceph-rbd-demo.img feature disable object-map [root@node-1 ~]# rbd -p happylau --image ceph-rbd-demo.img feature disable exclusive-lock 查看校验featrue信息 [root@node-1 ~]# rbd -p happylau info ceph-rbd-demo.img rbd image 'ceph-rbd-demo.img': size 10 GiB in 2560 objects order 22 (4 MiB objects) id: 10b96b8b4567 block_name_prefix: rbd_data.10b96b8b4567 format: 2 features: layering op_features: flags: create_timestamp: Mon Mar 2 15:32:39 2020 将RBD块map到本地,此时map后,可以看到RBD块设备映射到了本地的一个/dev/rbd0设备上 [root@node-1 ~]# rbd map -p happylau --image ceph-rbd-demo.img /dev/rbd0 [root@node-1 ~]# ls -l /dev/rbd0 brw-rw---- 1 root disk 251, 0 3月 2 15:58 /dev/rbd0
4、RBD块设备已映射到本地的/dev/rbd0设备上,因此可以对设备进行格式化操作使用
通过device list可以查看到当前机器RBD块设备的映射情况 [root@node-1 ~]# ls -l /dev/rbd0 brw-rw---- 1 root disk 251, 0 3月 2 15:58 /dev/rbd0 该设备可以像本地的一个盘来使用,因此可以对其进行格式化操作 [root@node-1 ~]# mkfs.xfs /dev/rbd0 meta-data=/dev/rbd0 isize=512 agcount=16, agsize=163840 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0, sparse=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 log bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=8 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 [root@node-1 ~]# blkid /dev/rbd0 /dev/rbd0: UUID="35f63145-0b62-416d-81f2-730c067652a8" TYPE="xfs" 挂载磁盘到系统中 [root@node-1 ~]# mkdir /mnt/ceph-rbd [root@node-1 ~]# mount /dev/rbd0 /mnt/ceph-rbd/ [root@node-1 ~]# df -h /mnt/ceph-rbd/ 文件系统 容量 已用 可用 已用% 挂载点 /dev/rbd0 10G 33M 10G 1% /mnt/ceph-rbd [root@node-1 ~]# cd /mnt/ceph-rbd/ [root@node-1 ceph-rbd]# echo "testfile for ceph rbd" >rbd.log
5、通过rbd info可以看到镜像块存储对象的前缀为rbd_data.10b96b8b4567,即存储被切割为多个object,object的前缀以rbd_data.10b96b8b4567开头,可以通过rados查看存储池中的obejct,这些object会随着真实使用空间的增长而自动增长

可以在rbd映射的磁盘中写入更多的数据,然后再通过rados查看object的情况,会发现创建了更多的object用于存储数据。object最大数量不会超过2560个,即10G(每个object 4M*2560)
6、至此,已经完成了rbd存储的创建和通过kernel的方式挂在到系统中使用,这种使用方式相对较少,一般以KVM的libvirt/qemu方式进行对接,如果需要卸载可以按照如下方式进行
卸载文件系统 [root@node-1 ~]# umount /dev/rbd0 卸载块存储,再次使用rbd device ls查看显示为空则为卸载成功 [root@node-1 ~]# rbd device unmap -p happylau --image ceph-rbd-demo.img
写在最后
本章节介绍了Ceph最重要的一个接口RBD的实现,同时介绍了pool资源池的创建和管理方法,通过rbd接口的使用,可以清楚知道ceph中RBD块存储功能的使用。
参考文档
资源池pool的管理:https://docs.ceph.com/docs/master/rbd/rados-rbd-cmds/
RBD块存储使用:https://docs.ceph.com/docs/master/start/quick-rbd/?highlight=rbdmap
PGs计算规则:https://docs.ceph.com/docs/master/rados/operations/placement-groups/#a-preselection-of-pg-num
RBD块存储介绍:https://docs.ceph.com/docs/master/rbd/
如果觉得文章对您有帮助,请订阅专栏,分享给有需要的朋友吧?
关于作者 刘海平(HappyLau )云计算高级顾问 目前在腾讯云从事公有云相关工作,曾就职于酷狗,EasyStack,拥有多年公有云+私有云计算架构设计,运维,交付相关经验,参与了酷狗,南方电网,国泰君安等大型私有云平台建设,精通Linux,Kubernetes,OpenStack,Ceph等开源技术,在云计算领域具有丰富实战经验,拥有RHCA/OpenStack/Linux授课经验。