在企業中,一些重要的數據通常都會存儲在硬盤中,雖然硬盤自己的性能也在不斷提升,可是不管硬盤的存取速度有多快,企業所追尋的首先是可靠性,而後纔是效率。若是數據面臨丟失的風險,再好的硬件也沒法玩會企業的損失,加之近幾年雲計算的出現,對存儲提出了更高的要求。而分佈式存儲逐漸被人們所接受,它具備更好的性能、高擴展以及可靠性。大部分分佈式解決方案都是經過元服務器存放目錄結構等元數據,元數據服務器提供了整個分佈式存儲的索引工做。可是一旦元數據服務器損壞,整個分佈式存儲都將沒法進行工做。下面咱們將介紹一種無元服務器的分佈式存儲解決方案——GlusterFS。算法
GlusterFS是一個開源的分佈式文件系統,同時也是Scale-Out存儲解決方案GlusterFS的核心。在存儲數據方面具備很強大的擴展能力,經過擴展不一樣的節點能夠支持PB級別的存儲容量。GlusterFS藉助TCP/IP或InfiniBand RDMA網絡將分散的存儲資源匯聚在一塊兒,同一提供存儲服務,並使用單一全局命令空間來管理數據。GlusterFS基於可堆疊的用戶空間以及無元的設計,可爲各類不一樣的數據負載提供優異的性能。bash
GlusterFS主要由存儲服務器、客戶端及NFS/Samba存儲網關(可選,根據須要選擇使用)組成。如圖:服務器
GlusterFS架構中最大的設計特色就是沒有元數據服務器組件,這有助於提高整個系統的性能、可靠性和穩定性。傳統的分佈式文件系統大多經過元服務器來存儲元數據,元數據包含存儲節點上的目錄信息、目錄結構等,這樣的設計在瀏覽目錄時效率很是高,可是也存在一些缺陷,如單點故障,一旦元數據服務器出現故障,即便節點具有再高的冗餘性,整個存儲系統也將崩潰,而GlusterFS分佈式文件系統是基於無元服務器的設計,數據橫向擴展能力強,具有較高的可靠性及存儲效率。 GlusterFS支持TCP/IP和InfiniBand RDMA高速網絡互聯,客戶端可經過原聲GlusterFS協議訪問數據,其餘沒有運行GlusterFS客戶端的終端可經過NFS/CIFS標準協議經過存儲網關訪問數據。網絡
- 擴展性和高性能。GlusterFS利用雙重特性來提供高容量存儲解決方案。
(1)Scale-Out架構經過增長存儲節點的方式來提升存儲容量和性能(磁盤、計算機和I/O資源均可以獨立增長),支持10GBE和InfiniBand等高速網絡互聯;
(2)Gluster彈性哈希解決了GlusterFS對元數據服務器的依賴,GlusterFS採用彈性算法在存儲池中定位數據,放棄了傳統的經過元數據服務器定位數據,GlusterFS中能夠智能的定位任意數據分片(將數據分片存儲在不一樣節點上),不須要查看索引或者想元數據服務器查詢。這種設計機制實現了存儲的橫向擴展,改善了單點故障及性能瓶頸,真正實現了並行化數據訪問。- 高可用性。GlusterFS經過配置某些類型的存儲卷,能夠對文件進行自動複製(相似於RAID1),即便某個節點出現故障,也不影響數據的訪問。當數據出現不一致時,自動修復功能可以把數據恢復到正確的狀態,數據的修復是以增量的方式在後臺執行,不會佔用太多系統資源。GlusterFS能夠支持全部的存儲,之內它沒有設計本身的私有數據文件格式,而是採用操做系統中標準的磁盤文件系統(如EXT三、XFS等)來存儲文件,數據可使用傳統的訪問磁盤的方式被訪問;
- 全局統一命名空間。全局統一命名空間將全部的存儲資源彙集成一個單一的虛擬存儲池,對用戶和應用屏蔽了物理存儲信息。存儲資源(相似於LVM)能夠根據生產環境中的須要進行彈性擴展或收縮。在多節點場景中,全局統一命名空間還能夠基於不一樣節點作負載均衡,大大提升了存取效率;
- 彈性卷管理。GlusterFS經過將數據儲存在邏輯卷中,邏輯卷從邏輯存儲池進行獨立邏輯劃分。邏輯存儲池能夠在線進行增長和移除,不會致使業務中斷。邏輯卷能夠根據需求在線增加或增減,並能夠在多個節點中負載均衡。文件系統配置更改也能夠實時在線進行並應用,從而能夠適應工做負載條件變化或在線性能調優;
- 基於標準協議。Gluster存儲服務支持NFS、CIFS、HTTP、FTP、FTP、SMB及Gluster原生協議,徹底與POSIX標準兼容。現有應用程序不須要作任何修改就能夠對Gluster中的數據進行訪問,也可使用專用API進行訪問(效率更高),這在公有云環境中部署Gluster時很是有用,Gluster對雲服務提供商專用APl進行抽象,而後提供標準POSIX藉口;
- Brick(存儲塊):指可信主機池中由主機提供的用於物理存儲的專用分區,是GlusterFS中的基本存儲單元,同時也是可信存儲池中服務器上對外提供的存儲目錄,存儲目錄的格式由服務器和目錄的絕對路徑構成,表示方法爲SERVER:EXPORT ,好比:192.168.1.4/date/mydir/;
- Volume(邏輯卷):一個邏輯卷是一組Brick的集合。卷是數據存儲的邏輯設備,相似於LVM中的邏輯卷。大部分Gluster管理操做是在捲上進行的;
- FUSE:是一個內核模塊,容許用戶建立本身的文件系統,無須修改內核代碼;
- VFS:內核空間對用戶空間提供吧的訪問磁盤的接口;
- Glusterd(後臺管理進程):在存儲羣集中的每一個節點上都要運行;
如圖:
GlusterFS採用模塊化、堆棧式的結構,能夠根據需求配置定製化的應用環境,如大文件存儲、海量小文件存儲、雲存儲、多傳輸協議應用等。經過對模塊進行各類組合,接口實現複雜的功能。例如:Replicate模塊可實現RAID1,Stripe模塊可實現RAID0,經過二者的組合可實現RAID10和RAID01,同時得到更高的性能和可靠性。架構
GlusterFS是模塊化堆棧式的架構設計。模塊成爲Translator,是GlusterFS提供的一種強大的機制,藉助這種良好定義的接口能夠高效簡便地擴展文件系統的功能。
(1)服務器與客戶端的設計高度模塊化的同事模塊接口是兼容的,同一個transtator可同事在客戶端和服務器加載;
(2)GlusterFS中全部的功能都是經過transtator實現的,其中客戶端要比服務器更復雜。因此功能的重點主要集中在客戶端上;負載均衡
GlusterFS數據訪問流程如圖:tcp
圖中所示只是GlusterFS數據訪問的一個概要圖,大體過程:
(1)客戶端或應用程序經過GlusterFS的掛在點訪問數據;
(2)Linux系統內核經過VFS API收到請求並處理;
(3)VFS將數據遞交給FUSE內核文件系統,並向系統註冊了一個實際的文件系統FUSE,而FUSE文件系統則是將數據經過/dev/fuse設備文件遞交給GlusterFS client端。能夠將FUSE文件系統理解爲一個代理;
(4)GlusterFS client收到數據後。client根據配置文件對數據進行處理;
(5)通過GlusterFS client處理後,經過網絡將數據傳遞至遠端的GlusterFS Server,而且將數據寫入服務器存儲設備。分佈式
彈性HASH算法使用Davies-Meyer算法,經過HASH算法獲得一個32位的整數範圍,假設邏輯卷中有N個存儲單位Brick,則32位的整數範圍被劃分爲N個連續的子空間,每一個空間對應一個Brick。當用戶或應用程序訪問某一個命名空間時,經過對該命名空間計算HASH值,根據該HASH值對應的32位整數空間定位數據所在的Brick。ide
彈性HASH算法的優勢表現以下:模塊化
- 保證數據平均分佈在每一個Brick中;
- 解決了對元數據服務器的依賴,進而解決了單點故障及訪問瓶頸;
如今咱們假設建立一個包含四個Brick節點的GlusterFS卷,在服務端的Brick掛載目錄會給四個Brick平均分配2^32的區間的範圍空間。GlusterFS hash分佈區間是保存在目錄上而不是根據機器去分佈區間。如圖:
Brick*表示一個目錄,分佈區間保存在每一個Brick掛載點目錄的擴展屬性上。
在卷中建立四個文件。訪問文件時,經過快速Hash函數計算出對應的HASH值,而後根據計算出來的HASH值對應的子空間散列到服務器的Brick上,如圖:
GlusterFS支持七種卷,這七種卷能夠知足不一樣應用對高性能、高可用的需求。這七種卷分別是:
- (1)分佈式卷(Distribute volume):文件經過HASH算法分佈到全部Brick Server上,這種卷是Glusterf的基礎;以文件爲單位根據HASH算法散列到不一樣的Brick,其實只是擴大了磁盤空間,若是有一個磁盤損壞,數據也將丟失,屬於文件級的RAID0,不具有容錯能力;
- (2)條帶卷(Stripe volume):相似於RAID0,文件被分爲數據塊並以輪詢的方式分佈到多個Brick Server上,文件存儲以數據塊爲單位,支持大文件存儲,文件越大,讀取效率越高;
- (3)複製卷(Replica volume):將文件同步到多個Brick上,使其具有多個文件副本,屬於文件級RAID1,具備容錯能力。由於數據分散到多個Brick中,因此讀性能獲得了很大提高,但寫性能降低;
- (4)分佈式條帶卷(Distribute Stripe volume):Brick Server數量是條帶數(數據塊分佈的Brick數量)的倍數,兼備分佈式卷和條帶卷的特色;
- (5)分佈式複製卷(Distribute Replica volume):Brick Server數量是鏡像數(數據副本數量)的倍數,具備分佈式卷和複製卷的特色;
- (6)條帶複製卷(Stripe Replica volume):相似於RAID10,同時具備條帶卷和複製卷的特色;
- (7)分佈式條帶複製卷(Distribute Stripe Replica volume):三種基本卷的複合卷,一般用於類Map Reduce應用;
下面詳細介紹幾種重要的卷類型:
分佈式卷是GlusterFS的默認卷,在建立卷時,默認選項就是建立分佈式卷。在該模式下,並無對文件進行分塊處理,文件直接存儲在某個Server節點上,直接使用本地文件系統進行文件存儲,大部分Linux命令和工具能夠繼續正常使用。須要經過擴展文件屬性保存HASH值,目前支持的底層文件系統有ext三、ext四、ZFS、XFS等。
因爲使用本地文件系統,因此存取效率並無提升,反而會由於網絡通訊的緣由而有所下降;另外支持超大型文件也會有必定的難度,由於分佈式卷不會對文件進行分塊處理。雖然ext4已經能夠支持最大16TB的單個文件,可是本地存儲設備的容量實在有限。
如圖:
如圖所示:File1和File2存放在Server1,而File3存放在Server2,文件都是隨機存儲,一個文件要麼在Server1上,要麼在Server2上,不能分塊同時存放在Server1和Server2上。
分佈式卷具備以下特色:
- 文件分佈在不一樣的服務器,佈局別冗餘性;
- 更容易廉價地擴展卷的大小;
- 單點故障會形成數據丟失;
- 依賴於底層的數據保護;
建立分佈式卷的命令:
[root@localhost ~]# gluster volume create dis-volume server1:/dir1 server2:/dir2 //建立一個名爲dis-volume的分佈卷,文件將根據HASH分佈在server1:/dir一、server2:/dir2中 Creation of dis-volume has been successful Please start the volume to access data
Stripe模式至關於RAID0,在該模式下,根據偏移量將文件分紅N塊(N個條帶節點),輪詢地存儲在每一個Brick Server節點。節點把每一個數據塊都做爲普通文件存入本地文件系統中,經過擴展屬性記錄總塊數和每塊的序號。在配置時指定的條帶數必須等於卷中Brick所包含的存儲服務器數,在存儲大文件時,性能尤其突出,可是不具有冗餘性。
如圖:
File被分割爲6段,一、三、5放在Server1, 二、四、6放在Server2中!
條帶卷具備以下特色:
- 數據被分割成更小塊分佈到塊服務器羣中的不一樣條帶區;
- 分佈減小了負載且更小的文件加速了存取的速度;
- 沒有數據冗餘;
建立條帶卷的命令:
[root@localhost ~]# gluster volume create rep-volume replica 2 transport tcp server1:/dir1 server2:/dir2 //建立一個名爲Stripe-volume的條帶卷,文件將分塊輪詢地存儲在server1:/dir1 、server2:/dir2兩個Brick中 Creation of rep-volume has been successful Please start the volume to access data
複製模式,也稱爲AFR,至關於RAID1。即同一文件保存一份或多份副本,每一個節點保存相同的內容和目錄結構。複製模式由於要保存副本,因此磁盤利用率較低。若是多個節點上的存儲空間不一致,那麼將按照木桶效應取最低節點的容量做爲該卷的總容量。在配置複製卷時,複製數必須等於卷中Brick所包含的存儲服務器數,複製卷具有冗餘性,即便一個節點損壞,也不影響數據的正常使用。
如圖:
File1和File2同時存放在Server1和Server2上,至關於Server2中的文件是Server1中文件的副本!
複製卷具備如下特色:
- 卷中全部的服務器均保存一個完整的副本;
- 卷的副本數量可由客戶建立的時候決定;
- 至少有兩個塊服務器或者更多的服務器;
- 具備冗餘性;
建立複製卷的命令:
[root@localhost ~]# gluster volume create rep-volume replica 2 transport tcp server1:/dir1 server2:/dir2 //建立名爲rep-volume的複製卷,文件將同時存儲兩個副本,分別在Server1:/dir1和Server2:/dir2兩個Brick中 Creation of rep-volume has been successful Please start the volume to access data
分佈式條帶卷兼顧分佈式和條帶卷的功能,主要用於大文件訪問處理,建立一個分佈式條帶卷最少須要4臺服務器。
如圖:
如圖所示:File1和File2經過分佈式卷的功能分別定位到Server1和Server2。在Server1中,File1被分割成4段,其中一、3在Server1中exp1目錄中;二、4在Server1中的exp2目錄中。在Server2中,File2也被分割成4段,與File1同樣!
建立分佈式條帶卷的命令:
[root@localhost ~]# gluster volume create dis-stripe stripe 2 transport tcp server1:/dir1 server2:/dir2 server3:/dir3 server4:/dir4 //建立了一個名爲dis-stripe的分佈式條帶卷,配置分佈式的條帶卷時,卷中Brick所包含的存儲服務器數必須是條帶數的倍數(>=2倍) Creation of rep-volume has been successful Please start the volume to access data
注意:建立卷時,存儲服務器的數量若是等於條帶或複製數,那麼建立的是條帶卷或複製卷;若是存儲服務器的數量是條帶卷或複製卷的2倍甚至更多,那麼將建立分佈式條帶卷或分佈式複製卷。
分佈式複製卷兼顧分佈式卷和複製卷的功能,主要用於須要冗餘的狀況下,如圖:
如圖所示:File1和File2經過分佈式jaunty的功能分別定位到Server1和Server2。在存放File1時,File1根據複製卷的特性,將存在兩個相同的副本,分別是Server1中的exp1目錄和Server2中的exp2目錄,在存放File2時,File2根據複製卷的特性,也將存在兩個相同的副本,分別是Server3中的exp3目錄和Server4中的exp4目錄。
建立分佈式複製卷的命令:
[root@localhost ~]# gluster volume create dis-rep replica 2 transport tcp server1:/dir1 server2:/dir2 server3:/dir3 server4:/dir4 //建立了一個名爲dis-rep的分佈式條帶卷,配置分佈式的複製卷時,卷中Brick所包含的存儲服務器數必須是條帶數的倍數(>=2倍) Creation of rep-volume has been successful Please start the volume to access data
假如存在8臺服務器,當複製副本爲2時,按照服務器列表的順序,服務器1和2做爲一個複製,服務器3和4做爲一個複製,服務器5和6做爲一個複製,服務器7和8做爲一個複製;當複製副本爲4時,按照服務器列表的順序,服務器1/2/3./4做爲一個複製,服務器5/6/7/8做爲一個複製。
關於這些理論概念並非很難,基本看一遍就能明白其中的意思,那這裏也就很少說了!
這篇博文主要介紹理論,關於實戰能夠參考博文:部署GlusterFS分佈式文件系統,實戰!!!
———————— 本文至此結束,感謝閱讀 ————————