主頁 > 軟體設計 > 常見開源分布式檔案系統架構對比

常見開源分布式檔案系統架構對比

2021-09-30 07:16:14 軟體設計

什么是檔案系統?

檔案系統是計算機中一個非常重要的組件,為存盤設備提供一致的訪問和管理方式,在不同的作業系統中,檔案系統會有一些差別,但也有一些共性幾十年都沒怎么變化:

  1. 資料是以檔案的形式存在,提供 Open、Read、Write、Seek、Close 等API 進行訪問;
  2. 檔案以樹形目錄進行組織,提供原子的重命名(Rename)操作改變檔案或者目錄的位置,

檔案系統提供的訪問和管理方法支撐了絕大部分的計算機應用,Unix 的“萬物皆檔案”的理念更是凸顯了它的重要地位,檔案系統的復雜性使得它的可擴展性未能跟得上互聯網的高速發展,極大簡化了的物件存盤及時填補了空缺得以快速發展起來,因為物件存盤缺乏樹狀結構也不支持原子重命名操作,跟檔案系統有很大的差別,本文暫不討論,

單機檔案系統的挑戰

絕大多數檔案系統都是單機的,在單機作業系統內為一個或者多個存盤設備提供訪問和管理,隨著互聯網的高速發展,單機檔案系統面臨很多的挑戰:

  • 共享:無法同時為分布在多個機器中的應用提供訪問,于是有了 NFS 協議,可以將單機檔案系統通過網路的方式同時提供給多個機器訪問,
  • 容量:無法提供足夠空間來存盤資料,資料只好分散在多個隔離的單機檔案系統里,
  • 性能:無法滿足某些應用需要非常高的讀寫性能要求,應用只好做邏輯拆分同時讀寫多個檔案系統,
  • 可靠性:受限于單個機器的可靠性,機器故障可能導致資料丟失,
  • 可用性:受限于單個作業系統的可用性,故障或者重啟等運維操作會導致不可用,

隨著互聯網的高速發展,這些問題變得日益突出,涌現出了一些分布式檔案系統來應對這些挑戰,

下面介紹幾個我了解過的分布式檔案系統的基本架構,并比較不同架構的優點和局限,

GlusterFS

GlusterFS 是由美國的 Gluster 公司開發的 POSIX 分布式檔案系統(以 GPL 開源),2007年發布第一個公開版本,2011年被 Redhat 收購,

它的基本思路就是通過一個無狀態的中間件把多個單機檔案系統融合成統一的名字空間(namespace)提供給用戶,這個中間件是由一系列可疊加的轉換器(Translator)實作,每個轉換器解決一個問題,比如資料分布、復制、拆分、快取、鎖等等,用戶可以根據具體的應用場景需要靈活配置,比如一個典型的分布式卷如下圖所示:

image.png

Server1 和 Server2 構成有 2 副本的 Volume0,Server3 和 Server4 構成 Volume1,它們再融合成有更大空間的分布式卷,

優點:
資料檔案最終以相同的目錄結構保存在單機檔案系統上,不用擔心 GlusterFS 的不可用導致資料丟失,

沒有明顯的單點問題,可線性擴展,

對大量小檔案的支持估計還不錯,

挑戰:
這種結構是相對靜態的,不容易調整,也要求各個存盤節點有相同的配置,當資料或者訪問不均衡時沒法進行空間或者負載調整,故障恢復能力也比較弱,比如 Server1 故障時,Server2 上的檔案就沒辦法在健康的 3 或者 4上增加拷貝保障資料可靠,

因為缺乏獨立的元資料服務,要求所有存盤節點都會有完整的資料目錄結構,遍歷目錄或者做目錄結構調整時需要訪問所有節點才能得到正確結果,導致整個系統的可擴展能力有限,擴展到幾十個節點時還行,很難有效地管理上百個節點,

CephFS

CephFS 始于 Sage Weil 的博士論文研究,目標是實作分布式的元資料管理以支持 EB 級別資料規模,2012年,Sage Weil 成立了 InkTank 繼續支持 CephFS 的開發,于 2014年被 Redhat 收購,直到 2016 年,CephFS 才發布可用于生產環境的穩定版(CephFS 的元資料部分仍然是單機的),現在,CephFS 的分布式元資料仍然不成熟,

Ceph 是一個分層的架構,底層是一個基于 CRUSH(哈希)的分布式物件存盤,上層提供物件存盤(RADOSGW)、塊存盤(RDB)和檔案系統(CephFS)三個API,如下圖所示:

