1. 程式人生 > 其它 >ceph塊儲存場景

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/