1. 程式人生 > 其它 >CEPH-3:cephfs功能詳解

CEPH-3:cephfs功能詳解

ceph叢集cephfs使用詳解

一個完整的ceph叢集,可以提供塊儲存、檔案系統和物件儲存。

本節主要介紹檔案系統cephfs功能如何靈活的使用,叢集背景:

[[email protected] ~]$ ceph -s 
  cluster:
    id:     f0a8789e-6d53-44fa-b76d-efa79bbebbcf
    health: HEALTH_OK
 
  services:
    mon: 1 daemons, quorum a (age 24h)
    mgr: a(active, since 14h)
    mds: cephfs:1 {0=cephfs-a=up:active} 1 up:standby-replay
    osd: 1 osds: 1 up (since 24h), 1 in (since 26h)
    rgw: 1 daemon active (my.store.a)
 
  data:
    pools:   10 pools, 200 pgs
    objects: 719 objects, 1.3 GiB
    usage:   54 GiB used, 804 GiB / 858 GiB avail
    pgs:     200 active+clean
 
  io:
    client:   852 B/s rd, 1 op/s rd, 0 op/s wr

cephfs檔案系統介紹

cephfs介紹

cephfs即ceph filesystem,是一個基於ceph叢集且相容POSIX標準的檔案共享系統,建立cephfs檔案系統時需要在ceph叢集中新增mds服務。cephfs支援以核心模組方式載入也支援fuse方式載入。無論是核心模式還是fuse模式,都是通過呼叫libcephfs庫來實現cephfs檔案系統的載入。

fuse使用者態和kernel核心態兩種掛載cephfs的優劣式:

  • fuse 客戶端最容易與伺服器做到程式碼級的同步,但是核心客戶端的效能通常更好。
  • 這兩種客戶端不一定會提供一樣的功能,如 fuse 客戶端可支援客戶端強制配額,但核心客戶端卻不支援。
  • 遇到缺陷或效能問題時,最好試試另一個客戶端,以甄別此缺陷是否特定於客戶端

mds元件介紹

mds是該服務負責處理POSIX檔案系統中的metadata部分,實際的資料部分交由ceph叢集中的OSD處理,mds提供了一個帶智慧快取層的共享型連續檔案系統,可以大大減少 OSD 讀寫操作頻率。

cephfs元資料使用的動態子樹分割槽,把元資料劃分名稱空間下對應到不同的mds,寫入元資料的時候將元資料按照名稱儲存到不同主mds上,類似於nginx中的快取目錄分層。

cephfs工作流程

  1. 建立cephfs時會指定兩個儲存池,一個專門來儲存元資料,一個專門來儲存實際檔案;
  2. 客戶端在寫(讀)檔案時,首先寫(讀)mds服務快取中檔案的元資料資訊,當然儲存在mds的元資料最終還是要落盤到osd pool中的;
  3. mds和rados之間通過journal metadate互動,這個journal是記錄檔案寫入日誌的,這個也是存放到OSD當中;
  4. 最終客戶端得到元資料資訊,獲取rados對某個檔案的IO操作,實現檔案讀寫。

cephfs狀態檢視

$ ceph fs status
cephfs - 0 clients
======
+------+----------------+----------+---------------+-------+-------+
| Rank |     State      |   MDS    |    Activity   |  dns  |  inos |
+------+----------------+----------+---------------+-------+-------+
|  0   |     active     | cephfs-a | Reqs:    0 /s |   30  |   25  |
| 0-s  | standby-replay | cephfs-b | Evts:    0 /s |   24  |   17  |
+------+----------------+----------+---------------+-------+-------+
+-----------------+----------+-------+-------+
|       Pool      |   type   |  used | avail |
+-----------------+----------+-------+-------+
| cephfs-metadata | metadata |  289k |  760G |
|   cephfs-data0  |   data   |  805  |  760G |
+-----------------+----------+-------+-------+
+-------------+
| Standby MDS |
+-------------+
+-------------+

$ ceph mds stat
cephfs:1 {0=cephfs-a=up:active} 1 up:standby-replay

cephfs使用演示

cephfs安裝步驟已經通過上節部署文件中演示過,此處不再贅述,僅介紹本次演示所涉及到的pool名稱:

$ ceph fs ls 
name: cephfs, metadata pool: cephfs-metadata, data pools: [cephfs-data0 ]

$ ceph osd lspools 
cephfs-metadata  #用來存放mds資料
cephfs-data0     #用來存放data資料

先通過第一種方法:以核心模組方式掛載(一般都用此種方式)

首先要確認核心模組是否載入