image.png

用一套存盤系統來滿足多個不同場景的存盤需求(虛擬機鏡像、海量小檔案和通用檔案存盤)還是非常吸引人的,但因為系統的復雜性需要很強的運維能力才能支撐,實際上目前只有塊存盤還是比較成熟應用得比較多,物件存盤和檔案系統都不太理想,聽到一些使用案例用過一段時間后就放棄了,

CephFS 的架構如下圖所示:

image.png

CephFS 是由 MDS(Metadata Daemon) 實作的,它是一個或者多個無狀態的元資料服務,從底層的 OSD 加載檔案系統的元資訊,并快取到記憶體中以提高訪問速度,因為 MDS 是無狀態的,可以配置多個備用節點來實作 HA,相對比較容易,不過備份節點沒有快取,需要重新預熱,有可能故障恢復時間會比較長,

因為從存盤層加載或者寫入資料會比較慢,MDS 必須使用多執行緒來提高吞吐量,各種并發的檔案系統操作導致復雜度大大上升,容易發生死鎖,或者因為 IO 比較慢導致的性能大幅下降,為了獲得比較好的性能,MDS 往往需要有足夠多的記憶體來快取大部分元資料,這也限制了它實際的支撐能力,

當有多個活躍的 MDS 時,目錄結構中的一部分(子樹)可以動態的分配到某個MDS并完全由它來處理相關請求,以達到水平擴展的目的,多個活躍之前,不可避免地需要各自鎖機制來協商對子樹的所有權,以及通過分布式事務來實作跨子樹的原子重命名,這些實作起來都是非常復雜的,目前最新的官方檔案仍然不推薦使用多個 MDS(作為備份是可以的),

GFS

Google 的 GFS 是分布式檔案系統中的先驅和典型代表,由早期的 BigFiles 發展而來,在 2003 年發表的論文中詳細闡述了它的設計理念和細節,對業界影響非常大,后來很多分布式檔案系統都是參照它的設計,

顧名思義,BigFiles/GFS 是為大檔案優化設計的,并不適合平均檔案大小在 1MB 以內的場景,GFS的架構入下圖所示:

image.png

GFS 有一個 Master 節點來管理元資料(全部加載到記憶體,快照和更新日志寫到磁盤),檔案劃分成 64MB 的 Chunk 存盤到幾個 ChunkServer 上(直接使用單機檔案系統),檔案只能追加寫,不用擔心 Chunk 的版本和一致性問題(可以用長度當做版本),這個使用完全不同的技術來解決元資料和資料的設計使得系統的復雜度大大簡化,也有足夠的擴展能力(如果平均檔案大小大于 256MB,Master 節點每 GB 記憶體可以支撐約 1PB 的資料量),放棄支持 POSIX 檔案系統的部分功能(比如隨機寫、擴展屬性、硬鏈接等)也進一步簡化了系統復雜度,以換取更好的系統性能、魯棒性和可擴展性,

因為 GFS 的成熟穩定,使得 Google 可以更容易地構建上層應用(MapReduce、BigTable等),后來,Google 開發了擁有更強可擴展能力的下一代存盤系統 Colossus,把元資料和資料存盤徹底分離,實作了元資料的分布式(自動 Sharding),以及使用Reed Solomon 編碼來降低存盤空間占用從而降低成本,

HDFS

出自 Yahoo 的 Hadoop 算是 Google 的 GFS、MapReduce 等的開源Java實作版,HDFS 也是基本照搬 GFS 的設計,這里就不再重復了,下圖是HDFS的架構圖:

image.png

HDFS的可靠性和可擴展能力還是非常不錯的,有不少幾千節點和 100PB 級別的部署,支撐大資料應用表現還是很不錯的,少有聽說丟資料的案例(因為沒有配置回收站導致資料被誤刪的除外),

HDFS 的 HA 方案是后來補上的,做得比較復雜,以至于最早做這個 HA 方案的 Facebook 在很長一段時間(至少 3 年)內都是手動做故障切換(不信任自動故障切換),

因為 NameNode 是 Java 實作的,依賴于預先分配的堆記憶體大小,分配不足容易觸發 Full GC 而影響整個系統的性能,有一些團隊嘗試把它用 C++ 重寫了,但還沒看到有成熟的開源方案,

HDFS 也缺乏成熟的非 Java 客戶端,使得大資料(Hadoop等工具)以外的場景(比如深度學習等)使用起來不太方便,

MooseFS

MooseFS 是來自波蘭的開源分布式 POSIX 檔案系統,也是參照了 GFS 的架構,實作了絕大部分 POSIX 語意和 API,通過一個非常成熟的 FUSE 客戶端掛載后可以像本地檔案系統一樣訪問,MooseFS 的架構如下圖所示:

image.png

MooseFS 支持快照,用它來做資料備份或者備份恢復等還是恢復方便的,

MooseFS 是由 C 實作的,Master 是個異步事件驅動的單執行緒,類似于 Redis,不過網路部分使用的是 poll 而不是更高效的 epoll,導致并發到 1000 左右時 CPU 消耗非常厲害,

開源的社區版沒有HA,是通過 metalogger 來實作異步冷備,閉源的收費版有 HA,

為了支持隨機寫操作,MooseFS 中的 chunk 是可以修改的,通過一套版本管理機制來保證資料一致性,這個機制比較復雜容易出現詭異問題(比如集群重啟后可能會有少數 chunk 實際副本數低于預期),

JuiceFS

上面說的 GFS、HDFS 和 MooseFS 都是針對自建機房這種軟硬體環境設計的,將資料的可靠性和節點可用性合在一起用多機多副本的方式解決,但是在公有云或者私有云的虛擬機里,塊設備已經是具有三副本可靠性設計的虛擬塊設備,如果再通過多機多副本的方式來做,會導致資料的成本居高不下(實際上是 9 個拷貝),

于是我們針對公有云,改進 HDFS 和 MooseFS 的架構,設計了 JuiceFS,架構如下圖所示:

image.png

JuiceFS 使用公有云中已有的物件存盤來替換 DataNode 和 ChunkServer,實作一個完全彈性的 Serverless 的存盤系統,公有云的物件存盤已經很好地解決了大規模資料的安全高效存盤,JuiceFS 只需要專注元資料的管理,也大大降低了元資料服務的復雜度(GFS 和 MooseFS 的 master 要同時解決元資料的存盤和資料塊的健康管理),我們也對元資料部分做了很多改進,從一開始就實作了基于 Raft 的高可用,要真正提供一個高可用高性能的服務,元資料的管理和運維仍然是很有挑戰的,元資料是以服務的形式提供給用戶,因為 POSIX 檔案系統 API 是應用最最廣泛的 API,我們基于 FUSE 實作了高度 POSIX 兼容的客戶端,用戶可以通過一個命令列工具把 JuiceFS 掛載到 Linux 或者 macOS 中,像本地檔案系統一樣快速訪問,

上圖中右邊虛線部分是負責資料存盤和訪問的部分,涉及用戶的資料隱私,它們是完全在客戶自己的賬號和網路環境中,不會跟元資料服務接觸,我們(Juicedata)沒有任何方法接觸到客戶的內容(元資料除外,請不要把敏感內容放到檔案名里),

小結

簡要介紹了下我所了解的幾個分布式檔案系統的架構,把他們按照出現的時間順序放在下面的圖里(箭頭表示后參考了前者或者是新一代版本):

image.png

上圖中上部分藍色的幾個檔案下主要是給大資料場景使用的,實作的是 POSIX 的子集,而下面綠色的幾個是 POSIX 兼容的檔案系統,

他們中以 GFS 為代表的元資料和資料分離的系統設計能夠有效平衡系統的復雜度,有效解決大規模資料的存盤問題(通常也都是大檔案),有更好的可擴展性,這個架構下支持元資料的分布式存盤的 Colossus 和 WarmStorage 更是具有無限的可擴展能力,

JuiceFS 作為后來者,學習了 MooseFS 實作分布式 POSIX 檔案系統的方式,也學習了 Facebook 的 WarmStorage 等元資料和資料徹底分開的思路,希望為公有云或者私有云等場景下提供最好的分布式存盤體驗,JuiceFS 通過將資料存盤到物件存盤的方式,有效避免了使用以上分布式檔案系統時的雙層冗余(塊存盤的冗余和分布式系統的多機冗余)導致的成本過高問題,JuiceFS 還支持所有的公有云,不用擔心某個云服務鎖定,還能平滑地在公有云或者區之間遷移資料,

 

推薦閱讀

如何借助 JuiceFS 為 AI 模型訓練提速 7 倍

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/304220.html

標籤:架構設計

上一篇:2021SC@SDUSC amis-低代碼前端框架綜述

下一篇:常見開源分布式檔案系統架構對比

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more