RBD與Cephfs

FuShudi發表於2024-05-26

目錄
  • 1. RBD
    • 1. RBD特性
    • 2. 建立rbd池並使用
      • 2.1 建立rbd
      • 2.2 建立使用者
      • 2.3 下發使用者key與ceph.conf
      • 2.4 客戶端檢視pool
      • 2.5 建立rbd塊
      • 2.6 對映rbd並掛載
        • 先看一下塊裝置
      • 2.7 開機自動對映
      • 2.8 rbd create引數
      • 2.9 rbd對映基本操作
    • 3. 塊裝置操作
      • 3.1 調整rbd大小
      • 3.2 複製塊裝置
      • 3.3 移動到其他pool
    • 4. rbd快照管理
      • 4.1 建立快照
      • 4.2 回滾快照
      • 4.3 保護快照
      • 4.4 刪除快照
      • 4.5 克隆快照
      • 4.6 客戶端配置rbd快取
  • 2. CephFS
    • 1. mds是什麼
    • 2. 建立檔案系統
      • 2.1 建立2個儲存池
      • 2.2 建立cephfs
      • 2.3 建立mds
      • 2.4 檢視檔案系統資訊
      • 2.5 建立使用者,併發放keyring
      • 2.6 客戶端執行掛載
      • 2.7 永久掛載
      • 2.8 許可權補充
      • 2.9 檢視檔案系統狀態

1. RBD

rbd是Rados Block Device的簡稱,是ceph叢集中常用的儲存型別,rbd是透過linux核心模組或librbd庫與osd之間完成互動,一般只有在為物理主機提供裝置的時候才會使用核心rbd模組,虛擬機器一般使用librbd庫,當rbd使用基於核心模組驅動時,可以使用linux自帶的頁快取來提高效能,當使用librbd庫時,使用rbd快取來提高效能。

1. RBD特性

  • 支援完整和增量快照
  • 自動精簡置備
  • 寫時複製
  • 動態調整大小
  • 記憶體內快取

rbd工作流程:

  1. 建立一個pool,建立rbd裝置並掛載
  2. 使用者寫入資料,ceph對資料切塊,每個塊的大小預設為4M,每個塊的名字時object+序號
  3. 將每個object透過hash演算法分配給對應的pg
  4. pg根據crush演算法會尋找3個osd,把這個object儲存在這3個osd上
  5. osd實際把硬碟格式化成xfs檔案系統,object儲存在這個檔案系統就相當於儲存了一個檔案 rbd0.object1.file

2. 建立rbd池並使用

2.1 建立rbd

[root@ceph01 ~]# ceph osd pool create rbd
pool 'rbd' created
[root@ceph01 ~]# ceph osd pool application enable rbd rbd
enabled application 'rbd' on pool 'rbd'
# 執行初始化rbd池
[root@ceph01 ~]# rbd pool init rbd

2.2 建立使用者

[root@ceph01 ~]# ceph auth get-or-create client.rbd mon 'profile rbd' osd ' profile rbd' 
[client.rbd]
	key = AQBYmVJmdzLLEBAAAuxze+16sFzNAUsTontr8Q==
[root@ceph01 ~]# ceph auth get client.rbd > ceph.client.rbd.keyring
exported keyring for client.rbd

這裡的許可權就是給的profile rbd 意思就是這個使用者只能對rbd進行操作,當然,是所有的rbd,如果想指定特定的rbd可以 ,allow rw pool=xxx這樣就是操作特定池的rbd

2.3 下發使用者key與ceph.conf

[root@ceph01 ~]# scp ceph.client.rbd.keyring /etc/ceph/ceph.conf 10.104.45.244:/etc/ceph/

2.4 客戶端檢視pool

來到客戶端

[root@client ~]# ceph osd pool ls --name client.rbd --keyring /etc/ceph/ceph.client.rbd.keyring
device_health_metrics
test_pool
test02
rbd

許可權正常

2.5 建立rbd塊

這一步操作也可以在客戶端上執行

[root@ceph01 ~]# rbd create rbd/test --name client.rbd --size 5G --image-format 2 --image
-feature layering

