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

本地文件系統如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)。

主控服務器

?

l?命名空間的維護

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

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

?

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

?

l?數據服務器管理

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

?

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

l?服務調度

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

l?主備(主)容災

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

?

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

?

數據服務器

l?數據本地存儲

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

?

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

?

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

l?狀態維護

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

?

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

l?副本管理

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

?

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

l?服務模型

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

?

客戶端

l?接口

用戶最終通過文件系統提供的接口來存取數據,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,以降低系統的復雜性。

l?緩存

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

?

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

l?其他

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

?

總結

本文主要從典型分布式文件系統架構出發,討論了分布式文件系統的基本原理,工程實現時需要解決的問題、以及解決問題的基本方法,真正在系統工程實現時,要考慮的問題會更多。如有問題,歡迎拍磚。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535651.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535651.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535651.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

編寫第二個Spring程序——AOP實現

第二個Spring程序 AOP范例 1、新建maven工程 2、在pom.xml文件導入相關jar包 <!-- https://mvnrepository.com/artifact/org.springframework/spring-core --><dependency><groupId>org.springframework</groupId><artifactId>spring-core<…

linux高負載下徹底優化mysql數據庫

同時在線訪問量繼續增大 對于1G內存的服務器明顯感覺到吃力嚴重時甚至每天都會死機 或者時不時的服務器卡一下 這個問題曾經困擾了我半個多月MySQL使用是很具伸縮性的算法&#xff0c;因此你通常能用很少的內存運行或給MySQL更多的被存以得到更好的性能。 安裝好mysql后&#x…

Java注釋說明以及IDEA中的快捷鍵

一、單行注釋 說明&#xff1a;單行注釋 一般注釋少量的代碼或者說明內容 格式&#xff1a;//注釋的內容 IDEA中的快捷鍵&#xff1a;使用Ctrl /&#xff0c; 添加行注釋&#xff0c;再次使用&#xff0c;去掉行注釋 二、多行注釋 說明&#xff1a;多行注釋 一般注釋大量的…

redhat系統雙網卡綁定

Redhat Linux的網絡配置&#xff0c;基本上是通過修改幾個配置文件來實現的&#xff0c;雖然也可以用ifconfig來設置IP&#xff0c;用route來配置默認網關&#xff0c;用hostname來配置主機名&#xff0c;但是重啟后會丟失。 1.相關的配置文件: /ect/hosts 配置主機名和IP地址…

JDK源碼解析之java.util.Iterator和java.lang.Iterable

在Java中&#xff0c;我們可以對List集合進行如下幾種方式的遍歷&#xff1a;第一種就是普通的for循環&#xff0c;第二種為迭代器遍歷&#xff0c;第三種是for each循環。后面兩種方式涉及到Java中的iterator和iterable對象&#xff0c;接下來我們通過源碼來看看這兩個對象的區…

為了讓你的網頁能在更多的服務器上正常地顯示,還是加上“SET NAMES UTF8”吧

Repinted:http://blog.csdn.net/class1/archive/2006/12/30/1469298.aspx 為了讓你的網頁能在更多的服務器上正常地顯示&#xff0c;還是加上“SET NAMES UTF8”吧(可以根據你的喜歡選擇相應的編碼,如gb2312)&#xff0c;即使你現在沒有加上這句也能正常訪問。 先說MySQL的字…

WebLogic11g 安裝配置規范

目錄 1 文檔控制... 3 1.1 修改記錄... 3 1.2 分發者... 3 1.3 審閱記錄... 3 1.4 相關文檔... 3 2 安裝準備... 4 2.1 安裝前需要開發單位提供的信息... 4 2.2 本地磁盤空間配置規范... 4 2.3 版本要求規范... 4 2.4 weblogic部署配置規范... 5 2.4.1操作系統要求.…

JDK源碼解析之java.util.ListIterator

ListIterator是一個功能更加強大的迭代器接口, 它繼承于Iterator接口,只能用于各種List類型的訪問。可以通過調用listIterator()方法產生一個指向List開始處的ListIterator, 還可以調用listIterator(n)方法創建一個一開始就指向列表索引為n的元素處的ListIterator。 一、源碼解…

