1. 程式人生 > 其它 >6.Ceph 基礎篇 - CephFS 檔案系統

6.Ceph 基礎篇 - CephFS 檔案系統

文章轉載自:https://mp.weixin.qq.com/s?__biz=MzI1MDgwNzQ1MQ==&mid=2247485294&idx=1&sn=e9039504a93382a232b9274b49ccb538&chksm=e9fdd29ade8a5b8c4fb19f1c249ab40ac553dd9737c25ff874f43275a86751070069b7232cf5&scene=178&cur_album_id=1600845417376776197#rd

CephFS 檔案系統

官網地址:https://docs.ceph.com/en/latest/cephfs/

概念

The Ceph File System, or CephFS, is a POSIX-compliant file system built on top of Ceph’s distributed object store, RADOS. CephFS endeavors to provide a state-of-the-art, multi-use, highly available, and performant file store for a variety of applications, including traditional use-cases like shared home directories, HPC scratch space, and distributed workflow shared storage.

Ceph 檔案系統或 CephFS 是一個相容 POSIX 的檔案系統,它構建在 Ceph 的分散式物件儲存 RADOS 之上。CephFS 致力於為各種應用程式提供最新,多用途,高可用性和高效能的檔案儲存,包括傳統用例(如共享主目錄,HPC 暫存空間和分散式工作流共享儲存)。

CephFS achieves these goals through the use of some novel architectural choices. Notably, file metadata is stored in a separate RADOS pool from file data and served via a resizable cluster of Metadata Servers, or MDS, which may scale to support higher throughput metadata workloads. Clients of the file system have direct access to RADOS for reading and writing file data blocks. For this reason, workloads may linearly scale with the size of the underlying RADOS object store; that is, there is no gateway or broker mediating data I/O for clients.

CephFS 實現這些目標,它是通過使用一些新穎的架構選擇。 尤其是,檔案元資料與檔案資料儲存在單獨的 RADOS 池中(從資料中分離元資料),並通過可調整大小的元資料伺服器或 MDS 叢集提供服務,該叢集可擴充套件以支援更高吞吐量的元資料工作負載。檔案系統的客戶端可以直接訪問 RADOS 來讀寫檔案資料塊。因此,工作負載可能會隨著基礎 RADOS 物件儲存的大小線性擴充套件。也就是說,沒有閘道器或代理為客戶端中介資料I / O。

Access to data is coordinated through the cluster of MDS which serve as authorities for the state of the distributed metadata cache cooperatively maintained by clients and MDS. Mutations to metadata are aggregated by each MDS into a series of efficient writes to a journal on RADOS; no metadata state is stored locally by the MDS. This model allows for coherent and rapid collaboration between clients within the context of a POSIX file system.

通過叢集中 MDS 協調對資料的訪問,該叢集充當由客戶端和 MDS 協作維護的分散式元資料快取狀態的授權機構。每個 MDS 都會將對元資料的突變彙總為對 RADOS 上日記的一系列有效寫入。MDS 不會在本地儲存任何元資料狀態。此模型允許在 POSIX 檔案系統的上下文中客戶端之間進行連貫且快速的協作。

MDS:即 Metadata Servers,它主要儲存的是檔案的元資料資訊,為了高可靠,通常MDS會部署一個叢集,一個 Active,多個 Standby。它是如何保證高可靠性呢?它是把檔案的元資料資訊通過日誌的形式寫在 Metadata Pool 裡面去;MDS 之間會對元資料資訊進行交換,一個主的 Active MDS 宕機了,會有另外的 Standby MAD 來接管它,並且變為 Active MDS,因為資料都是寫到 Metadata Pool 裡面的,所以剛剛變化 Active MDS 擁有整個叢集的元資料資訊。

CephFS 客戶端是直接向 Data Pool 池裡面寫資料的,Data Pool 與 Metadata Pool 都是直接構建在 RADOS 上面。

