ceph儲存之RBD塊儲存
無論是通過Ceph塊裝置、物件儲存還是檔案系統,Ceph儲存群集都從Ceph客戶端接收資料,並將其儲存為物件。每個物件對應於檔案系統中的一個檔案,該檔案儲存在物件儲存裝置上。Ceph OSD守護程式處理儲存磁碟上的讀/寫操作。
此博文基於部署ceph叢集 (Nautilus版)進行操作!
一、ceph資源池的相關概念
Ceph儲存系統支援“池”的概念,“池”是用於儲存物件的邏輯分割槽。
Ceph客戶端從Ceph監控器檢索叢集對映,並將物件寫入池中。池的size副本數或副本數,CRUSH規則和放置組的數量決定了Ceph將如何放置資料。
1.1 建立儲存池
$ ceph osd pool create ceph-demo 64 64 # 建立一個名字為ceph-demo的pool(第一個64是pg數量,第二個64是pgp數量) pool 'ceph-demo' created $ ceph osd lspools # 檢視當前所有pool 1 ceph-demo $ ceph osd pool application enable ceph-demo rbd # 將 ceph-demo 池分類為 rbd enabled application 'rbd' on pool 'ceph-demo' $ ceph osd pool application get ceph-demo # 檢視資源池型別為rbd { "rbd": {} }
1.2 ceph中pg與pgp的關係
pg是用來存放object的,pgp相當於是pg存放osd的一種排列組合!
舉例說明:比如有3個osd,osd1、osd2、osd3 ,副本數是2,如果pgp的數目是1,那麼所有的pg存放的osd組合就只有一種,可能是[osd.1,osd.2],那麼所有的pg主從副本分別存放到osd.1和osd.2,如果pgp設為2,那麼其osd組合可以兩種,可能是[osd.1,osd.2]和[osd.1,osd.3],是不是很像我們高中數學學過的排列組合,pgp就是代表這個意思。一般來說應該將pg和pgp的數量設定為相等。
1.3 調整儲存池副本數
$ ceph osd pool get ceph-demo size # 檢視pool的副本數(預設副本為3) size: 3 $ ceph osd pool set ceph-demo size 2 # 調整pool副本數為2 $ ceph osd pool get ceph-demo size size: 2
1.4 調整儲存池的pg即pgp數量
$ ceph osd pool get ceph-demo pg_num # 檢視pg和pgp的數量
pg_num: 64
$ ceph osd pool get ceph-demo pgp_num
pgp_num: 64
$ ceph osd pool set ceph-demo pg_num 128 # 調整pg數量為128
set pool 1 pg_num to 128
$ ceph osd pool get ceph-demo pg_num # 檢視確認
pg_num: 128
$ ceph osd pool set ceph-demo pgp_num 128 # 最好將pgp數量調整為和pg數量一致
set pool 1 pgp_num to 128
$ ceph osd pool get ceph-demo pgp_num # 檢視確認
pgp_num: 128
二、RDB(塊儲存)
ceph叢集搭建起來後,可以在ceph叢集上進行塊儲存、物件儲存以及檔案系統儲存。從架構上來看,在ceph叢集的上面是rados協議,該協議為使用ceph叢集的使用者提供必要的支援(ceph使用者通過呼叫rados協議來使用ceph叢集)。對於塊儲存來說,可以通過核心模組的方式使用ceph叢集也可以通過使用者態呼叫librbd庫來使用ceph叢集。通過核心模組方式可以充分的利用核心的page cache機制,而通過使用者態呼叫librbd也可以使用librbd在使用者態提供的cache方式提高效能。
在進行建立rbd之前,需要先按照上面的操作,創建出來一個可用的pool。
2.1 建立rbd
$ rbd -p ceph-demo ls # 確認當前pool中沒有rbd
$ rbd create -p ceph-demo --image rbd-demo.img --size 10G
# 基於ceph-demo池建立名稱為rbd-demo.img的塊檔案
$ rbd create ceph-demo/rbd-demo-1.img --size 10G
# 換種語法格式建立第二個塊檔案
$ rbd -p ceph-demo ls # 檢視ceph-demo池中的塊檔案
rbd-demo-1.img
rbd-demo.img
2.2 檢視塊檔案的詳細資訊
$ rbd info ceph-demo/rbd-demo.img # 檢視rbd-demo.img塊檔案
rbd image 'rbd-demo.img': # 此塊裝置大小為10G,包含了2560個object,每個object的大小為4M
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 11194f22705d
block_name_prefix: rbd_data.11194f22705d
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Sun Jun 13 17:13:51 2021
access_timestamp: Sun Jun 13 17:13:51 2021
modify_timestamp: Sun Jun 13 17:13:51 2021
$ rbd info -p ceph-demo --image rbd-demo.img # 檢視rbd-demo-1.img塊檔案
rbd image 'rbd-demo.img':
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 11194f22705d
block_name_prefix: rbd_data.11194f22705d
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Sun Jun 13 17:13:51 2021
access_timestamp: Sun Jun 13 17:13:51 2021
modify_timestamp: Sun Jun 13 17:13:51 2021
2.3 刪除塊裝置
$ rbd -p ceph-demo rm --image rbd-demo-1.img
Removing image: 100% complete...done.
$ rbd -p ceph-demo ls # 確認已刪除
rbd-demo.img
2.4 核心級別掛載使用塊裝置
$ rbd map ceph-demo/rbd-demo.img
# 預設建立的塊檔案有些特性不支援,會報錯如下
rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable ceph-demo/rbd-demo.img object-map fast-diff deep-flatten".
In some cases useful info is found in syslog - try "dmesg | tail".
rbd: map failed: (6) No such device or address
2.5 刪除塊裝置不支援的特性
$ rbd info ceph-demo/rbd-demo.img # 檢視塊裝置特性
rbd image 'rbd-demo.img':
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 11194f22705d
block_name_prefix: rbd_data.11194f22705d
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Sun Jun 13 17:13:51 2021
access_timestamp: Sun Jun 13 17:13:51 2021
modify_timestamp: Sun Jun 13 17:13:51 2021
# 刪除不支援的特性
$ rbd feature disable ceph-demo/rbd-demo.img deep-flatten
$ rbd feature disable ceph-demo/rbd-demo.img fast-diff
# 刪除上面兩個後,就可以再次進行核心級別掛載了,如果還不行,再刪除下面兩個
$ rbd feature disable ceph-demo/rbd-demo.img object-map
$ rbd feature disable ceph-demo/rbd-demo.img exclusive-lock
$ rbd info ceph-demo/rbd-demo.img # 確認不支援的特性已刪除
rbd image 'rbd-demo.img':
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 11194f22705d
block_name_prefix: rbd_data.11194f22705d
format: 2
features: layering # layering特性需要保持
op_features:
flags:
create_timestamp: Sun Jun 13 17:13:51 2021
access_timestamp: Sun Jun 13 17:13:51 2021
modify_timestamp: Sun Jun 13 17:13:51 2021
$ rbd map ceph-demo/rbd-demo.img # 再次對映塊裝置
/dev/rbd0
2.6 檢視塊裝置
$ rbd device list
id pool namespace image snap device
0 ceph-demo rbd-demo.img - /dev/rbd0
$ lsblk /dev/rbd0
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
rbd0 252:0 0 10G 0 disk
至此,就可以將/dev/rbd0
當成我們一個本地的磁碟來使用了。
2.7 格式化並使用塊裝置
如果將ceph對接雲平臺,當成雲盤來使用,那麼不建議對塊裝置進行分割槽,這樣可以避免塊裝置擴容帶來的麻煩。
$ 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
# 掛載並測試使用
$ mkdir /data && mount /dev/rbd0 /data/
$ echo 'test block' > /data/test.txt
2.8 RBD資料寫入流程
一個檔案被切割成多個object,每個object大小為4M,object儲存到pg上(經過hash運算,再取掩碼,得到它要落到哪個pg上,),pg再通過crush演算法,最終找到對應的osd上。
2.9 RDB塊裝置擴容
rdb塊裝置,支援擴縮容,但是對於縮容操作,強烈不建議,可能會造成資料丟失。
$ rbd -p ceph-demo info --image rbd-demo.img # 確認當前塊裝置大小
rbd image 'rbd-demo.img':
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 11194f22705d
block_name_prefix: rbd_data.11194f22705d
format: 2
features: layering
op_features:
flags:
create_timestamp: Sun Jun 13 17:13:51 2021
access_timestamp: Sun Jun 13 17:13:51 2021
modify_timestamp: Sun Jun 13 17:13:51 2021
$ rbd resize ceph-demo/rbd-demo.img --size 20G
# 從10G大小擴容到20G
Resizing image: 100% complete...done.
$ rbd -p ceph-demo info --image rbd-demo.img # 確認已擴容20G
rbd image 'rbd-demo.img':
size 20 GiB in 5120 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 11194f22705d
block_name_prefix: rbd_data.11194f22705d
format: 2
features: layering
op_features:
flags:
create_timestamp: Sun Jun 13 17:13:51 2021
access_timestamp: Sun Jun 13 17:13:51 2021
modify_timestamp: Sun Jun 13 17:13:51 2021
$ df -hT /data # 此時塊裝置已經擴容,但檔案系統還未識別到,如下,還是原來的10G
檔案系統 型別 容量 已用 可用 已用% 掛載點
/dev/rbd0 xfs 10G 33M 10G 1% /data
$ xfs_growfs /dev/rbd0
$ partprobe
# 擴容檔案系統(原磁碟是xfs格式的,故需要使用xfs_growfs指令擴容)
$ resize2fs /dev/rbd0
# 如果你格式化為ext4的,請執行該命令
$ df -hT /data # 確認已擴容成功
檔案系統 型別 容量 已用 可用 已用% 掛載點
/dev/rbd0 xfs 20G 34M 20G 1% /data