CEPH-2:rbd功能詳解及普通使用者應用ceph叢集

vfanCloud發表於2022-03-29

ceph叢集rbd使用詳解

一個完整的ceph叢集,可以提供塊儲存、檔案系統和物件儲存。

本節主要介紹rbd儲存功能如何靈活的使用,叢集背景:

$ ceph -s 
  cluster:
    id:     537175bb-51de-4cc4-9ee3-b5ba8842bff2
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum ceph-node1,ceph-node2,ceph-node3 (age 2m)
    mgr: ceph-node1(active, since 2d), standbys: ceph-node2
    mds: mycephfs:1 {0=ceph-node2=up:active} 1 up:standby
    osd: 12 osds: 12 up (since 30h), 12 in (since 30h)
    rgw: 2 daemons active (ceph-node1, ceph-node2)
 
  task status:
 
  data:
    pools:   7 pools, 201 pgs
    objects: 212 objects, 6.9 KiB
    usage:   12 GiB used, 1.2 TiB / 1.2 TiB avail
    pgs:     201 active+clean

rbd(塊儲存)介紹及使用

rbd介紹

RBD即RADOS Block Device的簡稱,RBD塊儲存是最穩定且最常用的儲存型別。RBD塊裝置類似磁碟可以被格式化、掛載。RBD塊裝置具有快照、多副本、克隆和一致性等特性,資料以條帶化的方式儲存在Ceph叢集的多個OSD中。

rbd工作流程

  1. 客戶端建立一個pool,並指定pg數量,建立rbd裝置並掛載;
  1. 使用者寫入資料,ceph進行對資料切塊,每個塊的大小預設為4M,每個塊名字是object+序號;
  2. 將每個object通過雜湊演算法分配給對應的pg;
  3. pg根據crush演算法會尋找3個osd(假設副本數為3),把這object分別儲存在這3個osd上儲存,這一組osd就是pgp的概念;
  4. osd實際把硬碟格式化為xfs檔案系統,object儲存在這個檔案系統就相當於儲存了一個檔案rbd0.object1.file。

rbd建立及使用

某節點想要掛載、建立或使用rbd功能,必須滿足以下兩個條件

  1. 有操縱ceph叢集的能力,也就是必須要有ceph.conf檔案
  2. 要有ceph客戶端相關元件,也就是ceph-common元件包
(1)建立
## 建立pool
$ ceph osd pool create myrbd1 64 64 
pool 'myrbd1' created

## 將此pool啟動rbd功能
$ ceph osd pool application enable myrbd1 rbd
enabled application 'rbd' on pool 'myrbd1'

## 初始化pool池
$ rbd pool init -p myrbd1

## 建立一個10G大小的塊映象
$ rbd create --size 10240 myrbd1/image01

## 檢視儲存池中的image
$ rbd ls --pool myrbd1 
image01

## 檢視映象詳情
$ rbd info myrbd1/image01
rbd image 'image01':
	size 10 GiB in 2560 objects
	order 22 (4 MiB objects)
	snapshot_count: 0
	id: 121a89b2ad1f2
	block_name_prefix: rbd_data.121a89b2ad1f2
	format: 2
	features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
	op_features: 
	flags: 
	create_timestamp: Mon Feb 21 11:24:07 2022
	access_timestamp: Mon Feb 21 11:24:07 2022
	modify_timestamp: Mon Feb 21 11:24:07 2022
(2)對映到客戶端機器核心
## 對映到核心
# rbd map myrbd1/image01
rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable myrbd1/image01 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

以上有報錯,因為ceph rbd很多特性基於核心,提示此版本核心不支援object-map fast-diff deep-flatten特性

將此特性關閉

rbd feature disable myrbd1/image01 object-map fast-diff deep-flatten

再次對映

# rbd map myrbd1/image01

## 檢視機器塊裝置
lsblk | grep rbd 
rbd0   252:0    0    10G  0 disk 

## List mapped rbd images.
# rbd showmapped
id  pool    namespace  image    snap  device   
0   myrbd1             image01  -     /dev/rbd0
(3)格式化、掛載、測試、持久化
# mkfs.xfs /dev/rbd0 
# mount /dev/rbd0 /mnt/

測試讀寫

# for((i=1;i<=20;i++));do echo $i > $i.txt;done
# ls
10.txt  12.txt  14.txt  16.txt  18.txt  1.txt   2.txt  4.txt  6.txt  8.txt
11.txt  13.txt  15.txt  17.txt  19.txt  20.txt  3.txt  5.txt  7.txt  9.txt
# cat 1.txt 
1

解除安裝image

# umount /dev/rbd0
# rbd unmap myrbd1/image01

