GlusterFS分布式存儲數據的恢復機制(AFR)的說明


 

GlusterFSFS恢復數據都是基於副本卷來說的,GlusterFSFS復制卷是采用鏡像的方式做的,並且是同步事務性操作。簡單來說就是,某一個客戶要寫文件時,先把這個文件鎖住,然后同時寫兩個或多個副本,寫完后解鎖,這個操作才算結束。那么在寫某一個副本時發生故障沒有寫成功,或者運行過程中某一個節點斷電了,造成數據丟失了,等等,就能通過另一個副本來恢復。

現在這里說一個疑問:
就是GlusterFS寫副本時同步寫的,就是客戶端同時寫兩份數據,這樣就會產生兩倍的流量,測2副本的分布式復制卷性能時,能明確看到性能只有無副本的一半,或者只有讀的一半;另一個分布式文件系統ceph就不是這樣,是異步來寫副本的,就是寫到一個主OSD(ceph的存儲單元)就返回了,這個OSD再通過內部網絡異步寫到其他的OSD,這樣不是更快了。那么這兩種方法有什么優缺點呢,那種比較好,或者各自為什么采用這樣的方法?

說道恢復就有什么時候恢復,怎么恢復,憑什么說這個副本是好的,那個副本是壞的呢,這樣的問題,一個一個來說吧。
1)首先,什么時候恢復?有這樣三種場景會觸發恢復,宕機的節點恢復正常時;副本缺失的文件被讀寫到時,比如運行如下命令:

ls -l <file-path-on-gluster-mount>;      每十分鍾gluster會自行檢查;手動下命令觸發恢復,命令為gluster volume heal VOLNAME

2)怎么恢復?在這三種環境的任何一種下,gluster都會做檢查,看需不需要來個恢復,檢查什么呢,就是changelog,通過這個changelog來決定哪個副本壞了,要修復了。

3)憑什么說它壞了呢?剛才說了changelog會記錄的,記錄的什么呢,就是這個文件操作了什么,這個可以從文件的擴展屬性反正出來,每一個文件都有一個擴展屬性,主要記錄了這個文件操作了什么,以及所有其他的副本操作了什么,副本的擴展屬性如果不一樣,那么就是有問題,要恢復自己,還是憑自己去恢復其他副本,都看這個擴展屬性了,可以用命令getfattr -m . -d -e hex <FILENAME>,(和getfattr對應,有一個setfattr命令是可以設置這些屬性的,具體命令為setfattr -n trusted.glusterfs.volume-id -v 0x937d9caf46544ed0a2d22e25edb23a75 /brick2,)這樣設置了/brick2所在卷的id,查到擴展屬性的值就是如下圖所示的這樣的一個東西:

這張圖中值得注意的是,trusted.afr.repvol1-client-0,還有trusted.afr.repvol1-client-1,這兩條就是自己的和副本的擴展屬性了。先講名字,repvol1是卷名,client是固定的,0或1是subvolume-index,是brick的一個編號。后面的值看起來一大串,一共有24bit,分三部分,每部分4byte,如下圖所示:

 分別表示數據,元數據,和entry,數據就是文件內容啦,元數據就是屬性這些,entry我不知道翻譯成什么好,就是gfid,那么這三個東西每一個變化了在這個擴展屬性上都會做相應的變化,怎么變化呢,這三個部分分別是三個計數,操作文件之前要先寫計數,簡單來說可以理解為加一,操作完就減一,這樣最后還是保持0,就表示OK。擴展屬性被設置的文件和目錄會在/<BRICK>/.glusterfs/indices/xattrop目錄中有一個索引,具體如下所示,這個文件的內容好像是會定時清空的,啥時候清空呢?

每一個文件不僅記了自己的狀態,還記了所有副本的狀態,根據這些狀態的組合,有下面幾種情況:
IGNORANT:壓根沒有changelog,比如說這個文件副本已經丟失了,這樣的情況changelog也跟着丟失了
INNOCENT :表示自己和其他副本的計數值都是0,表示雙方都OK的
FOOL:表示自己的計數不為0,就是說加了沒有減,這之間操作出現問題了,而其他副本為0,就是自己有問題別人沒問題,讓別人來恢復我
WISE:相反,自己是0,別人不是0 ,自己沒問題別人有問題,自己來恢復別人。

涉及到數據恢復,有如下幾種場景:
1)所有文件都是IGNORANT,這是手動觸發了heal,也就是通過命令,這是怎么恢復呢,就找UID最小的文件作為源,去恢復大小為0的那些文件。
2)有一個節點為WISE,其他事FOOL,或其他非WISE的狀態,那么就以WISE去恢復其他節點。
3)好幾個都是WISE,就是好幾個副本都說自己正常,同時還說別人不正常,這就是腦裂現象,這樣就必須靠管理員手動找出腦裂的副本,自行判斷哪些是對的哪些不對,自行恢復了,通常的做法留下一個對的副本,其他都刪除,同樣還要刪除 /<BRICK>/.glusters這個目錄下對應的文件,這樣就只有一個WISE副本了,再出發heal,就以這個為源恢復所有副本了,觸發命令為 gluster volume heal <VOLMUENAME> full,這里的full是一種自愈方式,全部恢復文件,另一種自愈方式叫diff,是差異化恢復。

通常腦裂的文件時讀不出來的,讀寫它時會報Input/Output error,查看日志/var/log/glusterfs/glustershd.log你會有收獲:

要找到腦裂文件,還有一個命令可以用,gluster volume heal  <VOLMUENAME> info split-brain,它的輸出如下:

正常情況下,所有brick的entries都是0,這里同一個副本一個是1一個是0,就是不對勁了,通過此方法找到腦裂的文件,再按上面的方法刪除也可以。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM