glusterfs簡介

分佈式存儲已經研究很多年,但直到近年來,伴隨着谷歌、亞馬遜和阿里等互聯網公司雲計算和大數據應用的興起,它才大規模應用到工程實踐中。如谷歌的分佈式文件系統GFS、分佈式表格系統google Bigtable,亞馬遜的對象存儲AWS,阿里的TFS等都是很好的代表,同時也催生了一大批優秀的開源分佈式存儲系統,包括ceph、swift、Lustre和glusterfs等。

1. 分佈式存儲系統

分佈式存儲按其存儲接口分爲三種:文件存儲、塊存儲和對象存儲。

文件存儲

通常支持POSIX接口(如glusterfs,但GFS、HDFS是非POSIX接口的),可以像普通文件系統(如ext4)那樣訪問,但又比普通文件系統多了並行化訪問的能力和冗餘機制。主要的分佈式文件存儲系統有TFS、cephfs、glusterfs和HDFS等。主要存儲非結構化數據,如普通文件、圖片、音視頻等。可以採用NFS和CIFS等協議訪問,共享方便。NAS是文件存儲類型。

塊存儲

這種接口通常以QEMU Driver或者Kernel Module的方式存在,主要通過qemu或iscsi協議訪問。主要的塊存儲系統有ceph塊存儲、sheepdog等。主要用來存儲結構化數據,如數據庫數據。數據共享不方便。DAS和SAN都是塊存儲類型。

對象存儲

對象存儲系統綜合了NAS和SAN的優點,同時具有SAN的高速直接訪問和NAS的數據共享等優勢。以對象作爲基本的存儲單元,向外提供RESTful數據讀寫接口,常以網絡服務的形式提供數據訪問。主要的對象存儲系統有AWS、swift和ceph對象存儲。主要用來存儲非結構化數據。

2. Glusterfs

Glusterfs是一個開源分佈式文件系統,具有強大的橫向擴展能力,可支持數PB存儲容量和數千客戶端,通過Infiniband RDMA 或Tcp/Ip 方式將許多廉價的x86 主機,通過網絡互聯成一個並行的網絡文件系統。具有可擴展性、高性能、高可用性等特點。

GlusterFS採用可堆疊的用戶空間設計,如圖所示:
在這裏插入圖片描述

glusterfs堆棧式結構

Glusterfs是根據fuse提供的接口實現的一個用戶態的文件系統,主要包括gluster、glusterd、glusterfs和glusterfsd四大模塊組成:

  • gluster:是cli命令執行工具,主要功能是解析命令行參數,然後把命令發送給glusterd模塊執行。
  • glusterd:是一個管理模塊,處理gluster發過來的命令,處理集羣管理、存儲池管理、brick管理、負載均衡、快照管理等。集羣信息、存儲池信息和快照信息等都是以配置文件的形式存放在服務器中,當客戶端掛載存儲時,glusterd會把存儲池的配置文件發送給客戶端。
  • glusterfsd:是服務端模塊,存儲池中的每個brick都會啓動一個glusterfsd進程。此模塊主要是處理客戶端的讀寫請求,從關聯的brick所在磁盤中讀寫數據,然後返回給客戶端。
  • glusterfs:是客戶端模塊,負責通過mount掛載集羣中某臺服務器的存儲池,以目錄的形式呈現給用戶。當用戶從此目錄讀寫數據時,客戶端根據從-glusterd模塊獲取的存儲池的配置文件信息,通過DHT算法計算文件所在服務器的brick位置,然後通過Infiniband RDMA 或Tcp/Ip 方式把數據發送給brick,等brick處理完,給用戶返回結果。存儲池的副本、條帶、hash、EC等邏輯都在客戶端處理。

在使用glusterfs提供的存儲服務之前,需要先掛載存儲池,向掛載點寫數據,會經過fuse內核模塊傳給客戶端,客戶端檢查存儲池的類型,然後計算數據所在服務器 ,最後通過socket或rdma與服務器通信,如圖2所示:
在這裏插入圖片描述
Glusterfs作爲一款開源的分佈式文件系統,在開源社區的活躍度很高,目前已經被紅帽收購,國內外也有大量的用戶在研究和應用,相關技術文檔很豐富。它並不完美,爲了支持線性擴展和高性能,而在小文件性能和元數據性能上做了讓步,但卻可以滿足一定的場景,如大數據應用和視頻存儲等。