如果取消對映失敗,提示裝置忙,則加上-o force引數

對映到其他機器,檢查資料是否還存在

# mount /dev/rbd0 /mnt/rbd/
# cd /mnt/rbd
# ls
10.txt  12.txt  14.txt  16.txt  18.txt  1.txt   2.txt  4.txt  6.txt  8.txt
11.txt  13.txt  15.txt  17.txt  19.txt  20.txt  3.txt  5.txt  7.txt  9.txt
# cat 1.txt 
1

測試完畢,未丟失資料。

(4)修改rbd image儲存空間大小
$ rbd resize myrbd1/image01 --size 15G
Resizing image: 100% complete...done.

$ rbd info myrbd1/image01
rbd image 'image01':
	size 15 GiB in 3840 objects
	order 22 (4 MiB objects)

image01修改至15G大小

目前檢視大小還是10G:

# df -h | grep mnt
/dev/rbd0        10G   33M   10G   1% /mnt

resize後,核心會直接識別到,不用重新map,直接重新整理塊裝置即可:

# xfs_growfs /dev/rbd0 
meta-data=/dev/rbd0              isize=512    agcount=16, agsize=163840 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=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               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=8 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 2621440 to 3932160

# df -h | grep mnt
/dev/rbd0        15G   34M   15G   1% /mnt

xfs用xfs_growfs命令重新整理,ext4和ext3用resize2fs

rbd快照的使用

(1)快照: 在某個時間點的副本,當系統出現問題,可以通過恢復快照恢復之前副本狀態。

建立快照

$ rbd snap create myrbd1/image01@snap01

$ rbd snap list myrbd1/image01
SNAPID  NAME    SIZE    PROTECTED  TIMESTAMP               
     4  snap01  10 GiB             Tue Feb 22 11:33:32 2022

$ rbd info myrbd1/image01@snap01
rbd image 'image01':
	size 10 GiB in 2560 objects
	order 22 (4 MiB objects)
	snapshot_count: 1
	id: 121a89b2ad1f2
	block_name_prefix: rbd_data.121a89b2ad1f2
	format: 2
	features: layering, exclusive-lock
	op_features: 
	flags: 
	create_timestamp: Mon Feb 21 11:24:07 2022
	access_timestamp: Mon Feb 21 11:24:07 2022
	modify_timestamp: Mon Feb 21 11:24:07 2022
	protected: False

模擬刪除資料,恢復快照

# ls
10.txt  12.txt  14.txt  16.txt  18.txt  1.txt   2.txt  4.txt  6.txt  8.txt
11.txt  13.txt  15.txt  17.txt  19.txt  20.txt  3.txt  5.txt  7.txt  9.txt
# rm -f * 
# cd ..
# umount /dev/rbd0 
# rbd unmap myrbd1/image01

## 恢復
$ rbd snap rollback myrbd1/image01@snap01
Rolling back to snapshot: 100% complete...done.

注意:恢復快照前,需要先將rbd裝置umount和取消核心對映,然後再進行rollback。

重新掛載,驗證資料是否恢復

# rbd map myrbd1/image01
# mount /dev/rbd0 /mnt/rbd/
# ls
10.txt  12.txt  14.txt  16.txt  18.txt  1.txt   2.txt  4.txt  6.txt  8.txt
11.txt  13.txt  15.txt  17.txt  19.txt  20.txt  3.txt  5.txt  7.txt  9.txt

資料恢復完成

(2)克隆: 基於指定的塊裝置克隆出相同的一份出來

克隆是要基於塊裝置的快照進行的,我們之前用上一步所建立出來的snap01來進行演示克隆功能。

設定快照處於被保護狀態(快照必須處於被保護狀態才能被克隆)

## 設為被保護狀態
$ rbd snap protect myrbd1/image01@snap01

## 檢視詳情,主要是protected變成了TRUE
$ rbd info myrbd1/image01@snap01
rbd image 'image01':
	size 10 GiB in 2560 objects
	order 22 (4 MiB objects)
	snapshot_count: 1
...
	protected: True

通過快照克隆一個新塊裝置

## 克隆
rbd clone replicapool/image01@snap01 replicapool/image01_clone

## 檢視目前所有image
# rbd ls replicapool
image01
image01_clone

## 檢視克隆塊裝置資訊
# rbd info replicapool/image01_clone
rbd image 'image01_clone':
	size 10 GiB in 2560 objects
	order 22 (4 MiB objects)
	snapshot_count: 0
	id: 8549a76ff74f
	block_name_prefix: rbd_data.8549a76ff74f
	format: 2
	features: layering
	op_features: 
	flags: 
	create_timestamp: Tue Mar 29 14:40:51 2022
	access_timestamp: Tue Mar 29 14:40:51 2022
	modify_timestamp: Tue Mar 29 14:40:51 2022
	parent: replicapool/image01@snap01
	overlap: 10 GiB

