GlusterFS之文件系統擴展屬性

擴展屬性是現代文件系統最不爲人知的屬性之一,可以採用一種完全的特性將擴展屬性添加到文件。其表現形式是key-value對,可以通過操作get/set擴展屬性。GlusterFS就大量使用了擴展屬性--xattrs,來完成集羣工作(複製、條帶、分佈式),所以說,擴展屬性對GlusterFS至關重要。

這裏有個關鍵,get/set擴展屬性會觸發與之關聯的所有服務器,這樣的話,就可以通過setxattr或者getxattr來向服務器傳遞信息。這種伎倆實際上就是一種RPC機制,在GlusterFS中被大量使用。例如,rebalance代碼會通過一個magic xattr觸發layout的重新計算,layout決定了文件被存儲到哪個服務器。Quick-read Translagtor使用一個magic xattr來模擬open/read/close序列,對小文件這將節省2/3的開銷。在GlusterFS中,還有很多這樣的xattr,接下來重點集中在兩個xattr:trusted.glusterfs.dht xattr(DHT Translator使用)和trusted.afr.* xattr(AFS Translator使用)

DHT

DHT,指分佈式集羣,採用一致性哈希。文件被哈希後獲取到一個哈希值,然後在一個哈希表中進行查找。哈希表描述了每個存儲節點(brick)分配到的hash range,hash range被唯一的分配給某個存儲節點。這種對應關係,或者說分配關係,是在每個目錄被創建時建立的。新創建的目錄會在當前集羣的所有可用存儲節點上被同時創建,也就是說,每個存儲節點上都會有新建目錄的一份拷貝。其中,每份拷貝有不同的擴展屬性:trusted.glusterfs.dht xattr,描述了當前拷貝負責的hash range. 當目錄被創建後,在此目錄下新建的文件和/或目錄,就會根據當前目錄的哈希表進行譁然分佈。

可以看出,這是目錄級別的哈希。

當目錄被查找時,要做的工作是:收集這些xattrs,並根據它們的hash range生成一張哈希表(描述存儲節點和其對應hash range的映射關係)。

而當存儲節點被添加或移除時,xattrs需要重新計算。這些都會影響到系統的擴展性,需要更好的解決。但在當前的系統中,這些機制暫時運行的很好。

 

AFR

也就是raid1,指複製集羣。AFR中xattr的使用,要比DHT中複雜的多。這裏主要是指trusted.aft.* xattrs, *是複製集羣中除了xattr所在的當前存儲節點之外的所有其它存儲節點,,也就是說,在一個replica組內,某存儲節點中當前目錄的擴展屬性,記錄了此複製組內其它存儲節點中相同目錄的操作信息,相互記錄。

這樣做的原因,是爲了錯誤恢復。因此,操作的狀態不能只記錄在一個地方,一次失敗可能會同時清除操作和狀態記錄。所以,可靠的方法是,操作在一個節點執行,同時將此操作記錄在多個節點。

Xattr記錄中的計數可以看作是等待中的操作的數目,是一個32位整數,記錄了3種操作類型:

1)數據操作。主要是寫,也包括截斷

2)元數據操作。像chmod/chown/chgrp,還有xattrs

3)名字空間操作。create/delete/rename

 

對文件系統修改時,首先更新所有節點中保存的對應目錄的擴展屬性中的計數器。事實上,爲了支持AFR,GlusterFS還額外定義了幾個xattr操作(像原子增加計數等)。只有當所有的計數器都被增加,實際操作都會發送到所有副本。當每個節點完成操作時,分佈到其它副本節點的對應於此操作的計數器會被遞減。最終,所有的計數器都會歸0. 如果節點X在操作中失效,或者沒有辦法開始,其它所有節點對應此操作的計數器就會保持非零。在下一次獲取此計數器時,通過比較,此非零狀態能容易地被檢測出來。根據所有計數器的關係,通常能指示哪個節點失效了,自我修復就能正確、及時的恢復集羣狀態。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章