ceph存儲之RBD塊存儲


無論是通過Ceph塊設備、對象存儲還是文件系統,Ceph存儲群集都從Ceph客戶端接收數據,並將其存儲為對象。每個對象對應於文件系統中的一個文件,該文件存儲在對象存儲設備上。Ceph OSD守護程序處理存儲磁盤上的讀/寫操作。

此博文基於部署ceph集群 (Nautilus版)進行操作!

沒有特殊聲明,在 ceph-node-11 節點上執行

一、ceph資源池的相關概念

Ceph存儲系統支持“池”的概念,“池”是用於存儲對象的邏輯分區。

Ceph客戶端從Ceph監控器檢索集群映射,並將對象寫入池中。池的size副本數或副本數,CRUSH規則和放置組的數量決定了Ceph將如何放置數據。

數據存儲流程

1.1 創建存儲池

$ ceph osd pool create ceph-demo 64 64      # 創建一個名字為ceph-demo的pool(第一個64是pg數量,第二個64是pgp數量) 
pool 'ceph-demo' created

$ ceph osd lspools     # 查看當前所有pool
1 ceph-demo

$ ceph osd pool application enable ceph-demo rbd    # 將 ceph-demo 池分類為 rbd
enabled application 'rbd' on pool 'ceph-demo'

$ ceph osd pool application get ceph-demo     # 查看資源池類型為rbd
{
    "rbd": {}
}

1.2 ceph中pg與pgp的關系

pg是用來存放object的,pgp相當於是pg存放osd的一種排列組合!

舉例說明:比如有3個osd,osd1、osd2、osd3 ,副本數是2,如果pgp的數目是1,那么所有的pg存放的osd組合就只有一種,可能是[osd.1,osd.2],那么所有的pg主從副本分別存放到osd.1和osd.2,如果pgp設為2,那么其osd組合可以兩種,可能是[osd.1,osd.2]和[osd.1,osd.3],是不是很像我們高中數學學過的排列組合,pgp就是代表這個意思。一般來說應該將pg和pgp的數量設置為相等。

1.3 調整存儲池副本數

$ ceph osd pool get ceph-demo size     # 查看pool的副本數(默認副本為3)
size: 3

$ ceph osd pool set ceph-demo size 2    # 調整pool副本數為2
$ ceph osd pool get ceph-demo size      
size: 2

1.4 調整存儲池的pg即pgp數量

$ ceph osd pool get ceph-demo pg_num   # 查看pg和pgp的數量
pg_num: 64

$ ceph osd pool get ceph-demo pgp_num
pgp_num: 64

$ ceph osd pool set ceph-demo pg_num 128   # 調整pg數量為128
set pool 1 pg_num to 128
$ ceph osd pool get ceph-demo pg_num        # 查看確認
pg_num: 128

$ ceph osd pool set ceph-demo pgp_num 128   # 最好將pgp數量調整為和pg數量一致
set pool 1 pgp_num to 128
$ ceph osd pool get ceph-demo pgp_num   # 查看確認
pgp_num: 128

二、RDB(塊存儲)

ceph集群搭建起來后,可以在ceph集群上進行塊存儲、對象存儲以及文件系統存儲。從架構上來看,在ceph集群的上面是rados協議,該協議為使用ceph集群的用戶提供必要的支持(ceph用戶通過調用rados協議來使用ceph集群)。對於塊存儲來說,可以通過內核模塊的方式使用ceph集群也可以通過用戶態調用librbd庫來使用ceph集群。通過內核模塊方式可以充分的利用內核的page cache機制,而通過用戶態調用librbd也可以使用librbd在用戶態提供的cache方式提高性能。

在進行創建rbd之前,需要先按照上面的操作,創建出來一個可用的pool。

2.1 創建rbd

$ rbd -p ceph-demo ls        # 確認當前pool中沒有rbd

$ rbd create -p ceph-demo --image rbd-demo.img --size 10G
# 基於ceph-demo池創建名稱為rbd-demo.img的塊文件

$ rbd create ceph-demo/rbd-demo-1.img --size 10G 
# 換種語法格式創建第二個塊文件

$ rbd -p ceph-demo ls  # 查看ceph-demo池中的塊文件
rbd-demo-1.img
rbd-demo.img

2.2 查看塊文件的詳細信息

$ rbd info ceph-demo/rbd-demo.img    # 查看rbd-demo.img塊文件
rbd image 'rbd-demo.img':    # 此塊設備大小為10G,包含了2560個object,每個object的大小為4M
        size 10 GiB in 2560 objects
        order 22 (4 MiB objects)
        snapshot_count: 0
        id: 11194f22705d
        block_name_prefix: rbd_data.11194f22705d
        format: 2
        features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
        op_features:
        flags:
        create_timestamp: Sun Jun 13 17:13:51 2021
        access_timestamp: Sun Jun 13 17:13:51 2021
        modify_timestamp: Sun Jun 13 17:13:51 2021
$ rbd info -p ceph-demo --image rbd-demo.img  # 查看rbd-demo-1.img塊文件
rbd image 'rbd-demo.img':
        size 10 GiB in 2560 objects
        order 22 (4 MiB objects)
        snapshot_count: 0
        id: 11194f22705d
        block_name_prefix: rbd_data.11194f22705d
        format: 2
        features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
        op_features:
        flags:
        create_timestamp: Sun Jun 13 17:13:51 2021
        access_timestamp: Sun Jun 13 17:13:51 2021
        modify_timestamp: Sun Jun 13 17:13:51 2021

