Ceph 分散式檔案系統

Ceph 是一個分散式網路檔案系統,旨在提供良好的效能、可靠性和可擴充套件性。

基本功能包括

  • POSIX 語義

  • 從 1 到數千個節點的無縫擴充套件

  • 高可用性和可靠性。沒有單點故障。

  • 跨儲存節點的資料 N 路複製

  • 從節點故障快速恢復

  • 在新增/刪除節點時自動重新平衡資料

  • 易於部署:大多數 FS 元件都是使用者空間守護程序

此外,

  • 靈活的快照(在任何目錄上)

  • 遞迴記帳(巢狀檔案、目錄、位元組)

與諸如 GFS、OCFS2 和 GPFS 等依賴於所有客戶端對共享塊裝置的對稱訪問的叢集檔案系統相比,Ceph 將資料和元資料管理分離到獨立的伺服器叢集中,類似於 Lustre。然而,與 Lustre 不同的是,元資料和儲存節點完全作為使用者空間守護程序執行。檔案資料以大塊形式分佈在儲存節點上,以分配工作負載並提高吞吐量。當儲存節點發生故障時,資料由儲存節點本身以分散式方式重新複製(在叢集監視器的少量協調下),從而使系統非常高效和可擴充套件。

元資料伺服器有效地形成了一個巨大的、一致的、分散式記憶體快取,位於檔案名稱空間之上,它具有極高的可擴充套件性,可以根據工作負載的變化動態地重新分配元資料,並且可以容忍任意(好吧,非拜占庭式的)節點故障。元資料伺服器採用了一種有些非常規的元資料儲存方法,以顯著提高常見工作負載的效能。特別是,只有單個連結的 inode 嵌入在目錄中,允許整個目錄的目錄項和 inode 透過單個 I/O 操作載入到其快取中。非常大的目錄的內容可以被碎片化並由獨立的元資料伺服器管理,從而允許可擴充套件的併發訪問。

該系統提供了自動資料重新平衡/遷移,可以在從小型的幾個節點的叢集擴充套件到數百個節點時進行,而無需管理員將資料集劃分為靜態卷或經過在伺服器之間遷移資料的繁瑣過程。當檔案系統接近滿容量時,可以輕鬆新增新節點,並且一切都將“正常工作”。

Ceph 包括靈活的快照機制,允許使用者在系統中的任何子目錄(及其巢狀內容)上建立快照。快照的建立和刪除就像 'mkdir .snap/foo' 和 'rmdir .snap/foo' 一樣簡單。

快照名稱有兩個限制

  • 它們不能以下劃線 ('_') 開頭,因為這些名稱保留供 MDS 內部使用。

  • 它們的大小不能超過 240 個字元。 這是因為 MDS 在內部使用長快照名稱,其格式如下:_<SNAPSHOT-NAME>_<INODE-NUMBER>。 由於檔名通常不能超過 255 個字元,並且 <node-id> 佔用 13 個字元,因此長快照名稱最多可佔用 255 - 1 - 1 - 13 = 240 個字元。

Ceph 還提供了目錄的遞迴記帳,用於巢狀檔案和位元組。 您可以執行以下命令

getfattr -n ceph.dir.rfiles /some/dir
getfattr -n ceph.dir.rbytes /some/dir

分別獲取巢狀檔案的總數及其總大小。 這使得可以相對快速地識別大型磁碟空間消耗者,因為不需要 'du' 或類似的遞迴掃描檔案系統。

最後,Ceph 還允許在系統中的任何目錄上設定配額。 該配額可以限制儲存在該目錄層次結構下方的位元組數或檔案數。 可以使用擴充套件屬性 'ceph.quota.max_files' 和 'ceph.quota.max_bytes' 設定配額,例如

setfattr -n ceph.quota.max_bytes -v 100000000 /some/dir
getfattr -n ceph.quota.max_bytes /some/dir

當前配額實現的一個限制是,它依賴於掛載檔案系統的客戶端的合作,以在達到限制時停止寫入器。 修改過的或對抗性的客戶端無法阻止其寫入所需的資料量。

掛載語法

基本掛載語法是

# mount -t ceph user@fsid.fs_name=/[subdir] mnt -o mon_addr=monip1[:port][/monip2[:port]]

您只需要指定一個監視器,因為客戶端在連線時將獲得完整列表。(但是,如果您指定的監視器恰好已關閉,則掛載將不會成功。)如果監視器使用預設埠,則可以省略埠。因此,如果監視器位於 1.2.3.4

