Ceph BlueFS
一、概述
BlueFS是個小型文件系統(tǒng),小體現(xiàn)在功能簡單,沒有實(shí)現(xiàn)Posix接口,不支持對文件的覆蓋寫操作只支持追加寫,沒有本地文件系統(tǒng)的樹形層次結(jié)構(gòu),只有扁平的目錄到文件的映射關(guān)系。和BlueStore一樣,BlueFS也依賴底層BlockDevice模塊,使用它來管理磁盤空間的分配釋放,將IO通過Libaio寫到裸盤。和BlueStore不一樣的是元數(shù)據(jù)的管理,BlueStore將元數(shù)據(jù)全權(quán)交給RocksDB,BlueFS存在的目的就是為了支持RocksDB,因此不能反過來依賴RocksDB,只能靠自己來解決元數(shù)據(jù)管理問題。
元數(shù)據(jù)主要包括3類,第一類是文件系統(tǒng)自身的元數(shù)據(jù),例如Block大小、UUID、OSDUUID、版本號等,這部分?jǐn)?shù)據(jù)通常保存在超級塊(Superblock)中,BlueFS也是這么做的。第二類是目錄文件的inode數(shù)據(jù)以及文件目錄間的層次關(guān)系,這部分內(nèi)容通常以一定的結(jié)構(gòu)持久化在磁盤,讀取文件時根據(jù)路徑(例如,/etc/ceph/ceph.conf)從根目錄開始一層一層查找到目標(biāo)文件的inode數(shù)據(jù)在磁盤中的位置。BlueFS并沒有這么做,而是將對文件的所有操作都記錄到日志文件,掛載文件系統(tǒng)時Replay日志,以此來得到這部分元數(shù)據(jù)。也就是說,所有的元數(shù)據(jù)都會加載到內(nèi)存。第三類是用于描述磁盤哪些地方空閑哪些地方被占用的磁盤元數(shù)據(jù)。BlueFS的文件元數(shù)據(jù)包含該文件對應(yīng)的磁盤空間,通過Replay日志獲得所有文件的元數(shù)據(jù)后,就獲得了整塊磁盤的使用情況。
日志文件
BlueFS的一個重要概念是日志文件,所有操作都記錄到日志文件,掛載文件系統(tǒng)時先Replay日志,日志文件有兩個作用:首先,保證數(shù)據(jù)和元數(shù)據(jù)的一致性。普通文件的元數(shù)據(jù)保存在日志文件,通過Replay日志獲取普通文件的元數(shù)據(jù)。BlueFS只支持對文件的追加操作,不支持覆蓋寫操作,從而就沒有WAL操作的必要了。追加操作先將數(shù)據(jù)寫到磁盤,然后再更新元數(shù)據(jù),即將日志文件落盤。如果在追加數(shù)據(jù)時掉電,元數(shù)據(jù)沒有更新,那么舊的元數(shù)據(jù)所描述的數(shù)據(jù)仍舊是正確的,不會出現(xiàn)數(shù)據(jù)和元數(shù)據(jù)不一致的問題。其次,通過Replay所有日志來獲取文件目錄的層級結(jié)構(gòu)。BlueFS沒有像Ext2文件系統(tǒng)那樣在磁盤中持久化inode數(shù)據(jù)結(jié)構(gòu),只是在普通文件被修改時將對應(yīng)的元數(shù)據(jù)作為日志項(xiàng)記錄到日志文件。另外,文件的元數(shù)據(jù)保存了,為文件分配的磁盤空間的信息。Allocator根據(jù)這部分信息來確定磁盤中哪些空間已分配哪些空間空閑,從而構(gòu)建一文提到的樹形結(jié)構(gòu)。因此,如果追加數(shù)據(jù)過程中主機(jī)掉電,來不及更新元數(shù)據(jù),那么新分配的磁盤空間將被自動回收。
如何加載日志文件?
要加載日志文件,要先知道日志文件對應(yīng)的磁盤空間,這部分信息記錄在日志文件的元數(shù)據(jù),而日志文件的元數(shù)據(jù)存儲在Superblock超級塊。Superblock是一個地址被硬編碼的磁盤空間,起始位置為4K,長度為4k,掛載文件系統(tǒng)時首先加載這塊固定區(qū)域的內(nèi)容。從這塊區(qū)域中讀取磁盤Block大小、版本號、UUID、OSDUUID以及日志文件的元數(shù)據(jù)。日志文件的元數(shù)據(jù)內(nèi)部包括:
- 存儲日志文件內(nèi)容的磁盤,BlueFS同時支持3塊不同的磁盤
- 日志文件內(nèi)容所在磁盤空間的位置信息
- 文件修改時間、大小以及inode索引號,每個文件的索引號是唯一的,便于在內(nèi)存中管理文件結(jié)構(gòu)
根據(jù)日志元數(shù)據(jù)的前兩項(xiàng)內(nèi)容,就能夠知道從哪塊磁盤的什么位置讀取日志文件了,然后調(diào)用Libaio接口去讀取文件即可。
Compact日志。
Inode索引號0和1,由BlueFS內(nèi)部使用,并且都用于日志文件。正常情況下,日志文件只使用索引號1,只有在Compact日志時才使用臨時的索引號0。日志文件只支持Append操作,時間長了,日志文件會占用較大的磁盤空間,并且Replay日志時間也會變久。實(shí)際上,日志文件中有用的數(shù)據(jù)只有,目錄文件的元數(shù)據(jù)以及目錄和文件的對應(yīng)關(guān)系。Compact日志的目是,提取這部分有用數(shù)據(jù)寫入到新磁盤空間,并丟掉原來的日志數(shù)據(jù),減少日志文件大小,釋放磁盤空間。
Compact日志時先使用索引號0的新日志文件將有用數(shù)據(jù)寫入到磁盤的新位置,然后用新日志文件的元數(shù)據(jù)更新超級塊(除索引號外),將超級塊Flush到磁盤。從目前實(shí)現(xiàn)來看,修改超級塊是個危險系數(shù)很高的操作,一方面是因?yàn)槌墘K的重要程度,如果超級塊數(shù)據(jù)出錯所有文件將都無法使用,另一方面似乎沒有對超級塊做數(shù)據(jù)保護(hù),只提供CRC檢驗(yàn)。不過,正常情況下極少修改超級塊的數(shù)據(jù),寫磁盤時也會繞過本地緩存。
轉(zhuǎn)載于:https://www.cnblogs.com/chris-cp/p/8067439.html
總結(jié)
以上是生活随笔為你收集整理的Ceph BlueFS的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux的nvme驱动需要关心的统计项
- 下一篇: ios 带scrollView的控制器