Raft、AUFS與GlusterFS

作家:DrinkCoffee2012 / 公眾號:liuxil_AI 發布時間:2019-06-15

概述
操作系統實習課程的第五次作業,最后的目標是結束一個網絡操作系統,用通俗的話來說,是為了能夠對數據中心或云上的機器資源進行有效地調度與管理;用標準的術語描述是:實現一種云化的個人工作區解決方案,使集團可以輕松地虛擬化其數據中心,為用戶創建個人的虛擬集群, 進而為用戶提供一個在云端的可定制工作區(Workspace)。 用戶只需要一個瀏覽器,即可隨時隨地訪問集團內部自己的工作區, 在線進行代碼編寫、調試運行、數據管理、數據分析、結果可視化等工作。
為了結束這一目標,需要對資源進行隔離(cgroup與namespace),在多個節點之間提供強一致性的服務(etcd與Raft算法),對容器鏡像有效管理(aufs或overlayfs),為不同節點提供分布式存儲系統(glusterfs)。
軟件所已經對該網絡系統有了實現,為docklet,可以參考以下鏈接:https://github.com/unias/docklet與https://iwork.pku.edu.cn/
Raft算法
Raft算法是解決分布式一致性問題的算法之一,另一種算法Paxos是Lamport提出的,難以弄懂,并且難以實現。Raft 從一開始就被設計成一個易于理解和實現的共鳴算法,它在容錯和性能上與 Paxos 協議比較類似,區別在于它將分布式一致性的問題分解成了幾個子問題,然后一一進行解決。
每一個 Raft 集群中都包含多個服務器,在任意時刻,每一臺服務器只可能處于 Leader、Follower 以及 Candidate 三種狀態;在處于正常的狀態時,集群中只會存在一個 Leader,其余的服務器都是 Follower。
一切的 Follower 節點都是被動的,它們不會主動發出任何的請求,只會響應 Leader 和 Candidate 發出的請求,對于每一個用戶的可變操作,都會被路由給 Leader 節點進行處理,除了 Leader 和 Follower 節點除外,Candidate 節點其實只是集群運行過程中的一個臨時狀態。
Raft 集群中的時間也被切分成了不同的幾個任期(Term),每一個任期都會由 Leader 的選舉開始,選舉結束后就會進入正常操作的階段,直到 Leader 節點出現問題才會開始新一輪的選擇。
每一個服務器都會存儲當前集群的最新任期,它就像是一個單調遞增的邏輯時鐘,能夠同步各個節點之間的狀態,當前節點持有的任期會隨著每一個請求被傳遞到其他的節點上。
Raft 協議在每一個任期的開始時都會從一個集群中選出一個節點作為集群的 Leader 節點,這個節點會負責集群中的日志的復制以及管理工作。
以上過程涵蓋了三個子問題:節點選舉、日志復制與安全性。比較好的一個demo是http://thesecretlivesofdata.com/raft/
參考了這一篇文章,里面有對etcd實現Raft具體代碼的講解:https://draveness.me/etcd-introduction 。AUFS
AUFS有一段歷史,使得它沒有被進入到Linux主干中。此處不再贅述。詳見https://coolshell.cn/articles/17061.html。工作原理
AUFS是一種聯合文件系統,它的主要的作用是將在不同物理位置的目錄合并mount到一個目錄中,其中一個最主要的應用是將只讀CD/DVD與一個U盤合并mount,那么就可以對CD/DVD實現修改,固然修改的實質是存在于該硬盤上。因此可以對CD/DVD上的實質進行隨意的更改,而不用擔心對上面的實質造成損失。
Docker將這個用處的想象力發揮到了容器的鏡像,通過這樣的方法,可以實現對底層的鏡像不更改,只更改上層的鏡像,從而實現了底層鏡像的重復利用,節約了資源。特點
將多個目錄,合并成同一個目錄,可以為每個需要合并的目錄指定相應的讀寫權限,實時的添加、刪除、修改已經被mount的目錄,同時還可以在多個可寫的dir間進行負載均衡。
相關權限如下:rw,ro,rr,ro與rr的區別是,rr是天生只讀的,因此AUFS可以利用這一點提高性能。ro通常與wh聯系在一起,當某個層被設置為ro時,它是只讀的,不可以做出修改的,但是union系統本身,又要保證它里面的文件是可以修改的,此時在設置wh后,會在上層的可寫文件中建立隱藏的whiteout文件,實現這一功能。
在aufs中有一個概念是branch,它指的就是各個要被union的目錄,根據union的順序形成一個stack,一般最上面的是可讀寫的,其他的是只讀的。使用方式
mount-t aufs-o dirs=./a=rw:./b=ro:./c=ro none./mnt
其中 -t指定文件系統為 aufs, -o的參數指定要合并的目錄, none后面說明合并的結果的目錄。
運行時可以從 sys/fs/aufs/si_[id]中看到aufs的mount的情況,而docker創建的鏡像可以通過 /var/lib/docker/aufs/diff/<id>查看,docker使用的文件存儲驅動不一定是 aufs,可以通過在 /etc/docker/daemon.json中指定:
{
"storage-driver": "aufs"
}
在實際使用的過程中,AUFS與Glusterfs之間存在兼容性問題,會提示create file too large,而將之替換為功能類似的overlayfs則沒有任何問題。現在docker使用的文件存儲驅動已經為overlayfs,aufs已被淘汰(?)GlusterFS工作原理
工作原理從以下幾個方面講述:外部架構
GlusterFS 主要由存儲服務器(BrickServer),客戶端以及NFS/Samba存儲網關組成。GlusterFS架構中沒有元數據服務器組件,有效地提升了整個系統的穩定性與可靠性。客戶端可以通過原生的GlusterFS協議、沒有運行GlusterFS客戶端的終端可以通過NFS/CIFS標準協議訪問位于存儲服務器上的數據。他們通過TCP/IP或InfinibandRDMA高速網絡互聯。內部架構
GlusterFS中,Translators是GlusterFS提供的一種強大文件系統功能擴展機制,這一設計思想借鑒于GNU/Hurd微內核操作系統。GlusterFS中一切的功能都通過Translator機制實現,運行時以動態庫方式進行加載,服務端和客戶端相互兼容。有以下幾類Translator:
Cluster、Debug、Encryption、Features、Mgmt、Nfs、Performance、Protocol、Storage等。其中Cluster Translators是實現GlusterFS集群存儲的核心,支持不同種類的邏輯卷類型,包括三種基本卷:distribute卷、stripe卷、replica卷以及他們的四種組合。
Distribute 卷
如下圖所示,使用Hash算法將文件分布到不同的brick server上,不具備容錯能力。
Stripe 卷
類似于RAID0,文件分成數據塊的方式以Round Robin的方式分布到brick server上。
Replica卷
如圖所示,文件同步復制到不同的brick server上,相當于RAID1,具備容錯能力。
數據訪問流程
數據訪問流程如下:首先在客戶端,用戶通過GlusterFS的掛載點訪問數據,用戶的這個操作被遞交給本地的linux系統VFS(虛擬文件系統)處理。VFS將操作數據交給FUSE內核文件系統(用戶空間文件系統,一類軟件接口,使得無特權的用戶無需修改內核代碼創建自己的文件系統),FUSE文件系統將它通過/dev/fuse設備文件遞交給GlusterFS客戶端。數據被fuse遞交給GlusterFS客戶端之后,GlusterFS客戶端會根據配置文件對數據進行一些指定的處理,再通過TCP或者RDMA的方式將數據寫入到服務器控制的存儲設備上。特點用戶空間實現
與傳統的文件系統不同,GlusterFS 借助FUSE,在用戶空間實現,使得安裝與升級特別簡便,降低了普通用戶基于源碼修改GlusterFS的門檻。缺點是用戶空間效率低,數據需要多次與內核空間交換,存儲端無元數據
沒有單點故障和性能瓶頸問題,可提高系統擴展性、性能、可靠性和穩定性。缺點是數據一致性變得復雜,文件目錄遍歷效率低下,缺乏全局管控監控的能力。使用方式添加/移除服務器節點
gluster peer probe/detach<SERVER>查看一切節點的狀態
gluster peer status創建/啟動/停止/刪除卷
gluster volume create<NEW-VOLUME-NAME>[stripe<COUNT>|replica<COUNT>][transport[tcp|rdma|tcp,rdma]]<NEW-BRICK>
gluster volume start/stop/delete<VOLNUME-NAME>客戶端以GlusterFS方式掛載
mount-t glusterfs<SERVER>:/<VOLNUME-NAME><MOUNTDIR>查看卷的信息
gluster volume list/info配置卷
gluster volumeset<VOLNUME-NAME><OPTION><PARAMETER>擴展卷
gluster volume add-brick<VOLNUME-NAME><NEW-BRICK>系統擴展維護
gluster volume quota<VOLNUME-NAME>enable|disable
.......
參考了這一篇文章:https://blog.51cto.com/dangzhiqiang/1907174 。

關注DrinkCoffee2012微信公眾號,獲取更多圖文精彩實質


其他欄目