GlusterFSFS恢復數據都是基於副本捲來講的,GlusterFSFS複製卷是採用鏡像的方式作的,而且是同步事務性操做。簡單來講就是,某一個客戶要寫文件時,先把這個文件鎖住,而後同時寫兩個或多個副本,寫完後解鎖,這個操做纔算結束。那麼在寫某一個副本時發生故障沒有寫成功,或者運行過程當中某一個節點斷電了,形成數據丟失了,等等,就能經過另外一個副原本恢復。bash
如今這裏說一個疑問:
就是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,以下圖所示:spa
分別表示數據,元數據,和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,是差別化恢復。blog
一般腦裂的文件時讀不出來的,讀寫它時會報Input/Output error,查看日誌/var/log/glusterfs/glustershd.log你會有收穫:索引
要找到腦裂文件,還有一個命令能夠用,gluster volume heal <VOLMUENAME> info split-brain,它的輸出以下:
正常狀況下,全部brick的entries都是0,這裏同一個副本一個是1一個是0,就是不對勁了,經過此方法找到腦裂的文件,再按上面的方法刪除也能夠。