glusterfs架構和原理
分散式儲存已經研究很多年,但直到近年來,伴隨著谷歌、亞馬遜和阿里等網際網路公司雲端計算和大資料應用的興起,它才大規模應用到工程實踐中。如谷歌的分散式檔案系統GFS、分散式表格系統google Bigtable,亞馬遜的物件儲存AWS,阿里的TFS等都是很好的代表,同時也催生了一大批優秀的開源分散式儲存系統,包括ceph、swift、Lustre和glusterfs等。
分散式儲存系統
分散式儲存按其儲存介面分為三種:檔案儲存、塊儲存和物件儲存。
檔案儲存
通常支援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物件儲存。主要用來儲存非結構化資料。
Glusterfs
Glusterfs是一個開源分散式檔案系統,具有強大的橫向擴充套件能力,可支援數PB儲存容量和數千客戶端,通過Infiniband RDMA 或Tcp/Ip 方式將許多廉價的x86 主機,通過網路互聯成一個並行的網路檔案系統。具有可擴充套件性、高效能、高可用性等特點。
GlusterFS採用可堆疊的使用者空間設計,如圖所示:
imageglusterfs堆疊式結構
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模組關係圖Glusterfs作為一款開源的分散式檔案系統,在開源社群的活躍度很高,目前已經被紅帽收購,國內外也有大量的使用者在研究和應用,相關技術文件很豐富。它並不完美,為了支援線性擴充套件和高效能,而在小檔案效能和元資料效能上做了讓步,但卻可以滿足一定的場景,如大資料應用和視訊儲存等。
接下來會從優點和缺點兩方面入手來介紹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的實際資料)的關係。