這個克隆裝置主要多了 parent: myrbd1/image01@snap01 這行配置,表示它的父關係

取消其父關係,使其獨立,隨後再進行mount測試

## 獨立於父塊裝置
# rbd flatten myrbd1/image01_clone
Image flatten: 100% complete...done.

## 找其他機器,對映其克隆裝置
# rbd map myrbd1/image01_clone
/dev/rbd1

# mount 即可

需要注意:根據塊裝置的快照克隆的塊裝置UUID不發生改變,所以克隆的塊裝置不能和原塊裝置掛載同一臺主機上,否則會產生衝突:

/dev/rbd0: UUID="14e60e20-3620-4177-a453-400b00caad1b" TYPE="xfs" 
/dev/rbd1: UUID="14e60e20-3620-4177-a453-400b00caad1b" TYPE="xfs"

rbd快照刪除

$ rbd snap remove myrbd1/image01@snap01
Removing snap: 100% complete...done.
$ rbd snap list myrbd1/image01

匯入匯出RBD映象

1.匯出rbd映象

# rbd export myrbd1/image01 /home/nfs/image01_bak
Exporting image: 100% complete...done.

2.匯入映象,恢復資料

先刪除image01

## 快照要提前刪完
# rbd snap remove replicapool/image01@snap01
Removing snap: 100% complete...done.

## 刪除映象
# rbd remove replicapool/image01
Removing image: 100% complete...done.

重新匯入映象

# rbd import /home/nfs/image01_bak myrbd1/image01  --image-format 2
Importing image: 100% complete...done.

重新掛載測試資料是否存在

# rbd map replicapool/image01
/dev/rbd0

# mount /dev/rbd0 /mnt/
# ls /mnt/
10.txt  12.txt  14.txt  16.txt  18.txt  1.txt   2.txt  4.txt  6.txt  8.txt
11.txt  13.txt  15.txt  17.txt  19.txt  20.txt  3.txt  5.txt  7.txt  9.txt

沒什麼問題

rbd使用普通使用者掛載

首先,某節點想要掛載、建立或使用rbd功能,必須滿足以下兩個條件

  1. 有操縱ceph叢集的能力,也就是必須要有ceph.conf檔案
  2. 要有ceph客戶端相關元件,也就是ceph-common元件包
(1)檢視當前所有使用者及許可權
$ ceph auth list 
installed auth entries:

mds.ceph-node1
	key: AQBoFg9iVjO6DhAADSCzL/Njv16XONHBAPuRLA==
	caps: [mds] allow
	caps: [mon] allow profile mds
	caps: [osd] allow rwx
mds.ceph-node2
	key: AQCGFg9icS7TCBAAGvFfz/C5Av0P6Hu1Ws5SUw==
	caps: [mds] allow
	caps: [mon] allow profile mds
	caps: [osd] allow rwx
...

預設情況下,ceph每個元件都會建立對應的使用者,每個使用者都有自己對應的的許可權。

授權型別

許可權 說明
r 向使用者授予讀取許可權。讀取叢集各個元件(MON/OSD/MDS/CRUSH/PG)的狀態。訪問監視器(mon)以檢索 CRUSH 執行圖時需具有此能力。
w 向使用者授予針對物件的寫入許可權。
x 授予使用者呼叫類方法(包括讀取和寫入)的能力,以及在監視器中執行 auth 操作的能力。
* 授予使用者對特定守護程式/儲存池的讀取、寫入和執行許可權,以及執行管理命令的能力
class-read 授予使用者呼叫類讀取方法的能力,屬於是 x 能力的子集。
class-write 授予使用者呼叫類寫入方法的能力,屬於是 x 能力的子集。
profile osd 授予使用者以某個 OSD 身份連線到其他 OSD 或監視器的許可權。授予 OSD 許可權,使 OSD 能夠處理複製檢測訊號流量和狀態報告。
profile mds 授予使用者以某個 MDS 身份連線到其他 MDS 或監視器的許可權。
profile bootstrap-osd 授予使用者引導 OSD 的許可權(初始化 OSD 並將 OSD 加入 ceph 叢集),授 權給部署工具,使其在引導 OSD 時有權新增金鑰。
profile bootstrap-mds 授予使用者引導後設資料伺服器的許可權,授權部署工具許可權,使其在引導 後設資料伺服器時有權新增金鑰。

獲取指定使用者許可權資訊:

$ ceph auth get client.admin
exported keyring for client.admin
[client.admin]
	key = AQA0bgdi30YtIRAABefFzbzVQw0vCttrjeqirA==
	caps mds = "allow *"
	caps mgr = "allow *"
	caps mon = "allow *"
	caps osd = "allow *"
(2)建立普通使用者,並賦予對應的許可權
## 建立 client.vfan 使用者,並授權可讀 MON、可讀寫 OSD 
$ ceph auth add client.vfan mon 'allow r' osd 'allow rw pool=myrbd1'
added key for client.vfan

$ ceph auth get client.vfan
exported keyring for client.vfan
[client.vfan]
	key = AQCq2CViGig9HxAA64YqzL85idfTn3TRzE18dQ==
	caps mon = "allow r"
	caps osd = "allow rw pool=myrbd1"
	
## 如果該使用者已存在,此命令只以金鑰檔案格式返回使用者名稱和金鑰。授權可讀 MON,可讀寫 OSD 
$ ceph auth get-or-create client.tom mon 'allow r' osd 'allow rw pool=myrbd1'
[client.tom]
	key = AQDh2SVi+cFJJhAAXZomi67Sfd7vbbUE9MmHDw==
	
## 如果該使用者已存在,此命令只返回金鑰。授權可讀 MON,可讀寫 OSD
$ ceph auth get-or-create-key client.tony mon 'allow r' osd 'allow rw pool=myrbd1'
AQAV2iVizi0pLhAA1RXFbxcYeDZqJxtKW9ZzSg==
(3)傳輸使用者金鑰至客戶端主機

當客戶端訪問 ceph 叢集時,ceph 會使用以下四個金鑰環檔案預設定金鑰環設定:

/etc/ceph/<$cluster name>.<user $type>.<user $id>.keyring # 儲存單個使用者的 keyring 
/etc/ceph/cluster.keyring                                 # 儲存多個使用者的 keyring
/etc/ceph/keyring                                         # 未定義叢集名稱的多個使用者的 keyring
/etc/ceph/keyring.bin                                     # 編譯後的二進位制檔案

建立普通使用者金鑰許可權檔案:

$ ceph auth get client.vfan -o ceph.client.vfan.keyring
$ cat ceph.client.vfan.keyring 
[client.vfan]
	key = AQCq2CViGig9HxAA64YqzL85idfTn3TRzE18dQ==
	caps mon = "allow r"
	caps osd = "allow rw pool=myrbd1"

此檔案還可以進行使用者恢復操作,具體命令ceph auth import -i ceph.client.vfan.keyring,這種恢復方式,使用者key值不會發生改變。

將金鑰許可權檔案傳輸至客戶端主機:

$ sudo scp ceph.client.vfan.keyring ceph-node2:/etc/ceph/
(4)客戶端使用普通使用者測試訪問叢集
# ceph --user vfan -s 
  cluster:
    id:     537175bb-51de-4cc4-9ee3-b5ba8842bff2
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum ceph-node1,ceph-node2,ceph-node3 (age 2m)
    mgr: ceph-node1(active, since 2d), standbys: ceph-node2
    mds: mycephfs:1 {0=ceph-node2=up:active} 1 up:standby
    osd: 12 osds: 12 up (since 30h), 12 in (since 30h)
    rgw: 2 daemons active (ceph-node1, ceph-node2)
 
  task status:
 
  data:
    pools:   8 pools, 265 pgs
    objects: 273 objects, 14 MiB
    usage:   8.1 GiB used, 792 GiB / 800 GiB avail
    pgs:     265 active+clean

預設情況下,ceph是用admin使用者,可以使用--user指定使用者。

(5)普通使用者掛載rbd

因為之前建立使用者賦予許可權時沒有給osd的x許可權,現在重新賦予一下許可權:

$ ceph auth caps client.vfan mon 'allow r' osd 'allow rwx pool=myrbd1'updated caps for client.vfan

對映到核心,掛載rbd

$ sudo rbd map myrbd1/image01 --user vfan 
$ sudo mount /dev/rbd0 /mnt/
$ ls /mnt/
10.txt  12.txt  14.txt  16.txt  18.txt  1.txt   2.txt  4.txt  6.txt  8.txt
11.txt  13.txt  15.txt  17.txt  19.txt  20.txt  3.txt  5.txt  7.txt  9.txt

取消對映

$ sudo rbd unmap myrbd1/image01 --user vfan 
(6)其他操作如更改映象大小、建立快照、克隆等功能,均與admin使用者操作相同,只不過每條命令後邊會新增--user [使用者名稱]的操作,例如:
$ rbd resize replicapool/image01 --size 15G --user vfan
Resizing image: 100% complete...done.

至此rbd常用功能已演示完畢,接下來介紹cephfs和物件儲存的使用。

相關文章