GlusterFS的數據分布(DHT)和文件副本(AFR)機制
- 2019 年 11 月 10 日
- 筆記
GlusterFS簡介
GlusterFS是一種分散式文件系統,項目中使用它作為數據文件冷備存儲後台。GlusterFS的技術特點是採用無元數據中心的架構,採用Xlator以調用棧的形式組織各功能模組,Xlator之間通過RPC進行通訊,客戶端與服務端共用某些Xlator,下圖就是Gluster客戶端與服務端的Xlator棧示意圖。

GlusterFS的部署模式
Distributed Volume 分散式卷

無冗餘
Replicated Volume 副本卷

RAID-1
Striped Volume 條帶卷

RAID-0
Distributed Replicated Volume 分散式副本卷

Distributed Striped Volume 分散式條帶卷

由於GlusterFS採用了Xlator的架構,所以Distributed Replicated Volume在程式碼結構上是Distributed Xlator和Replicated Xlator的組合,Distributed Striped Volume類似。
GlusterFS的使用方式
- FUSE方式 (mount -t glusterfs)
- NFS方式 (mount -t nfs)
- libgfapi方式
下圖是FUSE模式下的GlusterFS I/O流

GlusterFS數據分布DHT
GlusterFS的分散式哈希表(Distributed Hash Tables DHT)機制是數據分布的核心,以目錄作為文件分布的基本單位。
- 當用戶在掛載點內創建目錄dir0,目錄會在所有brick生成
- GlusterFS將每個目錄的哈希地址空間規定為0x00000000~0xffffffff的32位整數區間,然後按每個brick分割成一組連續的地址空間,每個brick對應的地址區間 (Layout)保存在對應目錄的擴展文件屬性(xattr)中
- 擴展屬性是文件系統提供的一個功能,通過Key-Value的方式將一些元數據資訊同文件本體或目錄存儲在一起
- Glusterfs能夠通過brick的大小,對不同的brick分配不同大小的layout
- 當在dir0目錄下寫文件時,根據所在目錄GFID和文件名作為輸入參數,通過D-M演算法計算哈希值
- 通過文件的哈希值確定文件位於哪一個brick

- 如果創建其他目錄dirx,那麼會重新生成這個目錄在每個brick上的劃分區間,存儲在擴展屬性中(分布元數據保存在文件及目錄中,體現去中心化),如果在目錄dir0中再創建下級目錄dir0/sub-dir1,類似6,會生成自己的哈希分布空間
- Hash演算法有一定概率,極端情況下會出現brick之間分布不均的情況,此時GlusterFS採用鏈接解決這種問題,文件讀寫時,客戶端會先到源brick查找文件如果讀取到的文件是鏈接形式,則通過文件的擴展屬性定位到真實的brick,然後客戶端會直接在真實brick讀寫文件。

- 擴容,GlusterFS的擴容有兩個步驟
- 添加brick,現有的目錄分布不會擴展到新brick;舊文件不會遷移到新brick;在現有的目錄分布下創建新文件不會寫到新brick
- Reblance,修復現有的目錄hash分布(Fix-Layout)並擴展到新brick;部分文件開始遷移到新brick(Migrate-Data);新創建的文件按照新的哈希分布確定存儲位置。Gluster掛載目錄(root)開始,深度優先遍歷策略修復所有目錄。
- 縮容
- 重新計算縮容後的hash分布,將被縮容brick的數據遷走,將被縮容brick從卷中摘除

分散式副本卷的數據讀寫
- 寫:採用一個文件同時寫入多個副本的模式,當有一個副本成功寫入就返回成功
- 數據寫入過程中,可能會發生有副本寫入失敗的情況
- 更有甚者,各副本之間會發生腦裂(brain-split)

- 讀:從多個鏡像副本中選取一個狀態為正常的讀取
- 多個副本之中只要有一份是正常的,都可以正確讀取

操作示例
- 創建一個replicate為2,共有6個brick的distributed replicate卷,數據目錄分別為 /brick1~/brick6
- 掛載目標卷 /data/mount
- 創建目錄 /data/mount/test,此時分別會生成/brick1/test~/brick6/test的文件目錄,每個目錄的擴展屬性中記錄了本test目錄在本brick的hash分布區間
- 對於test目錄,6個brick會分成3組,每組兩個brick有著相同的分布區間,每組將存儲相同的文件互為備份。