# mount -t ceph cephuser@07fe3187-00d9-42a3-814b-72a4d5e7d5be.cephfs=/ /mnt/ceph -o mon_addr=1.2.3.4

就足夠了。 如果安裝了 /sbin/mount.ceph,則可以使用主機名而不是 IP 地址,並且可以省略叢集 FSID(因為掛載助手將透過讀取 ceph 配置檔案來填充它)

# mount -t ceph cephuser@cephfs=/ /mnt/ceph -o mon_addr=mon-addr

可以透過用斜槓 (/) 分隔每個地址來傳遞多個監視器地址

# mount -t ceph cephuser@cephfs=/ /mnt/ceph -o mon_addr=192.168.1.100/192.168.1.101

使用掛載助手時,如果可用,可以從 ceph 配置檔案讀取監視器地址。 請注意,叢集 FSID(作為裝置字串的一部分傳遞)透過將其與監視器報告的 FSID 進行檢查來驗證。

掛載選項

mon_addr=ip_address[:port][/ip_address[:port]]

叢集的監視器地址。 這用於引導到叢集的連線。 建立連線後,將遵循監視器對映中的監視器地址。

fsid=cluster-id

叢集的 FSID(來自 ceph fsid 命令)。

ip=A.B.C.D[:N]

指定客戶端應在本地繫結到的 IP 和/或埠。 通常沒有太多理由這樣做。 如果未指定 IP,則客戶端的 IP 地址透過檢視其到監視器的連線來源的地址來確定。

wsize=X

指定最大寫入大小(以位元組為單位)。 預設值:64 MB。

rsize=X

指定最大讀取大小(以位元組為單位)。 預設值:64 MB。

rasize=X

指定最大預讀大小(以位元組為單位)。 預設值:8 MB。

mount_timeout=X

指定掛載的超時值(以秒為單位),以防 Ceph 檔案系統無響應。 預設值為 60 秒。

caps_max=X

指定要保留的最大容量數。 當容量數超過限制時,將釋放未使用的容量。 預設值為 0(無限制)

rbytes

當在目錄上呼叫 stat() 時,將 st_size 設定為 'rbytes',即該目錄下方所有巢狀檔案的檔案大小之和。 這是預設設定。

norbytes

當在目錄上呼叫 stat() 時,將 st_size 設定為該目錄中的條目數。

nocrc

停用資料寫入的 CRC32C 計算。 如果設定,則儲存節點必須依賴 TCP 的錯誤糾正來檢測資料有效負載中的資料損壞。

dcache

當客戶端的快取中包含整個目錄內容時,使用 dcache 內容執行否定查詢和 readdir。(這不會改變正確性;客戶端僅在租約或能力確保其有效時才使用快取的元資料。)

nodcache

不要像上面那樣使用 dcache。 這避免了大量的複雜程式碼,犧牲了效能而不影響正確性,並且對於跟蹤錯誤很有用。

noasyncreaddir

不要像上面那樣將 dcache 用於 readdir。

noquotadf

在 statfs 中報告整體檔案系統使用情況,而不是使用根目錄配額。

nocopyfrom

不要使用 RADOS “copy-from” 操作來執行遠端物件複製。 目前,它僅在 copy_file_range 中使用,如果使用此選項,它將恢復為預設的 VFS 實現。

recover_session=<no|clean>

在客戶端被列入黑名單的情況下,設定自動重新連線模式。 可用模式為“no”和“clean”。 預設值為“no”。

  • no:當客戶端檢測到它已被列入黑名單時,永遠不要嘗試重新連線。 在被列入黑名單後,操作通常會失敗。

  • clean:客戶端在檢測到它已被列入黑名單時會自動重新連線到 ceph 叢集。 在重新連線期間,客戶端會丟棄髒資料/元資料,使頁面快取和可寫檔案控制代碼無效。 重新連線後,檔案鎖變為陳舊,因為 MDS 失去了對它們的跟蹤。 如果 inode 包含任何陳舊的檔案鎖,則不允許對 inode 進行讀/寫,直到應用程式釋放所有陳舊的檔案鎖。

更多資訊

有關 Ceph 的更多資訊,請參閱主頁:

https://ceph.com/

Linux 核心客戶端原始碼樹位於
完整的系統原始碼位於

https://github.com/ceph/ceph.git