CephFS is the subject of numerous academic papers for its novel designs and contributions to file system research. It is the oldest storage interface in Ceph and was once the primary use-case for RADOS. Now it is joined by two other storage interfaces to form a modern unified storage system: RBD (Ceph Block Devices) and RGW (Ceph Object Storage Gateway).

CephFS 成為很多學術論文的主題,因其新穎的設計和對檔案系統的研究貢獻,它是最老的儲存介面在Ceph叢集中,並且還是曾經 RADOS 的主要用例。 現在,它與另外兩個儲存介面結合在一起,形成了一個現代化的統一儲存系統:RBD(Ceph塊裝置)和RGW(Ceph物件儲存閘道器)。

功能

  • POSIX-compliant semantics 相容 POSIX 語法
  • Separates metadata from data 從資料中分離元資料
  • Dynamic rebalancing 動態再平衡
  • Subdirectory snapshots 子目錄快照
  • Configurable striping 可配置條帶化
  • Kernel driver support 核心驅動程式支援
  • FUSE support FUSE 支援
  • NFS/CIFS deployable 可部署NFS / CIFS
  • Use with Hadoop (replace HDFS) 與Hadoop一起使用(替換HDFS

CephFS工作模型

MDS是CephFS檔案系統的唯一入口,MDS程序掛掉後,CephFS無法使用,所以MDS需要做冗餘,所以我們部署多個MDS程序對元資料分割槽進行冗餘,這幾個MDS都是活躍的,所以叫做多主MDS冗餘,其中有一個負責根檔案系統的MDS,其它MDS只負責一個子樹的解析,一般熱點子樹就會動態分裂,動態子樹分割槽機制;這樣一個每一個活動MDS都有可能成為單點,所以我們需要為其提供冗餘或者公共冗餘都可以;

MDS 叢集建立

部署 mds

[root@ceph-node01 ceph-deploy]# ceph-deploy mds create ceph-node01 ceph-node02 ceph-node03

狀態檢視

[root@ceph-node01 ceph-deploy]# ceph -s
  cluster:
    id: cc10b0cb-476f-420c-b1d6-e48c1dc929af
    health: HEALTH_OK

  services:
    mon: 3 daemons, quorum ceph-node01,ceph-node02,ceph-node03 (age 24h)
    mgr: ceph-node01(active, since 11d), standbys: ceph-node03, ceph-node02
    mds: 3 up:standby
    osd: 7 osds: 7 up (since 24h), 7 in (since 5d)
    rgw: 2 daemons active (ceph-node01, ceph-node02)

  task status:

  data:
    pools: 7 pools, 224 pgs
    objects: 2.82k objects, 9.4 GiB
    usage: 35 GiB used, 765 GiB / 800 GiB avail
    pgs: 224 active+clean

[root@ceph-node01 ceph-deploy]#

mds: 3 up:standby ,三個 mds 都處於 standby 狀態,這是因為我們還沒有建立 mds 相關的檔案系統。

[root@ceph-node01 ceph-deploy]# ceph mds stat
 3 up:standby
[root@ceph-node01 ceph-deploy]# ceph fs ls
No filesystems enabled
[root@ceph-node01 ceph-deploy]#

建立檔案系統

在使用 CephFS 檔案系統中,metadata 是比較耗費資源的,它需要訪問資源的速度是非常快的,最好使用 SSD 的 OSD 進行 Pool 池進行構建。

# 1. 建立元資料使用的 pool 池
[root@ceph-node01 ceph-deploy]# ceph osd pool create cephfs_metadata 16 16
pool 'cephfs_metadata' created

# 2. 建立資料使用的 pool 池
[root@ceph-node01 ceph-deploy]# ceph osd pool create cephfs_data 16 16
pool 'cephfs_data' created

# 3. 建立檔案系統,關聯元資料與資料
[root@ceph-node01 ceph-deploy]# ceph fs new cephfs-demo cephfs_metadata cephfs_data
new fs with metadata pool 9 and data pool 10

# 4. 檢視fs檔案系統
[root@ceph-node01 ceph-deploy]# ceph fs ls
name: cephfs-demo, metadata pool: cephfs_metadata, data pools: [cephfs_data ]

# 5. 檢視mds 狀態
[root@ceph-node01 ceph-deploy]# ceph mds stat
cephfs-demo:1 {0=ceph-node01=up:active} 2 up:standby

# 6. 檢視剛才建立的pool池
[root@ceph-node01 ceph-deploy]# ceph osd lspools
。。。
9 cephfs_metadata
10 cephfs_data

# 7. 檢視叢集狀態
[root@ceph-node01 ceph-deploy]# ceph -s
  cluster:
    id: cc10b0cb-476f-420c-b1d6-e48c1dc929af
    health: HEALTH_OK

  services:
    mon: 3 daemons, quorum ceph-node01,ceph-node02,ceph-node03 (age 24h)
    mgr: ceph-node01(active, since 11d), standbys: ceph-node03, ceph-node02
    mds: cephfs-demo:1 {0=ceph-node01=up:active} 2 up:standby
    osd: 7 osds: 7 up (since 24h), 7 in (since 6d)
    rgw: 2 daemons active (ceph-node01, ceph-node02)

  task status:
    scrub status:
        mds.ceph-node01: idle

  data:
    pools: 9 pools, 256 pgs
    objects: 2.84k objects, 9.4 GiB
    usage: 35 GiB used, 765 GiB / 800 GiB avail
    pgs: 256 active+clean

[root@ceph-node01 ceph-deploy]#

mds: cephfs-demo:1 {0=ceph-node01=up:active} 2 up:standby 目前ceph-node01是 active,其它的兩個是 standby。

[root@ceph-node01 ~]# ceph fs status cephfs-demo
cephfs-demo - 2 clients
===========
+------+--------+-------------+---------------+-------+-------+
| Rank | State | MDS | Activity | dns | inos |
+------+--------+-------------+---------------+-------+-------+
| 0   | active | ceph-node02 | Reqs:    0 /s | 110  | 113  |
+------+--------+-------------+---------------+-------+-------+
+-----------------+----------+-------+-------+
| Pool | type   | used | avail |
+-----------------+----------+-------+-------+
| cephfs_metadata | metadata | 500k | 112G |
| cephfs_data | data | 9331  | 112G |
+-----------------+----------+-------+-------+
+-------------+
| Standby MDS |
+-------------+
| ceph-node03 |
| ceph-node01 |
+-------------+
MDS version: ceph version 14.2.11 (f7fdb2f52131f54b891a2ec99d8205561242cdaf) nautilus (stable)
[root@ceph-node01 ~]#

CephFS 檔案系統使用

核心級別的掛載使用

[root@ceph-node01 ~]# rpm -qf /usr/sbin/mount.ceph
ceph-common-14.2.11-0.el7.x86_64
[root@ceph-node01 ~]#

確認這個命令列工具已經安裝。通過下面的命令進行掛載,這樣即可掛載成功;

[root@ceph-node01 ~]# mount -t ceph 100.73.18.152:6789:/ /mnt/cephfs/ -o name=admin
[root@ceph-node01 ~]# df -h|grep mnt
/dev/rbd0 20G 1.1G 18G 6% /mnt/rbd-demo
100.73.18.152:6789:/ 800G 36G 765G 5% /mnt/cephfs
[root@ceph-node01 ~]#
[root@ceph-node01 cephfs]# echo `date` >>aa
[root@ceph-node01 cephfs]# cat aa
2020年 10月 21日 星期三 09:42:53 EDT
[root@ceph-node01 cephfs]# lsmod |grep ceph
ceph 335973 1
libceph 282661 2 rbd,ceph
dns_resolver 13140 1 libceph
libcrc32c 12644 4 xfs,ip_vs,libceph,nf_conntrack
[root@ceph-node01 cephfs]#

使用的話,和正常檔案系統是一樣使用即可,我們mount後,會自動載入核心模組,這樣效能很高,但有些情況下不支援核心空間掛載,需要在使用者空間中進行掛載,下面介紹這種情況 。

使用者空間掛載

[root@ceph-node01 ~]# yum -y install ceph-fuse

需要安裝ceph-fuse客戶端掛載工具;

[root@ceph-node01 ~]# ceph-fuse -n client.admin -m 100.73.18.153:6789,100.73.18.128:6789 /mnt/ceph-fuse/
ceph-fuse[403201]: starting ceph client2020-10-21 09:48:52.938 7fb92e4d4f80 -1 init, newargv = 0x561fdb9f8ec0 newargc=9

ceph-fuse[403201]: starting fuse
[root@ceph-node01 ~]# cd /mnt/ceph-fuse/
[root@ceph-node01 ceph-fuse]# ls
aa
[root@ceph-node01 ceph-fuse]# cat aa
2020年 10月 21日 星期三 09:42:53 EDT
[root@ceph-node01 ceph-fuse]# echo `date` >>bb
[root@ceph-node01 ceph-fuse]# cd ../cephfs/
[root@ceph-node01 cephfs]# ls
caa bb
[root@ceph-node01 cephfs]# cat bb
2020年 10月 21日 星期三 09:49:23 EDT
[root@ceph-node01 cephfs]#

總結

客戶端掛載CephFS有兩種形式,核心檔案系統:libcephfs,使用者空間檔案系統(FUSE):libcephfs,要想在RADOS Cluster使用CephFS 必須包括以下幾步:

1. 至少有一個節點執行ceph-mds 守護程序;
2. 分別建立元資料和資料儲存池;
3. 啟用CephFS 檔案系統,ceph fs new <name> metadata-pool-name data-pool-name;
4. 使用ceph fs status <name> 去檢視狀態資訊,也可以使用ceph mds stat 檢視mds狀態;

基於核心檔案系統掛載:(需要key檔案)

5. 通常需要使用指定的使用者訪問, 我們上面實驗中,都是使用的ceph.admin,這裡總結下,使用普通使用者的方式:ceph auth get-or-create client.fsclient mon 'allow r' mds 'allow rw' osd 'allow rwx pool=cephfs_data' -o ceph.client.fsclient.keyring
6. 生成普通使用者的key資訊,並copy到客戶端的/etc/ceph/目錄,注意客戶端需要安裝ceph-common命令,才可能掛載cephfs檔案系統。
ceph auth print-key client.fsclient >/etc/ceph/fsclient.key
7. 客戶端掛載  mount -t ceph ceph-node01:6789,ceph-node02:6789:/ /mnt/kube2/ -o name=fsclient,secretfile=/etc/ceph/fsclient.key,通過stat -f /mnt/kube2檢視掛載資訊;
8. 還可以把掛載資訊寫到/etc/fatab檔案中如下:
ceph-node01:6789,ceph-node02:6789:/ /mnt/kube2/ ceph    name=fsclient,secretfile=/etc/ceph/fsclient.key,_netdev,noatime 0 0
_netdev 告訴mount命令,掛載多久沒有掛載成功,自動跳過,不需要等待掛載成功才啟動,如果ceph叢集不線上的時候,不加此選項,作業系統啟動時就會卡住;
noatime:不實時更新時間戳選項;
此時使用mount -a 即可載入/etc/fatab檔案,自動掛載,使用mount命令檢視,使用umount 解除安裝.

基於使用者空間掛載:(需要用keyring檔案)

9. 客戶端需要安裝ceph-fuse,ceph-common命令;
10. 一樣需要提供認證賬號,同上;需要把keyring金鑰環檔案copy過去;
11.  ceph-fuse -n client.fsclient -m <IP地址>:6789 /mnt/kube2/  注意這裡我使用域名的形式報錯了,可以嘗試使用IP地址;
12. 也可以寫到/etc/fatab檔案中:none /mnt/kube2/  fuse.ceph  ceph.id=fsclient,ceph.conf=/etc/ceph/ceph.conf,_netdev,defaults 0 0
13. 使用mount -a 掛載,使用umount 解除安裝。