.glusterfs 目錄說明
- 2020 年 2 月 1 日
- 筆記
.glusterfs目錄大小基本是等於當前brick中的所有文件大小,原因是裡面主要存放的是brick中文件的硬鏈接。
.glusterfs目錄是3.3版本引入的一個新結構,它是用來做什麼的呢?
什麼是GFID?
你可能知道,glusterfs將元數據資訊存儲在文件的擴展屬性中。其中一個元數據就是trusted.gfid,這個就是inode號,在集群中,每個文件都有一個唯一的uuid號,這個在gluster 3.1和3.2版本工作的都很好,但是在文件自動修復(AFR)過程中經常會有一些誤判。
這個GFID用於建立.glusterfs這個目錄結構,每個文件都對應一個硬鏈接放在.glusterfs目錄中,存放規則是,前兩個數字創建一個目錄,接著兩個數字創建一個目錄,然後目錄中存放是一個完整的uuid硬鏈接。
例如:
# getfattr -m . -d -e hex /data/glusterfs/d_home/stat.c getfattr: Removing leading '/' from absolute path names # file: data/glusterfs/d_home/stat.c trusted.afr.home-client-10=0x000000000000000000000000 trusted.afr.home-client-11=0x000000000000000000000000 trusted.afr.home-client-9=0x000000000000000000000000 trusted.gfid=0xc62757554baf4a33bc7690c56dac23e0
會創建一個硬鏈接到:
/data/glusterfs/d_home/.glusterfs/c6/27/c6275755-4baf-4a33-bc76-90c56dac23e0
為什麼要這樣做?
之前執行刪除、重命名、建硬鏈接的幾種方法是有缺陷的。如果一個連接到複製卷並執行了重命名操作的連接丟失,自動修復進程不知道是純粹的刪除或者是重命名等操作,這樣會出現問題,可能產生重複的文件導致混亂。
現在一個文件被刪除,.glusterfs目錄中對應的文件也會被刪除,自動修復守護進程會在好的伺服器上遍歷,查看到文件是否被存在,由於對應的gfid文件被刪除了,所以認為是真正被刪除了,如果文件丟失,但對應的gfid文件存在,說明被重命名了,過期的伺服器會刪除文件名,但不會刪除對應的gfid文件,一旦自動修復守護進程遍歷到新的文件名,會直接創建到gfid文件的硬鏈接,因為數據仍然在伺服器上,所以這樣修復一個重命名文件就避免了數據傳輸。
如果gfid文件是普通文件而不是硬鏈接,那基本上就完蛋了。最終會發生鏈接分離,原因是一個文件會過期,客戶端沒有辦法知道一個文件和另一個具有相同的gfid,所以會重新創建一個,這樣操作會創建大量不必要的重複文件,而使用硬鏈接後,每個gfid文件會對應一個文件,就不會出現空間浪費。
NFSv4支援
很快,glusterfs會支援NFS v4,會使用匿名文件描述符。gfid文件允許在目錄中創建gfid文件,但不在目錄中創建對應的條目。
這對管理員來說有什麼新要求嗎?
作為管理員,了解gfid機制對文件修復和裂腦修復是很用幫助,建議詳細了解。
首先,每個brick的根目錄對應的gfid是00000000-0000-0000-0000-000000000001,這個文件放在 .glusterfs/00/00目錄中,實際上是一個符號鏈接,連接到「../../..」,其他目錄也會鏈接到這個目錄下面。
如果刪除一個文件不刪除對應的gfid文件,修復進程會修復該文件,如果gfid文件損壞,對應的文件也會損壞。
參考:
https://joejulian.name/blog/what-is-this-new-glusterfs-directory-in-33/
https://www.gluster.org/pipermail/gluster-users/2014-January/015494.html