每天10分鐘玩轉Ceph(二)探索RBD塊存儲介面

實戰目標

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會隨著真實使用空間的增長而自動增長

rados對象檢索

可以在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授課經驗。