每天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授課經驗。