GlusterFS分散式儲存資料的恢復機制(AFR)的說明

散盡浮華發表於2018-04-09

 

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,就是不對勁了,通過此方法找到腦裂的檔案,再按上面的方法刪除也可以。

相關文章