檢視rbd塊

[root@ceph01 ~]# rados -p rbd ls --name client.rbd
rbd_header.fd7dc75c9ce3
rbd_id.test
rbd_directory
rbd_info

目前我們看到的rbd塊裡面有4個物件,後期往裡面寫入檔案的時候這裡面的物件會越來越多

2.6 對映rbd並掛載

在客戶端操作

# 1. 載入rbd模組
[root@client ~]# modprobe rbd
# 2. 讓rbd模組開機自動載入
[root@client ~]# echo "rbd" >> /etc/modules-load.d/rbd.conf

先看一下塊裝置

[root@client ~]# fdisk -l
Disk /dev/sda: 50 GiB, 53687091200 bytes, 104857600 sectors
Disk model: Virtual disk    
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: A41913C9-11D3-4136-9C7A-4FF37D0A02D0

Device       Start       End   Sectors  Size Type
/dev/sda1     2048   1230847   1228800  600M EFI System
/dev/sda2  1230848   3327999   2097152    1G Linux filesystem
/dev/sda3  3328000 104855551 101527552 48.4G Linux LVM


Disk /dev/mapper/openeuler-root: 44.48 GiB, 47760539648 bytes, 93282304 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mapper/openeuler-swap: 3.93 GiB, 4219469824 bytes, 8241152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

目前機器上只有一個sda,並且是50G的

# 3. 對映rbd
[root@client ~]# rbd map --name client.rbd rbd/test
/dev/rbd0
# 4. 檢視rbd
[root@client ~]# fdisk -l |grep /dev/rbd0
Disk /dev/rbd0: 5 GiB, 5368709120 bytes, 10485760 sectors
# 5. 格式化塊裝置
[root@client ~]# mkfs.xfs /dev/rbd0 
meta-data=/dev/rbd0              isize=512    agcount=8, agsize=163840 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=0 inobtcount=0
data     =                       bsize=4096   blocks=1310720, imaxpct=25
         =                       sunit=16     swidth=16 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=16 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
Discarding blocks...Done.
# 6. 掛載使用
[root@client ~]# mkdir /rbd
[root@client ~]# mount /dev/rbd0 /rbd/
[root@client ~]# echo 111 > /rbd/test

2.7 開機自動對映

這個地方是開機自動對映,並不是自動掛載,因為在掛載之前如果沒有對映的話本地是沒有這塊磁碟的,所以也不存在能夠掛載

# 1. 編寫配置檔案
[root@client ~]# vim /etc/ceph/rbdmap
#poolname/imagename     id=client,keyring=/etc/ceph/ceph.client.keyring
rbd/test                id=rbd
# 2. 開機自啟動服務
[root@client ~]# systemctl enable --now rbdmap
Created symlink /etc/systemd/system/multi-user.target.wants/rbdmap.service → /usr/lib/systemd/system/rbdmap.service.
# 3. 開機自動掛載
[root@client ~]# tail -1 /etc/fstab 
/dev/rbd0	/rbd	xfs	defaults,_netdev 0 0

這裡的id=rbd是使用者名稱是rbd,並不是pool的名字

2.8 rbd create引數

  • --name:指定用哪個使用者建立
  • --size:指定建立的塊大小
  • --image-format:指定映象檔案格式,有1和2,1已經被廢棄
  • --image-feature:指定映象檔案的特性,可以指定多個
  • --stripe-unit:指定rbd儲存池中最小檔案塊的大小,不得小於4k,不得大於32M,預設4M
  • --stripe-count:如果指定了stripe-unit,則這個也需要指定,其表示一個資料可以並行寫入到多少個資料塊中,預設為1