GlusterFS自動文件副本(AFR)
- GlusterFS的自動文件副本(Automatic File Replication AFR)機制是實現Gluster故障恢復,自修復等高可用功能的基礎。
- GlusterFS利用文件/目錄的擴展屬性存儲元數據資訊(以trusted.afr開頭)
- 文件寫入流程(from GlusterFS v3.7)一個完整的AFR Transaction
- 下發Write操作
- 文件加鎖Lock
- Pre-op設置文件擴展屬性,changelog+1
- 文件寫入
- Post-op如果寫入成功,changelog-1, 如果失敗就保持此屬性
- 解鎖UnLock
擴展屬性是由一個24位的十六進位數字構成,被分為三個8位十六進位段
- 1-8位是數據內容(data)changelog
- 9-16位是元數據(metadata)changelog
- 17-24位是目錄項(entry)changelog

下面是兩副本文件寫入屬性變化示意圖:
- Pre-OP前
image.png - 數據寫入中
image.png - 寫入成功
image.png - 副本b寫入失敗
image.png - 數據寫入Transaction完成後根據擴展屬性changelog,文件存在以下幾種狀態:
- WISE – 自身changelog全零,其他副本changelog非零
- INNOCENT – 自身和其他changelog全為零
- FOOL – 自身changelog非零
- IGRANT – changelog丟失
- 副本都為WISE – 腦裂 典型場景:數據寫入時,brick-x服務宕機(進程停止、網路斷連、系統卡死…),一段時間之後又恢復
- Self-healing觸發條件
- Self-heal進程周期掃描 bricks/.glusterfs/indices/xattrop/目錄
- 目標文件訪問
- 通過命令 gluster volume heal <VOLNAME>
- 當出現單個副本WISE,一般將WISE副本作為修復源節點,覆蓋FOOL副本,並修改擴展屬性
GlusterFS腦裂
- 如果文件寫入後,不同副本changelog都保持WISE狀態(副本互相指責對方出現錯誤),這種情況即發生了腦裂(Brain Split)
- 腦裂可能出現的典型場景(replica 2為例)
- 文件X副本XA,XB分別位於svr1、svr2,分別由proc-a和proc-b進程管理,若客戶端對X的寫入過程中svr1,svr2間網路中斷,那麼proc-a和proc-b將分別負責各自副本的寫入但看到的對方都異常,當網路恢復即發生腦裂
- Svr1掉線,Svr2創建了一個文件,Svr2掉線,Svr1上線,Svr1創建了一個相同路徑和名字的文件
- 讀取腦裂的文件會出現 Input/Output Error
- 因為Changelog有三段,分別對應三種類型數據的狀態,所以腦裂也有三種類型
- Data腦裂 – 副本之間數據內容不一致
- Metadata腦裂 – 副本之間元數據(文件許可權,所屬組,文件類型等)不一致
- Entry/GFID腦裂 – 副本之間GFID不一致(無法使用命令行方法修復,需要手工介入)
- 腦裂如何修復(GlusterFS > 3.3)人工介入通過一定策略選擇正確的副本
- 在GlusterFs集群節點上,通過命令行方式修復
- 選擇文件比較大的文件為正確副本
- 選擇修改時間mtime靠後的作為正確副本
- 強制指定副本作為正確副本
- 在掛載點,通過命令修復
- 手工修復 https://docs.gluster.org/en/latest/Troubleshooting/resolving-splitbrain/
- 如何預防腦裂
- Client-Quorum機制,採用3個副本,3個副本寫成功2個才返回成功(存儲成本上升)
- Arbiter Volume,採用3個brick,其中有一個特殊的副本僅存儲元數據和目錄結構資訊
參考文獻
- https://docs.gluster.org/en/latest/Quick-Start-Guide/Architecture/
- https://blog.csdn.net/liuaigui/article/details/77776621
- http://www.taocloudx.com/index.php?a=shows&catid=4&id=66
- https://staged-gluster-docs.readthedocs.io/en/release3.7.0beta1/Features/dht/
- https://events.static.linuxfound.org/sites/events/files/slides/Vault%202016-%20GlusterFS_and_its_distribution_model.pdf
- http://blog.itpub.net/31547898/viewspace-2168800/ GlusterFS的數據均衡機制
- https://staged-gluster-docs.readthedocs.io/en/release3.7.0beta1/Features/afr-v1/
- https://blog.csdn.net/lblxyh/article/details/40894635
- https://docs.gluster.org/en/latest/Troubleshooting/resolving-splitbrain/ 腦裂修復步驟