ceph塊儲存場景
1、建立rbd使用的儲存池。
admin節點需要安裝ceph才能使用該命令,如果沒有,也可以切換到ceph-node1節點去操作。
[cephfsd@ceph-admin ceph]$ ceph osd pool create rbd_data 64 64 pool 'rbd_data' created [cephfsd@ceph-admin ceph]$ rbd pool init rbd_data [cephfsd@ceph-admin ceph]$ ceph -s cluster: id: 6d3fd8ed-d630-48f7-aa8d-ed79da7a69eb health: HEALTH_OK services: mon: 1 daemons, quorum ceph-admin mgr: ceph-admin(active) mds: cephfs-1/1/1 up {0=ceph-node3=up:active}, 2 up:standby osd: 3 osds: 3 up, 3 in data: pools: 3 pools, 192 pgs objects: 21 objects, 7.77KiB usage: 3.00GiB used, 27.0GiB / 30.0GiB avail pgs: 192 active+clean [cephfsd@ceph-admin ceph]$
注:
# 不能使用之前已經註冊的pool。 [cephfsd@ceph-admin opt]$ sudo rbd pool init cephfs_data rbd: pool already registered to a different application. [cephfsd@ceph-admin opt]$
2、建立rbd
可以看到,rbd池的pg建立完成了,預設情況下,使用的pool是3副本配置,測試建立一塊rbd試下
[cephfsd@ceph-admin ceph]$ rbd create testrbd --size=10G rbd: error opening default pool 'rbd' Ensure that the default pool has been created or specify an alternate pool name. [cephfsd@ceph-admin ceph] # 加上-p引數,指定pool的名字 [cephfsd@ceph-admin ceph]$ rbd create testrbd --size=10G -p rbd_data 或者 [cephfsd@ceph-admin ceph]$ rbd create rbd_data/testrbd --size=10G [cephfsd@ceph-admin ceph]$ rbd info rbd_data/testrbd rbd image 'testrbd': size 10GiB in 2560 objects order 22 (4MiB objects) block_name_prefix: rbd_data.373e6b8b4567 format: 2 features: layering, exclusive-lock, object-map, fast-diff, deep-flatten flags: create_timestamp: Fri Dec 6 16:06:55 2019 [cephfsd@ceph-admin ceph]$
3、對映rbd塊裝置到伺服器。
# 在Ceph client端將該rbd映象對映為本地裝置時出錯。 [cephfsd@ceph-admin ceph]$ sudo rbd map rbd_data/testrbd rbd: sysfs write failed RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable rbd_data/testrbd 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 # 檢視系統列印的資訊 [cephfsd@ceph-admin ceph]$ dmesg | tail [147187.581929] fuse init (API version 7.23) [154167.356761] libceph: mon0 172.16.143.121:6789 session established [154167.356931] libceph: client14124 fsid 6d3fd8ed-d630-48f7-aa8d-ed79da7a69eb [171895.244253] rbd: loaded (major 252) [174742.162661] libceph: mon0 172.16.143.121:6789 session established [174742.162851] libceph: client14145 fsid 6d3fd8ed-d630-48f7-aa8d-ed79da7a69eb [174742.166056] rbd: image testrbd: image uses unsupported features: 0x38 [175730.260351] libceph: mon0 172.16.143.121:6789 session established [175730.260439] libceph: client14148 fsid 6d3fd8ed-d630-48f7-aa8d-ed79da7a69eb [175730.263530] rbd: image testrbd: image uses unsupported features: 0x38 [cephfsd@ceph-admin ceph]$ # 檢視系統核心版本 [cephfsd@ceph-admin ceph]$ uname -a Linux ceph-admin 3.10.0-1062.el7.x86_64 #1 SMP Wed Aug 7 18:08:02 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux [cephfsd@ceph-admin ceph]$ ceph --version ceph version 12.2.12 (1436006594665279fe734b4c15d7e08c13ebd777) luminous (stable) # 再檢視testrbd映像的特性 [cephfsd@ceph-admin ceph]$ rbd info rbd_data/testrbd rbd image 'testrbd': size 10GiB in 2560 objects order 22 (4MiB objects) block_name_prefix: rbd_data.373e6b8b4567 format: 2 features: layering, exclusive-lock, object-map, fast-diff, deep-flatten flags: create_timestamp: Fri Dec 6 16:06:55 2019 [cephfsd@ceph-admin ceph]$
可以看到testrbd擁有特性:layering, exclusive-lock, object-map, fast-diff, deep-flatten
這些特性分別表示:
- layering: 支援分層
- striping: 支援條帶化 v2
- exclusive-lock: 支援獨佔鎖
- object-map: 支援物件對映(依賴 exclusive-lock )
- fast-diff: 快速計算差異(依賴 object-map )
- deep-flatten: 支援快照扁平化操作
- journaling: 支援記錄 IO 操作(依賴獨佔鎖)
不過遺憾的是CentOS的3.10核心僅支援其中的layering feature,其他feature概不支援。我們需要手動disable這些features:
方法一:直接disable
# 禁止其他features [cephfsd@ceph-admin ceph]$ rbd feature disable rbd_data/testrbd exclusive-lock, object-map, fast-diff, deep-flatten [cephfsd@ceph-admin ceph]$ rbd info rbd_data/testrbd rbd image 'testrbd': size 10GiB in 2560 objects order 22 (4MiB objects) block_name_prefix: rbd_data.373e6b8b4567 format: 2 features: layering flags: create_timestamp: Fri Dec 6 16:06:55 2019 [cephfsd@ceph-admin ceph]$
禁用特性後,再次對映成功。
[cephfsd@ceph-admin ceph]$ sudo rbd map rbd_data/testrbd /dev/rbd0 [cephfsd@ceph-admin ceph]$ ll /dev/rbd0 brw-rw----. 1 root disk 252, 0 Dec 6 17:09 /dev/rbd0
方法二:修改配置ceph.conf
# 不過每次這麼來disable可是十分麻煩的,一勞永逸的方法是在各個cluster node的/etc/ceph/ceph.conf中加上這樣一行配置:
rbd_default_features = 1 #僅是layering對應的bit碼所對應的整數
# 設定完後,通過下面命令檢視配置變化
[cephfsd@ceph-admin ceph]$ ceph --show-config|grep rbd|grep features rbd_default_features =
方法三:修改format版本
經過檢視ceph文件rbd 塊映象有支援兩種格式:
--image-format format-id
format-id取值為1或2,預設為 2。
format 1 - 新建 rbd 映像時使用最初的格式。此格式相容所有版本的 librbd 和核心模組,但是不支援較新的功能,像克隆。
format 2 - 使用第二版 rbd 格式, librbd 和 3.11 版以上核心模組才支援(除非是分拆的模組)。此格式增加了克隆支援,使得擴充套件更容易,還允許以後增加新功能。
這裡把format指定為1之後,重新對映就好了。
# 注意:需要重新建立映象。 [cephfsd@ceph-admin ceph]$ rbd create rbd_data/testrbd2 --size=1G --image-format 1 # 檢視已經建立的rbd [cephfsd@ceph-admin ceph]$ rbd ls -p rbd_data testrbd2 testrbd # 對映該rbd [cephfsd@ceph-admin ceph]$ sudo rbd map rbd_data/testrbd2 /dev/rbd1 [cephfsd@ceph-admin ceph]$ ll /dev/rbd1 brw-rw----. 1 root disk 252, 16 Dec 6 17:32 /dev/rbd1
方法四:指定開啟哪個features
# 建立rbd映象時就指明需要的特性 [cephfsd@ceph-admin ceph]$ rbd create rbd_data/testrbd3 --size=1G --image-feature layering [cephfsd@ceph-admin ceph]$ rbd ls -p rbd_data testrbd2 testrbd testrbd3 [cephfsd@ceph-admin ceph]$ rbd map rbd_data/testrbd3 rbd: sysfs write failed In some cases useful info is found in syslog - try "dmesg | tail". rbd: map failed: (13) Permission denied [cephfsd@ceph-admin ceph]$ sudo rbd map rbd_data/testrbd3 /dev/rbd2 [cephfsd@ceph-admin ceph]$ ll /dev/rbd rbd/ rbd0 rbd1 rbd2 [cephfsd@ceph-admin ceph]$ ll /dev/rbd2 brw-rw----. 1 root disk 252, 32 Dec 6 17:38 /dev/rbd2 [cephfsd@ceph-admin ceph]$ # ok,對映成功,故障解決!
禁用特性後,再次對映成功。
# 檢視塊對映map情況 [cephfsd@ceph-admin rbd]$ rbd showmapped id pool image snap device 0 rbd_data testrbd - /dev/rbd0 1 rbd_data testrbd2 - /dev/rbd1 2 rbd_data testrbd3 - /dev/rbd2
4、格式化並掛載該rbd塊
map後,我們就可以像格式化一個空image那樣對其進行格式化了,這裡格成ext4檔案系統(格式化這一步大可不必,在後續小節中你會看到):
# 格式化該rbd裝置 [cephfsd@ceph-admin ceph]$ sudo 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 # 建立掛載目錄 [cephfsd@ceph-admin ceph]$ sudo mkdir /mnt/rbd # 開始掛載 [cephfsd@ceph-admin ceph]$ sudo mount /dev/rbd0 /mnt/rbd/ [cephfsd@ceph-admin ceph]$ df -Th Filesystem Type Size Used Avail Use% Mounted on devtmpfs devtmpfs 484M 0 484M 0% /dev tmpfs tmpfs 496M 0 496M 0% /dev/shm tmpfs tmpfs 496M 39M 458M 8% /run tmpfs tmpfs 496M 0 496M 0% /sys/fs/cgroup /dev/mapper/centos-root xfs 46G 1.9G 44G 5% / /dev/sda1 xfs 497M 130M 368M 26% /boot tmpfs tmpfs 100M 0 100M 0% /run/user/0 172.16.143.121:6789:/ ceph 8.5G 0 8.5G 0% /opt /dev/rbd0 xfs 10G 33M 10G 1% /mnt/rbd [cephfsd@ceph-admin ceph]$ # 掛載成功,寫點東西進去 [cephfsd@ceph-admin rbd]$ sudo touch rbd_test [cephfsd@ceph-admin rbd]$ ll total 0 -rw-r--r--. 1 root root 0 Dec 6 18:38 rbd_test [cephfsd@ceph-admin rbd]$ sudo vim rbd_test [cephfsd@ceph-admin rbd]$ ll total 4 -rw-r--r--. 1 root root 12 Dec 6 18:38 rbd_test [cephfsd@ceph-admin rbd]$ cat rbd_test adsga rbd 0 [cephfsd@ceph-admin rbd]$
rbd其他命令
對映塊裝置
# 用 rbd 把映像名對映為核心模組。必須指定映像名、儲存池名、和使用者名稱。若 RBD 核心模組尚未載入, rbd 命令會自動載入。 sudo rbd map {pool-name}/{image-name} --id {user-name} # 例如: sudo rbd map rbd/myimage --id admin # 如果你啟用了 cephx 認證,還必須提供金鑰,可以用金鑰環或金鑰檔案指定金鑰。 sudo rbd map rbd/myimage --id admin --keyring /path/to/keyring sudo rbd map rbd/myimage --id admin --keyfile /path/to/fil
檢視已經對映的塊裝置
rbd showmappe
取消塊裝置對映
sudo rbd unmap /dev/rbd/{poolname}/{imagename}
檢視塊裝置映像
# 要列出 rbd 儲存池中的塊裝置,可以用下列命令(即 rbd 是預設儲存池名字): rbd ls # 用下列命令羅列某個特定儲存池中的塊裝置,用儲存池的名字替換 {poolname} : rbd ls {poolname} 例如: rbd ls swimmingpool
檢視映像資訊
# 用下列命令檢索某個特定映像的資訊,用映像名字替換 {image-name} : rbd info {image-name} # 例如: rbd info foo # 用下列命令檢索某儲存池內的映像的資訊,用映像名字替換 {image-name} 、用儲存池名字替換 {pool-name} : rbd info {pool-name}/{image-name} # 例如: rbd info swimmingpool/bar
調整塊裝置映像大小
sudo rbd resize --size 512 test/foo --allow-shrink #調小 sudo rbd resize --size 4096 test/foo #調大
刪除塊裝置
sudo rbd rm test/foo
5、建立快照
[cephfsd@ceph-admin rbd]$ rbd snap create --snap mysnap rbd_data/testrbd [cephfsd@ceph-admin rbd]$ rbd snap ls rbd_data/testrbd SNAPID NAME SIZE TIMESTAMP 4 mysnap 10GiB Fri Dec 6 19:14:07 2019 [cephfsd@ceph-admin rbd]$
如上,建立了一個rbd_data/testrbd的快照,快照名叫mysnap。
6、回滾
# 回滾前先看一下現在是什麼樣子。 [cephfsd@ceph-admin rbd]$ ll total 4 -rw-r--r--. 1 root root 0 Dec 6 19:17 abc -rw-r--r--. 1 root root 12 Dec 6 18:38 rbd_test # rbd_test是建快照之前就有的,把所有檔案刪除 [cephfsd@ceph-admin rbd]$ sudo rm -rf * [cephfsd@ceph-admin rbd]$ ll total 0 [cephfsd@ceph-admin rbd]$ df -TH Filesystem Type Size Used Avail Use% Mounted on devtmpfs devtmpfs 508M 0 508M 0% /dev tmpfs tmpfs 520M 0 520M 0% /dev/shm tmpfs tmpfs 520M 40M 480M 8% /run tmpfs tmpfs 520M 0 520M 0% /sys/fs/cgroup /dev/mapper/centos-root xfs 49G 2.0G 47G 5% / /dev/sda1 xfs 521M 136M 386M 26% /boot tmpfs tmpfs 104M 0 104M 0% /run/user/0 172.16.143.121:6789:/ ceph 9.2G 0 9.2G 0% /opt /dev/rbd0 xfs 11G 35M 11G 1% /mnt/rbd # 解除安裝塊 [cephfsd@ceph-admin rbd]$ sudo umount /dev/rbd0 umount: /mnt/rbd: target is busy. (In some cases useful info about processes that use the device is found by lsof(8) or fuser(1)) [cephfsd@ceph-admin rbd]$ pwd /mnt/rbd # 因為當前進入了這個塊裝置目錄,所以無法解除安裝,先離開當前目錄。 [cephfsd@ceph-admin rbd]$ cd # 解除安裝成功 [cephfsd@ceph-admin ~]$ sudo umount /dev/rbd0 [cephfsd@ceph-admin ~]$ df -Th Filesystem Type Size Used Avail Use% Mounted on devtmpfs devtmpfs 484M 0 484M 0% /dev tmpfs tmpfs 496M 0 496M 0% /dev/shm tmpfs tmpfs 496M 39M 458M 8% /run tmpfs tmpfs 496M 0 496M 0% /sys/fs/cgroup /dev/mapper/centos-root xfs 46G 1.9G 44G 5% / /dev/sda1 xfs 497M 130M 368M 26% /boot tmpfs tmpfs 100M 0 100M 0% /run/user/0 172.16.143.121:6789:/ ceph 8.5G 0 8.5G 0% /opt [cephfsd@ceph-admin ~]$ ll /mnt/rbd/ total 0 # 開始回滾 [cephfsd@ceph-admin ~]$ rbd snap rollback rbd_data/testrbd@mysnap Rolling back to snapshot: 100% complete...done. # 重新掛載 [cephfsd@ceph-admin ~]$ sudo mount /dev/rbd0 /mnt/rbd/ # 檢查該檔案是否和建立快照時一模一樣 [cephfsd@ceph-admin ~]$ ll /mnt/rbd/ total 4 -rw-r--r--. 1 root root 12 Dec 6 18:38 rbd_test [cephfsd@ceph-admin ~]$ cat /mnt/rbd/rbd_test adsga rbd 0 [cephfsd@ceph-admin ~]$
7、克隆
檢視該塊裝置支不支援克隆,image-format必須為2
[cephfsd@ceph-admin ~]$ rbd info rbd_data/testrbd rbd image 'testrbd': size 10GiB in 2560 objects order 22 (4MiB objects) block_name_prefix: rbd_data.373e6b8b4567 format: 2 features: layering flags: create_timestamp: Fri Dec 6 16:06:55 2019 # 如果不是,則需要在建立快照的時候就指定--image-format為2 rbd create rbd_data/testrbd4 --size 1G --image-format 2
把該塊做成模板,需要先把該模板的快照設定成protect(重要)
# 設定快照為protect [cephfsd@ceph-admin ~]$ rbd snap protect rbd_data/testrbd@mysnap # 可以通過unprotect取消保護,但是這樣就不能克隆了 [cephfsd@ceph-admin ~]$ rbd snap unprotect rbd_data/testrbd@mysnap [cephfsd@ceph-admin ~]$ rbd info rbd_data/testrbd rbd image 'testrbd': size 10GiB in 2560 objects order 22 (4MiB objects) block_name_prefix: rbd_data.373e6b8b4567 format: 2 features: layering flags: create_timestamp: Fri Dec 6 16:06:55 2019 # 這裡我們把它設定回來,設為protect [cephfsd@ceph-admin ~]$ rbd snap protect rbd_data/testrbd@mysnap
解除安裝該塊
[cephfsd@ceph-admin ~]$ sudo umount /dev/rbd0 [cephfsd@ceph-admin ~]$ df -Th Filesystem Type Size Used Avail Use% Mounted on devtmpfs devtmpfs 484M 0 484M 0% /dev tmpfs tmpfs 496M 0 496M 0% /dev/shm tmpfs tmpfs 496M 45M 452M 9% /run tmpfs tmpfs 496M 0 496M 0% /sys/fs/cgroup /dev/mapper/centos-root xfs 46G 1.9G 44G 5% / /dev/sda1 xfs 497M 130M 368M 26% /boot tmpfs tmpfs 100M 0 100M 0% /run/user/0 172.16.143.121:6789:/ ceph 8.5G 0 8.5G 0% /opt [cephfsd@ceph-admin ~]$
開始克隆
[cephfsd@ceph-admin ~]$ rbd clone rbd_data/testrbd@mysnap rbd_data/testrbd_clone [cephfsd@ceph-admin ~]$ rbd -p rbd_data ls testrbd2 testrbd testrbd3 testrbd_clone [cephfsd@ceph-admin ~] # 可以看到多出了一個克隆出來的塊testrbd_clone
檢視區別
檢查克隆出來的testrbd_clone和之前的testrbd有沒有什麼區別:
# 對映testrbd_clone [cephfsd@ceph-admin ~]$ sudo rbd map rbd_data/testrbd_clone /dev/rbd3 # 建立掛載目錄 [cephfsd@ceph-admin ~]$ sudo mkdir /mnt/rbd_clone # 掛載克隆的塊 [cephfsd@ceph-admin ~]$ sudo mount /dev/rbd3 /mnt/rbd_clone/ # 檢視克隆的塊的詳情 [cephfsd@ceph-admin ~]$ ll /mnt/rbd_clone/ total 4 -rw-r--r--. 1 root root 12 Dec 6 18:38 rbd_test [cephfsd@ceph-admin ~]$ cat /mnt/rbd_clone/rbd_test adsga rbd 0 [cephfsd@ceph-admin ~]$ # 發現testrbd_clone和testrbd快照的內容是一模一樣的,因為是從那個快照克隆過來的 # 檢視 testrbd_clone資訊 [cephfsd@ceph-admin ~]$ rbd info rbd_data/testrbd_clone rbd image 'testrbd_clone': size 10GiB in 2560 objects order 22 (4MiB objects) block_name_prefix: rbd_data.375f6b8b4567 format: 2 features: layering flags: create_timestamp: Fri Dec 6 19:56:21 2019 parent: rbd_data/testrbd@mysnap overlap: 10GiB [cephfsd@ceph-admin ~]$
flatten合併
父映象與克隆映象合併
這個時候的testrbd_clone還是依賴testrbd的映象mysnap的,如果testrbd的mysnap被刪除或者怎麼樣,testrbd_clone也不能夠使用了,要想獨立出去,就必須將父映象的資訊合併flattern到子映象中
# 合併前 [cephfsd@ceph-admin ~]$ rbd info rbd_data/testrbd_clone rbd image 'testrbd_clone': size 10GiB in 2560 objects order 22 (4MiB objects) block_name_prefix: rbd_data.375f6b8b4567 format: 2 features: layering flags: create_timestamp: Fri Dec 6 19:56:21 2019 parent: rbd_data/testrbd@mysnap overlap: 10GiB [cephfsd@ceph-admin ~]$ # 開始flatten合併 [cephfsd@ceph-admin ~]$ rbd flatten rbd_data/testrbd_clone Image flatten: 100% complete...done. # 合併後,檢視testrbd_clone發現已經沒有parent資訊了,因為已經獨立了 [cephfsd@ceph-admin ~]$ rbd info rbd_data/testrbd_clone rbd image 'testrbd_clone': size 10GiB in 2560 objects order 22 (4MiB objects) block_name_prefix: rbd_data.375f6b8b4567 format: 2 features: layering flags: create_timestamp: Fri Dec 6 19:56:21 2019 [cephfsd@ceph-admin ~]$ # 此時就可以刪除快照模板了 [cephfsd@ceph-admin ~]$ rbd snap unprotect rbd_data/testrbd@mysnap [cephfsd@ceph-admin ~]$ rbd snap rm rbd_data/testrbd@mysnap [cephfsd@ceph-admin ~]$ rbd snap ls rbd_data/testrbd # 映象模板已刪除
8、k8s使用rbd作後端儲存
參考下一篇文件:
引用:
參考:http://www.strugglesquirrel.com/2019/04/23/centos7%E9%83%A8%E7%BD%B2ceph/