Name 描述 ID
layering 支援分層快照特性,用於快照及寫時複製,可以對image建立快照並保護,然後從快照克隆出新的image,父子image之間採用COW技術,共享物件資料 1
striping 支援條帶化v2,類似於raid0,只不過ceph環境中的資料被分散到不同的物件中,可改善順序讀寫場景較多情況的效能 2
exclusive-lock 支援獨佔鎖,限制一個映象只能被一個客戶端使用 4
object-map 支援物件對映(依賴exclusive-lock),加速資料匯入匯出及已用空間統計等,此特性開啟的時候,會記錄image所有物件的一個點陣圖,用於標記物件是否真的存在,在一些場景下可以加速IO 8
fast-diff 加速計算映象與快照快照資料差異對比(依賴object-map) 16
deep-flatten 支援快照扁平化操作,用於快照管理時解決快照依賴關係等 32
journaling 修改資料是否記錄日誌,該特性可以透過記錄日誌回覆資料(依賴獨佔鎖),開啟此特性會增加系統IO使用 64
data-pool EC data pool support 128

在建立時,指定多個rbd特性

[root@ceph01 ~]# rbd create rbd/test --name client.rbd --size 5G --image-format 2 --image
-feature layering,exclusive-lock,object-map

也可以直接指定預設的特性,可以直接使用id,如果我想要 layering+deep-flatten,那麼id就是1+32=33

[root@ceph01 ~]# ceph config set client rbd_default_features 33
[root@ceph01 ~]# rbd create rbd/test01 --size 1G
[root@ceph01 ~]# rbd info rbd/test01
rbd image 'test01':
	size 1 GiB in 256 objects
	order 22 (4 MiB objects)
	snapshot_count: 0
	id: fdb9d96db2f9
	block_name_prefix: rbd_data.fdb9d96db2f9
	format: 2
	features: layering, deep-flatten
	op_features: 
	flags:
	create_timestamp: Sun May 26 11:37:08 2024
	access_timestamp: Sun May 26 11:37:08 2024
	modify_timestamp: Sun May 26 11:37:08 2024

看,這樣設定預設之後建立出來的rbd就都是layering, deep-flatten 這兩個特性了

2.9 rbd對映基本操作

# 檢視已對映裝置
[root@client ~]# rbd showmapped
id  pool  namespace  image  snap  device   
0   rbd              test   -     /dev/rbd0
# 取消對映,必須先取消掛載
[root@client ~]# umount /rbd 
[root@client ~]# rbd unmap rbd/test

3. 塊裝置操作

3.1 調整rbd大小

# 調大
[root@ceph01 ~]# rbd resize rbd/test --size 10G
Resizing image: 100% complete...done.
# 調小,慎重操作
[root@ceph01 ~]# rbd resize rbd/test --size 8G --allow-shrink
Resizing image: 100% complete...done.
[root@client ~]# fdisk -l |grep rbd
Disk /dev/rbd0: 8 GiB, 8589934592 bytes, 16777216 sectors

3.2 複製塊裝置

[root@ceph01 ~]# rbd ls rbd
test
test01
[root@ceph01 ~]# rbd cp rbd/test01 rbd/copy01
Image copy: 100% complete...done.

3.3 移動到其他pool

移動到其他的池也就是將rbd複製到其他的池裡去

# 建立一個池
[root@ceph01 ~]# ceph osd pool ls
device_health_metrics
test_pool
test02
rbd
[root@ceph01 ~]# ceph osd pool create mv_rbd 
pool 'mv_rbd' created
[root@ceph01 ~]# ceph osd pool application enable mv_rbd rbd
enabled application 'rbd' on pool 'mv_rbd'
[root@ceph01 ~]# rbd pool init mv_rbd

# 將copy01移動到 mv_rbd
[root@ceph01 ~]# rbd cp rbd/copy01 mv_rbd/mv_copy
Image copy: 100% complete...done.

當客戶端掛載了一個rbd(已經格式化完成的),並且想掛載這個rbd複製過來的另一個rbd時,這時候系統是會報錯的,原因是因為這兩個rbd是完全一樣的,系統識別是有點問題的,想要掛載的話必須取消之前的rbd對映,也就是說同一時間只能掛載一個,不管你是掛載的複製的還是被複制的,這倆只能有一個存在於系統上

4. rbd快照管理

4.1 建立快照

[root@ceph01 ~]# rbd snap create rbd/test@snapshot01
Creating snap: 100% complete...done.
[root@ceph01 ~]# rbd snap ls rbd/test
SNAPID  NAME        SIZE   PROTECTED  TIMESTAMP               
     4  snapshot01  8 GiB             Sun May 26 12:34:03 2024