優缺點

  • 優點
  • 無元數據節點性能瓶頸
    採用無中心對稱式架構,沒有專用的元數據服務器,也就不存在元數據服務器瓶頸。元數據存在於文件的屬性和擴展屬性中。當需要訪問某文件時,客戶端使用DHT算法,根據文件的路徑和文件名計算出文件所在brick,然後由客戶端從此brick獲取數據,省去了同元數據服務器通信的過程。
  • 良好的可擴展性
    使用彈性hash算法代替傳統的有元數據節點服務,獲得了接近線性的高擴展性。
  • 高可用
    採用副本、EC等冗餘設計,保證在冗餘範圍內的節點掉線時,仍然可以從其它服務節點獲取數據,保證高可用性。採用弱一致性的設計,當向副本中文件寫入數據時,客戶端計算出文件所在brick,然後通過網絡把數據傳給所在brick,當其中有一個成功返回,就認爲數據成功寫入,不必等待其它brick返回,就會避免當某個節點網絡異常或磁盤損壞時因爲一個brick沒有成功寫入而導致寫操作等待。
    服務器端還會隨着存儲池的啓動,而開啓一個glustershd進程,這個進程會定期檢查副本和EC卷中各個brick之間數據的一致性,並恢復。
  • 存儲池類型
    豐富包括粗粒度、條帶、副本、條帶副本和EC,可以根據用戶的需求,滿足不同程度的冗餘。粗粒度卷不帶任何冗餘,文件不進行切片,是完整的存放在某個brick上。
    條帶卷不帶任何冗餘,文件會切片存儲(默認大小爲128kB)在不同的brick上。這些切片可以併發讀寫(併發粒度是條帶塊),可以明顯提高讀寫性能。該模式一般只適合用於處理超大型文件和多節點性能要求高的情況。
    副本卷冗餘度高,副本數量可以靈活配置,可以保證數據的安全性。
    條帶副本卷是條帶卷和副本卷的結合。
    EC卷使用EC校驗算法,提供了低於副本卷的冗餘度,冗餘度小於100%,滿足比較低的數據安全性,例如可以使2+1(冗餘度爲50%)、5+3(冗餘度爲60%)等。這個可以滿足安全性要求不高的數據。
  • 高性能
    採用弱一致性的設計,向副本中寫數據時,只要有一個brick成功返回,就認爲寫入成功,不必等待其它brick返回,這樣的方式比強一致性要快。
    還提供了I/O併發、write-behind、read-ahead、io-cache、條帶等提高讀寫性能的技術。並且這些都還可以根據實際需求進行開啓/關閉,i/o併發數量,cache大小都可以調整。
  • 缺點
  • 擴容、縮容時影響的服務器較多
    Glusterfs對邏輯卷中的存儲單元brick劃分hash分佈空間(會以brick所在磁盤大小作爲權重,空間總範圍爲0至232-1),一個brick佔一份空間,當訪問某文件時,使用Davies-Meyer算法根據文件名計算出hash值,比較hash值落在哪個範圍內,即可確定文件所在的brick,這樣定位文件會很快。但是在向邏輯卷中添加或移除brick時,hash分佈空間會重新計算,每個brick的hash範圍都會變化,文件定位就會失敗,因此需要遍歷文件,把文件移動到正確的hash分佈範圍對應的brick上,移動的文件可能會很多,加重系統負載,影響到正常的文件訪問操作。
  • 遍歷目錄下文件耗時
    1.Glusterfs沒有元數據節點,而是根據hash算法來確定文件的分佈,目錄利用擴展屬性記錄子卷的中brick的hash分佈範圍,每個brick的範圍均不重疊。遍歷目錄時,需要readdir子卷中每個brick中的目錄,獲取每個文件的屬性和擴展屬性,然後進行聚合,相對於有專門元數據節點的分佈式存儲,遍歷效率會差很多,當目錄下有大量文件時,遍歷會非常緩慢。
    2.刪除目錄也會遇到同樣的問題。
    3.目前提供的解決方法是合理組織目錄結構,目錄層級不要太深,目錄下文件數量不要太多,增大glusterfs目錄緩存。另外,還可以設計把元數據和數據分離,把元數據放到內存數據庫中(如redis、memcache),並在ssd上持久保存。
  • 小文件性能較差
    1.Glusterfs主要是爲大文件設計,如io-cache、read-ahead、write-behind和條帶等都是爲優化大文件訪問,對小文件的優化很少。
    2.Glusterfs採用無元數據節點的設計,文件的元數據和數據一起保存在文件中,訪問元數據和數據的速率相同,訪問元數據的時間與訪問數據的時間比例會較大,而有元數據中心的分佈式存儲系統,對元數據服務器可以採用更快速的ssd盤,可以採用更大的元數據緩存等優化措施來減小訪問元數據時間與訪問數據時間的比值,來提高小文件性能。
    3.Glusterfs在客戶端採用了元數據緩存md-cache來提高小文件性能,但是md-cache大小有限,但在海量小文件場景下,緩存命中率會嚴重下降,優化效果會減小,這就需要增大元數據緩存。
    4.針對小文件性能差的問題,也可以參考TFS的做法, TFS會將大量的小文件合併成一個大文件,這個大文件稱爲Block,每個Block擁有在集羣內唯一的編號(Block Id),Block Id在NameServer創建Block時分配,NameServer維護block與DataServer(存儲Block的實際數據)的關係。

3. 使用方式

分佈式卷

在這裏插入圖片描述

gluster volume create test-volume server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4
Creation of test-volume has been successful
Please start the volume to access data
#
# gluster volume info
Volume Name: test-volume
Type: Distribute
Status: Created
Number of Bricks: 4
Transport-type: tcp
Bricks:
Brick1: server1:/exp1
Brick2: server2:/exp2
Brick3: server3:/exp3
Brick4: server4:/exp4

複製Glusterfs卷

在這裏插入圖片描述

# gluster volume create test-volume replica 2 transport tcp server1:/exp1 server2:/exp2
Creation of test-volume has been successful
Please start the volume to access data

分佈式複製Glusterfs卷

在這裏插入圖片描述

# gluster volume create test-volume replica 2 transport tcp server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4
Creation of test-volume has been successful
Please start the volume to access data

條紋Glusterfs卷

在這裏插入圖片描述

# gluster volume create test-volume stripe 2 transport tcp server1:/exp1 server2:/exp2
Creation of test-volume has been successful
Please start the volume to access data

分佈式條紋Glusterfs卷

在這裏插入圖片描述

# gluster volume create test-volume stripe 4 transport tcp
 server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4 server5:/exp5 server6:/exp6 server7:/exp7 server8:/exp8
Creation of test-volume has been successful
Please start the volume to access data.

參考:
https://docs.gluster.org/en/latest/Quick-Start-Guide/Architecture
https://www.jianshu.com/p/a33ff57f32df
https://blog.csdn.net/wh211212/article/details/79412081

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章