VsFTP出現500 OOPS: cannot change directory的解決辦法

cannot change directory:/home/*** ftp服務器連接失敗,錯誤提示:500 OOPS: cannot change directory:/home/*******500 OOPS: child died解決方法:在終端輸入命令&#xff1a;setsebool ftpd_disable_trans 1 service vsftpd restart就&#xff2f;&#xff2b;了&#xff01;…

Oracle的reman命令

list命令&#xff1a; list backupset summary 列出概要信息 list backupset by file list archivelog all 列出所有歸檔日志 list backupset tag 00列出標簽信息 list backupset 8 列出8號…

Ubuntu root賬號的使用

第一次安裝好Ubuntu后&#xff0c;root帳號不能用。在安裝期間創建的第一個用戶對系統有管理權&#xff0c;通過“sudo”能象root運行程序.使用時僅需它的普通用戶密碼。例如: sudo apt-get update  如果你希望像傳統 UNIX 樣式使用root帳號。你能通過輸入 sudo passwd root …

JDK源碼解析之Java.util.Collection

Collection是單例集合的頂層接口&#xff0c;它表示一組對象&#xff0c;這些對象也稱為Collection的元素&#xff0c;JDK 不提供此接口的任何直接實現&#xff0c;它提供更具體的子接口&#xff08;如Set和List&#xff09;實現 一、源碼解析 1、接口定義 public interface …

Vim 命令操作

vim命令操作命令模式dd 編輯模式 末行模式 1.地址定界&#xff1a; startpos,endpos #:特定的第#行&#xff0c;例如S即第5行;:當前行;$:最后一行; #,#:指定行范圃,左側起始行&#xff0…

JDK源碼解析之Java.util.Collections

java.util.Collections 是一個包裝類。它包含有各種有關集合操作的靜態多態方法。此類不能實例化&#xff0c;就像一個工具類,服務于Java的Collection框架。 一、源碼解析 1、不可實例化 private Collections() {}Collections是util包中一個不可實例化的類。 2、優化參數 pri…

ubuntu下安裝jdk

安裝1.5 sudo apt-get install sun-java5-jdk sudo update-alternatives --config java sudo update-alternatives --config javac 安裝1.6 sudo apt-get install sun-java6-jdk sudo update-alternatives --config java sudo update-alternatives --config javac 轉載:http:/…

使用validate驗證數據庫

驗證數據備份集是不是可以用來做恢復和數據文件是否損壞、壞塊 三種方式&#xff1a; 1.validate validate database ;validate tablespace users; validate datafile 1; validate archivelog all validate datafile 1 block 10; validate backupset 28; db…

JDK源碼解析之java.util.AbstractCollection

AbstractCollection類提供了collection的實現類應該具有的基本方法&#xff0c;具有一定的普適性&#xff0c;可以從大局上了解collection實現類的主要功能。 java.util.AbstractCollection這個類提供了對接口Collection骨骼級的實現。 一、源碼解析 1、iterator():返回一個迭…

溝通linux與windows的wine

據Netcraft網站調查&#xff0c;現在互聯網上的主機有75&#xff05;以上采用Linux作為操作系統。作為服務器操作系統&#xff0c;Linux已經站穩了腳步&#xff0c;可是在桌面 操作系統上&#xff0c;還是微軟的“瘟到死”一支獨秀。這倒不是說Linux不好&#xff0c;很大原因我…

備份spfil、控制文件等

delete backup&#xff1b; delete backupset delete noprompt backup backup keep forver database 永久保存恢復目錄中支持此命令 show parameter control 備份spfile backup spfile backup current contrlfile configure controlfile autoback …

日常問題——阿里云服務器ssh經常一段時間就斷掉解決辦法

#vim /etc/ssh/sshd_config 找到下面兩行 #ClientAliveInterval 0 #ClientAliveCountMax 3 去掉注釋&#xff0c;改成 ClientAliveInterval 30 ClientAliveCountMax 86400 這兩行的意思分別是 1、客戶端每隔多少秒向服務發送一個心跳數據 2、客戶端多少秒沒有相應&#…