2.3 刪除塊設備

$ rbd -p ceph-demo rm --image rbd-demo-1.img
Removing image: 100% complete...done.

$ rbd -p ceph-demo ls   # 確認已刪除
rbd-demo.img

2.4 內核級別掛載使用塊設備

$ rbd map ceph-demo/rbd-demo.img
# 默認創建的塊文件有些特性不支持,會報錯如下
rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable ceph-demo/rbd-demo.img 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

2.5 刪除塊設備不支持的特性

$ rbd info ceph-demo/rbd-demo.img   # 查看塊設備特性
rbd image 'rbd-demo.img':
        size 10 GiB in 2560 objects
        order 22 (4 MiB objects)
        snapshot_count: 0
        id: 11194f22705d
        block_name_prefix: rbd_data.11194f22705d
        format: 2
        features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
        op_features:
        flags:
        create_timestamp: Sun Jun 13 17:13:51 2021
        access_timestamp: Sun Jun 13 17:13:51 2021
        modify_timestamp: Sun Jun 13 17:13:51 2021

# 刪除不支持的特性
$ rbd feature disable ceph-demo/rbd-demo.img deep-flatten
$ rbd feature disable ceph-demo/rbd-demo.img  fast-diff        
# 刪除上面兩個后,就可以再次進行內核級別掛載了,如果還不行,再刪除下面兩個
$ rbd feature disable ceph-demo/rbd-demo.img  object-map
$ rbd feature disable ceph-demo/rbd-demo.img  exclusive-lock

$ rbd info ceph-demo/rbd-demo.img      # 確認不支持的特性已刪除 
rbd image 'rbd-demo.img':
        size 10 GiB in 2560 objects
        order 22 (4 MiB objects)
        snapshot_count: 0
        id: 11194f22705d
        block_name_prefix: rbd_data.11194f22705d
        format: 2
        features: layering    # layering特性需要保持
        op_features:
        flags:
        create_timestamp: Sun Jun 13 17:13:51 2021
        access_timestamp: Sun Jun 13 17:13:51 2021
        modify_timestamp: Sun Jun 13 17:13:51 2021
        
$ rbd map ceph-demo/rbd-demo.img   # 再次映射塊設備
/dev/rbd0        

2.6 查看塊設備

$ rbd device list
id pool      namespace image        snap device
0  ceph-demo           rbd-demo.img -    /dev/rbd0

$ lsblk /dev/rbd0
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
rbd0 252:0    0  10G  0 disk

至此,就可以將/dev/rbd0當成我們一個本地的磁盤來使用了。

2.7 格式化並使用塊設備

如果將ceph對接雲平台,當成雲盤來使用,那么不建議對塊設備進行分區,這樣可以避免塊設備擴容帶來的麻煩。

$ 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

# 掛載並測試使用
$ mkdir /data && mount /dev/rbd0 /data/
$ echo 'test block' > /data/test.txt 

2.8 RBD數據寫入流程

2021-06-13_172759

一個文件被切割成多個object,每個object大小為4M,object存儲到pg上(經過hash運算,再取掩碼,得到它要落到哪個pg上,),pg再通過crush算法,最終找到對應的osd上。

2.9 RDB塊設備擴容

rdb塊設備,支持擴縮容,但是對於縮容操作,強烈不建議,可能會造成數據丟失。

$ rbd -p ceph-demo info --image rbd-demo.img    # 確認當前塊設備大小
rbd image 'rbd-demo.img':
        size 10 GiB in 2560 objects
        order 22 (4 MiB objects)
        snapshot_count: 0
        id: 11194f22705d
        block_name_prefix: rbd_data.11194f22705d
        format: 2
        features: layering
        op_features:
        flags:
        create_timestamp: Sun Jun 13 17:13:51 2021
        access_timestamp: Sun Jun 13 17:13:51 2021
        modify_timestamp: Sun Jun 13 17:13:51 2021
        
$ rbd resize ceph-demo/rbd-demo.img --size 20G
# 從10G大小擴容到20G
Resizing image: 100% complete...done.

$ rbd -p ceph-demo info --image rbd-demo.img    # 確認已擴容20G
rbd image 'rbd-demo.img':
        size 20 GiB in 5120 objects
        order 22 (4 MiB objects)
        snapshot_count: 0
        id: 11194f22705d
        block_name_prefix: rbd_data.11194f22705d
        format: 2
        features: layering
        op_features:
        flags:
        create_timestamp: Sun Jun 13 17:13:51 2021
        access_timestamp: Sun Jun 13 17:13:51 2021
        modify_timestamp: Sun Jun 13 17:13:51 2021
        
$ df -hT /data   # 此時塊設備已經擴容,但文件系統還未識別到,如下,還是原來的10G
文件系統       類型  容量  已用  可用 已用% 掛載點
/dev/rbd0      xfs    10G   33M   10G    1% /data        
$ xfs_growfs /dev/rbd0
$ partprobe
# 擴容文件系統(原磁盤是xfs格式的,故需要使用xfs_growfs指令擴容)

$ resize2fs /dev/rbd0
# 如果你格式化為ext4的,請執行該命令

$ df -hT /data    # 確認已擴容成功
文件系統       類型  容量  已用  可用 已用% 掛載點
/dev/rbd0      xfs    20G   34M   20G    1% /data


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM