分散式文件系統:原理、問題與方法

来源:http://www.cnblogs.com/duguheilang/archive/2016/03/31/5340289.html
-Advertisement-
Play Games

本地文件系統如ext3,reiserfs等 (這裡不討論基於記憶體的文件系統),它們管理本地的磁碟存儲資源、提供文件到存儲位置的映射,並抽象出一套文件訪問介面供用戶使用。但隨著互聯網企業的高 速發展,這些企業對數據存儲的要求越來越高,而且模式各異,如淘寶主站的大量商品圖片,其特點是文件較小,但數量巨大 ...


本地文件系統如ext3,reiserfs等 (這裡不討論基於記憶體的文件系統),它們管理本地的磁碟存儲資源、提供文件到存儲位置的映射,並抽象出一套文件訪問介面供用戶使用。但隨著互聯網企業的高 速發展,這些企業對數據存儲的要求越來越高,而且模式各異,如淘寶主站的大量商品圖片,其特點是文件較小,但數量巨大;而類似於youtube, 優酷這樣的視頻服務網站,其後臺存儲著大量的視頻文件,尺寸大多在數十兆到數吉位元組不等。這些應用場景都是傳統文件系統不能解決的。分散式文件系統將數據 存儲在物理上分散的多個存儲節點上,對這些節點的資源進行統一的管理與分配,並向用戶提供文件系統訪問介面,其主要解決了本地文件系統在文件大小、文件數 量、打開文件數等的限制問題

典型架構

目 前比較主流的一種分散式文件系統架構,如下圖所示,通常包括主控伺服器(或稱元數據伺服器、名字伺服器等,通常會配置備用主控伺服器以便在故障時接管服 務,也可以兩個都為主的模式),多個數據伺服器(或稱存儲伺服器,存儲節點等),以及多個客戶端,客戶端可以是各種應用伺服器,也可以是終端用戶。

 

 

分 布式文件系統的數據存儲解決方案,歸根結底是將將大問題劃分為小問題。大量的文件,均勻分佈到多個數據伺服器上後,每個數據伺服器存儲的文件數量就少了, 另外通過使用大文件存儲多個小文件的方式,總能把單個數據伺服器上存儲的文件數降到單機能解決的規模;對於很大的文件,將大文件劃分成多個相對較小的片 段,存儲在多個數據伺服器上(目前,很多本地文件系統對超大文件的支持已經不存在問題了,如ext3文件系統使用4k塊時,文件最大能到4T,ext4則能支持更大的文件,只是受限於磁碟的存儲空間)。

 

理 論上,分散式文件系統可以只有客戶端和多個數據伺服器組成,客戶端根據文件名決定將文件存儲到哪個數據伺服器,但一旦有數據伺服器失效時,問題就變得復 雜,客戶端並不知道數據伺服器宕機的消息,仍然連接它進行數據存取,導致整個系統的可靠性極大的降低,而且完全有客戶端決定數據分配時非常不靈活的,其不 能根據文件特性制定不同的分佈策略。

 

於 是,我們迫切的需要能知道各個數據伺服器的服務狀態,數據伺服器的狀態管理可分為分散式和集中式兩種方式,前者是讓多個數據伺服器相互管理,如每個伺服器 向其他所有的伺服器發送心跳信息,但這種方式開銷較大,控制不好容易影響到正常的數據服務,而且工程實現較為複雜;後者是指通過一個獨立的伺服器(如上圖 中的主控伺服器)來管理數據伺服器,每個伺服器向其彙報服務狀態來達到集中管理的目的,這種方式簡單易實現,目前很多分散式文件系統都採用這種方式如GFS、TFS(http://code.taobao.org/p/tfs/wiki/index/ )、MooseFS (http://www.moosefs.org/ )等。主控伺服器在負載較大時會出現單點,較多的解決方案是配置備用伺服器,以便在故障時接管服務,如果需要,主備之間需要進行數據的同步。


問題及解決方法

本文主要討論基於上圖架構的分散式文件系統的相關原理,工程實現時需要解決的問題和解決問題的基本方法,分散式文件系統涉及的主要問題及解決方法如下圖所示。為方便描述以下主控伺服器簡稱Master,數據伺服器簡稱DS(DataServer)。

 

主控伺服器

 

命名空間的維護

Master負責維護整個文件系統的命名空間,並暴露給用戶使用,命名空間的結構主要有典型目錄樹結構如MooseFS等,扁平化結構如淘寶TFS(目前已提供目錄樹結構支持),圖結構(主要面向終端用戶,方便用戶根據文件關聯性組織文件,只在論文中看到過)。

為了維護名字空間,需要存儲一些輔助的元數據如文件(塊)到數據伺服器的映射關係,文件之間的關係等,為了提升效率,很多文件系統採取將元數據全部記憶體化(元數據通常較小)的方式如GFS, TFS;有些系統借則助資料庫來存儲元數據如DBFS,還有些系統則採用本地文件來存儲元數據如MooseFS。

 

一種簡單的實現目錄樹結構的方式是,在Master上存儲與客戶端完全一樣的命名空間,對應的文件內容為該文件的元數據,並通過在Master上採用ReiserFS來進行小文件存儲優化,對於大文件的存儲(文件數量不會成為Master的瓶頸),這種方式簡單易實現。曾經參與的DNFS系統的開發就是使用這種方式,DNFS主要用於存儲視頻文件,視頻數量在百萬級別,Master採用這種方式文件數量上不會成為瓶頸。

 

數據伺服器管理

除了維護文件系統的命名空間,Master還需要集中管理數據DS, 可通過輪詢DS或由DS報告心跳的方式實現。在接收到客戶端寫請求時,Master需要根據各個DS的負載等信息選擇一組(根據系統配置的副本數)DS為其服務;當Master發現有DS宕機時,需要對一些副本數不足的文件(塊)執行複製計劃;當有新的DS加入集群或是某個DS上負載過高,Master也可根據需要執行一些副本遷移計劃。

 

如果Master的元數據存儲是非持久化的,則在DS啟動時還需要把自己的文件(塊)信息彙報給Master。在分配DS時,基本的分配方法有隨機選取,RR輪轉、低負載優先等,還可以將伺服器的部署作為參考(如HDFS分配的策略),也可以根據客戶端的信息,將分配的DS按照與客戶端的遠近排序,使得客戶端優先選取離自己近的DS進行數據存取.

服務調度

Master最終的目的還是要服務好客戶端的請求,除了一些周期性線程任務外,Master需要服務來自客戶端和DS的請求,通常的服務模型包括單線程、每請求一線程、線程池(通常配合任務隊列)。單線程模型下,Master只 能順序的服務請求,該方式效率低,不能充分利用好系統資源;每請求一線程的方式雖能併發的處理請求,但由於系統資源的限制,導致創建線程數存在限制,從而 限制同時服務的請求數量,另外,線程太多,線程間的調度效率也是個大問題;線程池的方式目前使用較多,通常由單獨的線程接受請求,並將其加入到任務隊列 中,而線程池中的線程則從任務隊列中不斷的取出任務進行處理。

主備(主)容災

Master在整個分散式文件系統中的作用非常重要,其維護文件(塊)到DS的映射、管理所有的DS狀態併在某些條件觸發時執行負載均衡計劃等。為了避免Master的單點問題,通常會為其配置備用伺服器,以保證在主控伺服器節點失效時接管其工作。通常的實現方式是通過HA、UCARP等軟體為主備伺服器提供一個虛擬IP提供服務,當備用伺服器檢測到主宕機時,會接管主的資源及服務。

 

如果Master需要持久化一些數據,則需要將數據同步到備用Master,對於元數據記憶體化的情況,為了加速元數據的構建,有時也需將主上的操作同步到備Master。處理方式可分為同步和非同步兩種。同步方式將每次請求同步轉發至備Master,這樣理論上主備時刻保持一致的狀態,但這種方式會增加客戶端的響應延遲(在客戶端對響應延遲要求不高時可使用這種方式),當備Master宕機時,可採取不做任何處理,等備Master起來後再同步數據,或是暫時停止寫服務,管理員介入啟動備Master再正常服務(需業務能容忍);非同步方式則是先暫存客戶端的請求信息(如追加至操作日誌),後臺線程重放日誌到備Master,這種方式會使得主備的數據存在不一致的情況,具體策略需針對需求制定。


數據伺服器

數據本地存儲

數據伺服器負責文件數據在本地的持久化存儲,最簡單的方式是將客戶每個文件數據分配到一個單獨的DS上作為一個本地文件存儲,但這種方式並不能很好的利用分散式文件系統的特性,很多文件系統使用固定大小的塊來存儲數據如GFS, TFS, HDFS,典型的塊大小為64M。

 

對於小文件的存儲,可以將多個文件的數據存儲在一個塊中,併為塊內的文件建立索引,這樣可以極大的提高存儲空間利用率。Facebook用於存儲照片的HayStack系統的本地存儲方式為,將多個圖片對象存儲在一個大文件中,併為每個文件的存儲位置建立索引,其支持文件的創建和刪除,不支持更新(通過刪除和創建完成),新創建的圖片追加到大文件的末尾並更新索引,文件刪除時,簡單的設置文件頭的刪除標記,系統在空閑時會對大文件進行compact把設置刪除標記且超過一定時限的文件存儲空間回收(延遲刪除策略)。淘寶的TFS系統採用了類似的方式,對小文件的存儲進行了優化,TFS使用擴展塊的方式支持文件的更新。對小文件的存儲也可直接藉助一些開源的KV存儲解決方案,如Tokyo Cabinet(HDB, FDB, BDB, TDB)、Redis等。

 

對於大文件的存儲,則可將文件存儲到多個塊上,多個塊所在的DS可以並行服務,這種需求通常不需要對本地存儲做太多優化。

狀態維護

DS除了簡單的存儲數據外,還需要維護一些狀態,首先它需要將自己的狀態以心跳包的方式周期性的報告給Master,使得Master知道自己是否正常工作,通常心跳包中還會包含DS當前的負載狀況(CPU、記憶體、磁碟IO、磁碟存儲空間、網路IO等、進程資源,視具體需求而定),這些信息可以幫助Master更好的制定負載均衡策略。

 

很多分散式文件系統如HDFS在外圍提供一套監控系統,可以實時的獲取DS或Master的負載狀況,管理員可根據監控信息進行故障預防。

副本管理

為了保證數據的安全性,分散式文件系統中的文件會存儲多個副本到DS上,寫多個副本的方式,主要分為3種。最簡單的方式是客戶端分別向多個DS寫同一份數據,如DNFS採用這種方式;第2種方式是客戶端向主DS寫數據,主DS向其他DS轉發數據,如TFS採用這種方式;第三種方式採用流水複製的方式,client向某個DS寫數據,該DS向副本鏈中下一個DS轉發數據,依次類推,如HDFS、GFS採取這種方式。

 

當有節點宕機或節點間負載極不均勻的情況下,Master會制定一些副本複製或遷移計劃,而DS實際執行這些計劃,將副本轉發或遷移至其他的DS。DS也可提供管理工具,在需要的情況下由管理員手動的執行一些複製或遷移計劃。

服務模型

參考主控伺服器::服務模型一節


客戶端

介面

用戶最終通過文件系統提供的介面來存取數據,linux環境下,最好莫過於能提供POSIX介面的支持,這樣很多應用(各種語言皆可,最終都是系統調用)能不加修改的將本地文件存儲替換為分散式文件存儲。

 

要想文件系統支持POSIX介面,一種方式時按照VFS介面規範實現文件系統,這種方式需要文件系統開發者對內核有一定的瞭解;另一種方式是藉助FUSE(http://fuse.sourceforge.net)軟體,在用戶態實現文件系統並能支持POSIX介面,但是用該軟體包開發的文件系統會有額外的用戶態內核態的切換、數據拷貝過程,從而導致其效率不高。很多文件系統的開發藉助了fuse,參考http://sourceforge.net/apps/mediawiki/fuse/index.php?title=FileSystems

 

如果不能支持POSIX介面,則為了支持不同語言的開發者,需要提供多種語言的客戶端支持,如常用的C/C++、java、php、python客戶端。使用客戶端的方式較難處理的一種情況時,當客戶端升級時,使用客戶端介面的應用要使用新的功能,也需要進行升級,當應用較多時,升級過程非常麻煩。目前一種趨勢是提供Restful介面的支持,使用http協議的方式給應用(用戶)訪問文件資源,這樣就避免功能升級帶來的問題。

 

另外,在客戶端介面的支持上,也需根據系統需求權衡,比如write介面,在分散式實現上較麻煩,很難解決數據一致性的問題,應該考慮能否只支持create(update通過delete和create組合實現),或折中支持append,以降低系統的複雜性。

緩存

分散式文件系統的文件存取,要求客戶端先連接Master獲取一些用於文件訪問的元信息,這一過程一方面加重了Master的負擔,一方面增加了客戶端的請求的響應延遲。為了加速該過程,同時減小Master的負擔,可將元信息進行緩存,數據可根據業務特性緩存在本地記憶體或磁碟,也可緩存在遠端的cache系統上如淘寶的TFS可利用tair作為緩存(減小Master負擔、降低客戶端資源占用)。

 

維護緩存需考慮如何解決一致性問題及緩存替換演算法,一致性的維護可由客戶端也可由伺服器完成,一種方式是客戶端周期性的使cache失效或檢查cache有效性(需業務上能容忍),或由伺服器在元數據更新後通知客戶端使cache失效(需維護客戶端狀態)。使用得較多的替換演算法如LRU、隨機替換等。

其他

客戶端還可以根據需要支持一些擴展特性,如將數據進行加密保證數據的安全性、將數據進行壓縮後存儲降低存儲空間使用,或是在介面中封裝一些訪問統計行為,以支持系統對應用的行為進行監控和統計。



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • java中equal和==的區別: equal方法除非進行了重寫(比如String類和基本類型包裝類),否則都是進行對象引用的比較。而==除了比較基本類型時是比較值,其他情況均是比較引用地址。 java適配器模式? 將原來的實現介面所有方法變成了繼承實現了介面方法的抽象類(adapter),然後再實 ...
  • 公司應用項目在客戶部署時經常遇到此類問題,為避免實施部署時增加配置量,花了點時間找到了此問題的終極解決辦法(方案二、修改org.hibernate.hql.ast.HqlLexer的源代碼)。在此進行記錄本問題的分析解決方案。 一、問題現象描述: 1、異常信息: 'weblogic.kernel.D ...
  • 原文轉自:http://www.zccode.com/thread-724-1-1.html 該資源說明:看起來不錯的一套一元雲購CMS源碼,源碼包裡面帶了安卓和ios手機客戶端,手機客戶端需要自己反編譯。 這裡不做功能和其它更多的介紹,可以自己下載後慢慢測試瞭解。安裝說明:伺服器空間需要支持PHP ...
  • 問題的提出整個WR的ISE工程比較大,編譯時間很長,導致開發效率低。通過分析發現,ISE在綜合的時候大量的時間都花在了初始化DPRAM上。調研發現Xilinx提供了BMM文件和DATA2MEM工具,可以將軟核CPU的運行代碼在HDL綜合完後再與bit文件合併,這樣可以節約大量的編譯時間。但是在wr工 ...
  • Atitit.android jsbridge v1新特性 1. Java代碼調用js並傳參其實是通過WebView的loadUrl方法去調用的、只是參數url的寫法不一樣而已1 2. 三、JAVA和JS交互註意事項1 3. Js調用android java通過jsbridge2 4. JsBrid ...
  • 介紹 智能企業(intelligent enterprise)就是全面運用智能管理體系,實現企業管理中“機要素智能化高效整合併實現人機協調”的企業。信息管理中經常談到“人機協調”的問題.這裡所說的“人機協調含義有所不同。信息管理中的人機協調更多的是研究技術上的問題,這裡的人機協調強調的是管理問題,必... ...
  • 序言 這個AOP要從我們公司的一個事故說起,前段時間公司的系統突然在烏雲中出現,數據被泄露的一覽無餘,烏雲上顯示是SQL註入攻擊。呵,多麼貼近生活的一個露洞,可謂是人盡皆知啊。然而卻華麗麗的給拉我們一記耳光。 那麼問題既然來啦,我們.net組有40-50個項目之多吧,怎麼去一一補救這一過失呢?什麼又 ...
  • 需求:根據年級下拉框的變化使得科目下拉框綁定次年級下對應有的值 我們用三層架構的模式來實現 1.我們想和資料庫交互,我們首先得來先解決DAL資料庫交互層 01.獲得年級下拉框的數據 在GradeDAL類中 02.在業務邏輯層 03.在窗體UI層 在Load事件中載入年級下拉框 其中在使用 獲得年級下 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...