4.2 回滾快照

# 到客戶端刪除rbd上的所有檔案
[root@client ~]# cd /rbd/
[root@client rbd]# ls
test
[root@client rbd]# rm test -f

# 解除安裝rbd
[root@client ~]# umount /rbd
# 回滾
[root@client ~]# rbd snap rollback rbd/test@snapshot01 --name client.rbd
Rolling back to snapshot: 100% complete...done
# 重新掛載檢視檔案
[root@client ~]# mount -a
[root@client ~]# cd /rbd/
[root@client rbd]# ls
test

4.3 保護快照

開啟了這個功能之後快照無法被刪除

[root@ceph01 ~]# rbd snap protect rbd/test@snapshot01
[root@ceph01 ~]# rbd info rbd/test@snapshot01
rbd image 'test':
	size 8 GiB in 2048 objects
	order 22 (4 MiB objects)
	snapshot_count: 1
	id: fd7dc75c9ce3
	block_name_prefix: rbd_data.fd7dc75c9ce3
	format: 2
	features: layering
	op_features: 
	flags: 
	create_timestamp: Sun May 26 10:22:11 2024
	access_timestamp: Sun May 26 10:22:11 2024
	modify_timestamp: Sun May 26 10:22:11 2024
	protected: True

4.4 刪除快照

[root@ceph01 ~]# rbd snap rm rbd/test@snapshot01
Removing snap: 0% complete...failed.
rbd: snapshot 'snapshot01' is protected from removal.
2024-05-26T12:44:29.788+0800 7fa5126fc1c0 -1 librbd::Operations: snapshot is protected

現在是刪不掉的,因為被保護了,我們需要取消保護

[root@ceph01 ~]# rbd snap unprotect rbd/test@snapshot01
[root@ceph01 ~]# rbd snap rm rbd/test@snapshot01
Removing snap: 100% complete...done.

4.5 克隆快照

克隆之前需要對被克隆的快照進行保護,原因是因為克隆出來的新快照是完全依賴於原先的快照的,如果原先的快照被刪除,那麼克隆出來的快照也將無法使用

# 先建立一個快照
[root@ceph01 ~]# rbd snap create rbd/test@snapshot01
Creating snap: 100% complete...done.
# 保護快照
[root@ceph01 ~]# rbd snap protect rbd/test@snapshot01
# 克隆新快照
[root@ceph01 ~]# rbd  clone rbd/test@snapshot01 rbd/clone_snap
[root@ceph01 ~]# rbd ls rbd/
clone_snap
copy01
test
test01

檢視資訊

[root@ceph01 ~]# rbd info rbd/clone_snap
rbd image 'clone_snap':
	size 8 GiB in 2048 objects
	order 22 (4 MiB objects)
	snapshot_count: 0
	id: fe76c24b54cf
	block_name_prefix: rbd_data.fe76c24b54cf
	format: 2
	features: layering
	op_features: 
	flags: 
	create_timestamp: Sun May 26 12:51:40 2024
	access_timestamp: Sun May 26 12:51:40 2024
	modify_timestamp: Sun May 26 12:51:40 2024
	parent: rbd/test@snapshot01
	overlap: 8 GiB

注意對比這個克隆出來的與其他的差異,這個rbd他有一個

parent: rbd/test@snapshot01,也就是說他是基於這個的,如果這個快照被刪除那麼這個克隆出來的也將無法使用,前面提到了

如果說我我就要讓他獨立存在呢?不受其他快照的影響,可以做到嗎?是可以的

# 合併父映象/快照拉平
[root@ceph01 ~]# rbd flatten rbd/clone_snap
Image flatten: 100% complete...done.
[root@ceph01 ~]# rbd info rbd/clone_snap
rbd image 'clone_snap':
	size 8 GiB in 2048 objects
	order 22 (4 MiB objects)
	snapshot_count: 0
	id: fe76c24b54cf
	block_name_prefix: rbd_data.fe76c24b54cf
	format: 2
	features: layering
	op_features: 
	flags: 
	create_timestamp: Sun May 26 12:51:40 2024
	access_timestamp: Sun May 26 12:51:40 2024
	modify_timestamp: Sun May 26 12:51:40 2024

