CEPH-2:rbd功能詳解及普通用戶應用ceph集群
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工作流程
- 客戶端創建一個pool,並指定pg數量,創建rbd設備並掛載;
- 用戶寫入數據,ceph進行對數據切塊,每個塊的大小默認為4M,每個塊名字是object+序號;
- 將每個object通過哈希演算法分配給對應的pg;
- pg根據crush演算法會尋找3個osd(假設副本數為3),把這object分別保存在這3個osd上存儲,這一組osd就是pgp的概念;
- osd實際把硬碟格式化為xfs文件系統,object存儲在這個文件系統就相當於存儲了一個文件rbd0.object1.file。
rbd創建及使用
某節點想要掛載、創建或使用rbd功能,必須滿足以下兩個條件
- 有操縱ceph集群的能力,也就是必須要有ceph.conf文件
- 要有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功能,必須滿足以下兩個條件
- 有操縱ceph集群的能力,也就是必須要有ceph.conf文件
- 要有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.