# lsmod | grep ceph
ceph                  363016  0 
libceph               306750  2 rbd,ceph
dns_resolver           13140  1 libceph
libcrc32c              12644  4 xfs,libceph,nf_nat,nf_conntrack

先建立用來專門掛載的ceph使用者

## 建立 client.mfan 使用者,並授權可讀 MON、可讀寫mds 和 可讀寫執行名稱cephfs-data0的OSD 
$ ceph auth add client.mfan mon 'allow r' mds 'allow rw' osd 'allow rwx pool=cephfs-data0'
added key for client.mfan

## 輸出金鑰
$ ceph auth get client.mfan -o /etc/ceph/ceph.client.mfan.keyring
exported keyring for client.mfan

## 測試訪問叢集
$ ceph -s --user mfan 
  cluster:
    id:     f0a8789e-6d53-44fa-b76d-efa79bbebbcf
    health: HEALTH_OK
 
  services:
    mon: 1 daemons, quorum a (age 42h)
    mgr: a(active, since 33h)
    mds: cephfs:1 {0=cephfs-a=up:active} 1 up:standby-replay
    osd: 1 osds: 1 up (since 42h), 1 in (since 44h)
    rgw: 1 daemon active (my.store.a)
 
  data:
    pools:   10 pools, 200 pgs
    objects: 719 objects, 1.3 GiB
    usage:   55 GiB used, 803 GiB / 858 GiB avail
    pgs:     200 active+clean
 
  io:
    client:   852 B/s rd, 1 op/s rd, 0 op/s wr

獲取使用者名稱和金鑰

$ ceph auth get client.mfan
exported keyring for client.mfan
[client.mfan]
	key = AQD600NibhPBJxAAzKeTOcQ17xaPhEdZ8npehg==
	caps mds = "allow rw"
	caps mon = "allow r"
	caps osd = "allow rwx pool=cephfs-data0"

命令列掛載cephfs,有兩種方式:

第一種:

## 掛載
# mount -t ceph 10.153.204.13:6789:/ /home/cephfs-data/ -o name=mfan,secret=AQD600NibhPBJxAAzKeTOcQ17xaPhEdZ8npehg==
引數說明:
 -o:指定掛載引數
 name:認證使用者
 secret:使用者金鑰

# df -h | grep 'ceph-data'
10.153.204.13:6789:/                       760G     0  760G   0% /home/cephfs-data

我這裡只有一臺mon,如果多臺mon,可以並寫如:10.153.204.13:6789,10.153.204.14:6789,10.153.204.15:6789:/

第二種:

## 建立使用者secret檔案
# ceph auth get-key client.mfan > /etc/ceph/mvfan.secret

## 使用secret檔案掛載
# mount -t ceph 10.153.204.13:6789:/ /home/cephfs-data2/ -o name=mfan,secretfile=/etc/ceph/mvfan.secret

測試讀寫

## 測試寫
# dd if=/dev/zero of=/home/ceph-data/test.dbf bs=8k count=200000 conv=fdatasync
200000+0 records in
200000+0 records out
1638400000 bytes (1.6 GB) copied, 4.93594 s, 332 MB/s

## 測試讀
# dd if=/home/ceph-data/test.dbf of=/dev/null bs=4k count=100000000
400000+0 records in
400000+0 records out
1638400000 bytes (1.6 GB) copied, 1.18977 s, 1.4 GB/s

加入fstab中

echo "10.153.204.13:6789:/ /home/ceph-data ceph \
name=mfan,secret=AQD600NibhPBJxAAzKeTOcQ17xaPhEdZ8npehg==,_netdev,noatime 0 0" >> /etc/fstab

_netdev: 檔案系統居於需要網路連線的裝置上,系統聯網時才掛載

noatime: 不更新檔案系統的inode存取時間

再通過第二種方法:以fuse方式方式掛載

需要先安裝ceph-fuse包

yum install -y ceph-fuse

執行掛載

# ceph-fuse -m 10.153.204.13:6789 /home/cephfs-data
ceph-fuse[9511]: starting ceph client2022-03-30T17:25:00.938+0800 7fc7431f7f80 -1 init, newargv = 0x55d4924a7b60 newargc=9
ceph-fuse[9511]: starting fuse

# ps -ef | grep fuse
root       9511      1  0 17:25 pts/1    00:00:00 ceph-fuse -m 10.153.204.13:6789 /home/cephfs-data

# df -Th | grep cephfs-data
ceph-fuse                                 fuse.ceph-fuse  759G  2.2G  757G   1% /home/cephfs-data

解除安裝命令

fusermount -u /home/cephfs-data/

cephfs功能介紹就到此為止了,後續會繼續介紹ceph物件儲存的具體使用,及mds如何實現雙主雙備高可用。