這個時候再去看,他就沒有parent這個條目了,也就是說他可以獨立存在了

4.6 客戶端配置rbd快取

[root@client rbd]# vim /etc/ceph/ceph.conf
# 加入下列這些配置
[clienti.rbd]
rbd_cache = true
rbd_cache_size = 33554432 # 32M
rbd_cache_max_dirty = 25165824
rbd_cache_target_dirty = 16777216
rbd_cache_max_dirty_age = 1
rbd_cache_writethrough_until_flush = true

rbd快取:開啟之後想往磁碟寫資料會先記憶體,然後再從記憶體裡寫入到磁碟,加速寫入速度,開啟之後也會面臨風險,因為資料是先到記憶體,萬一斷電那麼就會丟失32M資料,因為快取大小是32M

2. CephFS

cephfs提供就是一個檔案系統,不像rbd一樣需要自己格式化

檔案系統(cephfs)與塊儲存(rbd)不同的是,塊儲存只需要一個儲存池就可以,而檔案系統需要2個儲存池,一個用來存放後設資料,存放後設資料的儲存池需要有一個mds來讀取。一個用來存放資料

1. mds是什麼

mds:matadata server

檔案系統需要存放後設資料和資料,但是儲存池裡面儲存的是物件,並不是後設資料,那麼需要使用檔案系統的話就必須具備將物件轉換成元素據的能力,這個就是mds的活,也就是轉換元素據的,他還能夠充當後設資料的快取,他的記憶體是可以快取一部分後設資料的。

2. 建立檔案系統

2.1 建立2個儲存池

# 1. 建立2個儲存池 data_cephfs,metadata_cephfs
# 儲存池名字可以隨便起
[root@ceph01 ~]# ceph osd pool create cephfs_data
pool 'cephfs_data' created
[root@ceph01 ~]# ceph osd pool create cephfs_metadata
pool 'cephfs_metadata' created
# 2. 繫結檔案系統型別
[root@ceph01 ~]# ceph osd pool application enable cephfs_metadata cephfs
enabled application 'cephfs' on pool 'cephfs_metadata'
[root@ceph01 ~]# ceph osd pool application enable cephfs_data cephfs
enabled application 'cephfs' on pool 'cephfs_data'

2.2 建立cephfs

# 先指定後設資料池,再指定資料池
[root@ceph01 ~]# ceph fs new mycephfs cephfs_metadata cephfs_data
new fs with metadata pool 13 and data pool 12

2.3 建立mds

如果不建立mds的話叢集過一會的健康狀態就會變成 HEALTH_ERR

[root@ceph01 ~]# ceph orch apply mds mycephfs --placement="3"
Scheduled mds.mycephfs update...

2.4 檢視檔案系統資訊

[root@ceph01 ~]# ceph fs dump
e8
enable_multiple, ever_enabled_multiple: 1,1
default compat: compat={},rocompat={},incompat={1=base v0.20,2=client writeable ranges,3=default file layouts on dirs,4=dir inode in separate object,5=mds uses versioned encoding,6=dirfrag is stored in omap,8=no anchor table,9=file layout v2,10=snaprealm v2}
legacy client fscid: 1
 
Filesystem 'mycephfs' (1)
fs_name	mycephfs
epoch	5
flags	12
created	2024-05-26T06:36:24.540439+0000
modified	2024-05-26T06:38:54.292138+0000
tableserver	0
root	0
session_timeout	60
session_autoclose	300
max_file_size	1099511627776
required_client_features	{}
last_failure	0
last_failure_osd_epoch	0
compat	compat={},rocompat={},incompat={1=base v0.20,2=client writeable ranges,3=default file layouts on dirs,4=dir inode in separate object,5=mds uses versioned encoding,6=dirfrag is stored in omap,7=mds uses inline data,8=no anchor table,9=file layout v2,10=snaprealm v2}
max_mds	1
in	0
up	{0=65215}
failed	
damaged	
stopped	
data_pools	[12]
metadata_pool	13
inline_data	disabled
balancer	
standby_count_wanted	1
[mds.mycephfs.ceph03.hgvfpj{0:65215} state up:active seq 2 join_fscid=1 addr [v2:10.104.45.243:6824/75731152,v1:10.104.45.243:6825/75731152] compat {c=[1],r=[1],i=[7ff]}]
 
 
Standby daemons:
 
[mds.mycephfs.ceph02.dhucfo{-1:65221} state up:standby seq 1 join_fscid=1 addr [v2:10.104.45.241:6826/3559035759,v1:10.104.45.241:6827/3559035759] compat {c=[1],r=[1],i=[7ff]}]
[mds.mycephfs.ceph01.fkwkdc{-1:65469} state up:standby seq 1 join_fscid=1 addr [v2:192.168.101.10:6824/2486210203,v1:192.168.101.10:6825/2486210203] compat {c=[1],r=[1],i=[7ff]}]
dumped fsmap epoch 8

2.5 建立使用者,併發放keyring

[root@ceph01 ~]# ceph auth get-or-create client.cephfs mon 'allow r' mds 'allow *' osd 'allow rw pool=cephfs_metadata,allow rw pool=cephfs_data' -o ceph.client.cephfs.keyring
[root@ceph01 ~]# scp ceph.client.cephfs.keyring 10.104.45.244:/etc/ceph/

Authorized users only. All activities may be monitored and reported.
root@10.104.45.244's password: 
ceph.client.cephfs.keyring                             100%   64   120.7KB/s   00:00 

2.6 客戶端執行掛載

掛載有2種方式

    1. 基於ceph-fuse的方式
    1. 基於系統核心的方式(推薦這種)
# 需要安裝ceph客戶端,如果不安裝mount -t ceph 會報錯沒有這個型別

# 1. 將使用者金鑰儲存到一個檔案。 只要金鑰,其他任何東西都不用寫
[root@client ~]# cat /etc/ceph/ceph.client.cephfs.keyring 
[client.cephfs]
	key = AQAP2lJm1BGICRAAblGZADS8xWfDsWl2keqzQw==
[root@client ~]# echo "AQAP2lJm1BGICRAAblGZADS8xWfDsWl2keqzQw==" > cephfs.key
[root@client ~]# mkdir /cephfs
[root@client ~]# mount -t ceph -o name=cephfs,secretfile=./cephfs.key  192.168.101.10,192.168.101.20,192.168.101.30:/ /cephfs

2.7 永久掛載

[root@client ~]# vim /etc/fstab
192.168.101.10,192.168.101.20,192.168.101.30:/ /cephfs ceph defaults,_netdev,name=cephfs,secretfile=/etc/ceph/cephfs.key

2.8 許可權補充

剛剛我們所給的許可權是可以直接掛載cephfs的根目錄的,如果我們只想給這個使用者掛載根目錄下的某個目錄,那麼就需要做進一步的許可權控制了

[root@ceph01 ~]# ceph fs authorize mycephfs client.user01 /nas rwps
[client.user01]
	key = AQCz4FJmZc+JAxAAtPPefz1dXPnwfoHH4LUXPw==

這裡的mycephfs就是這個使用者可以操作的檔案系統名, /nas 就是它能夠掛載的目錄 許可權是rwps也就是全部許可權 rw很好理解,p是管理許可權,s就是檔案系統(fs中的s)

2.9 檢視檔案系統狀態

[root@ceph01 ~]# ceph fs status
mycephfs - 1 clients
========
RANK  STATE            MDS               ACTIVITY     DNS    INOS   DIRS   CAPS  
 0    active  mycephfs.ceph03.hgvfpj  Reqs:    0 /s    11     13     12      1   
      POOL         TYPE     USED  AVAIL  
cephfs_metadata  metadata   300k   142G  
  cephfs_data      data       0    142G  
     STANDBY MDS        
mycephfs.ceph02.dhucfo  
mycephfs.ceph01.fkwkdc  
MDS version: ceph version 16.2.13 (5378749ba6be3a0868b51803968ee9cde4833a3e) pacific (stable)

相關文章