1. 程式人生 > >(轉) 分布式文件存儲FastDFS(一)初識FastDFS

(轉) 分布式文件存儲FastDFS(一)初識FastDFS

article targe 訪問 dfs 信息 啟動 時間戳 load 第一次啟動

http://blog.csdn.net/xingjiarong/article/details/50559849

一、FastDFS簡介

FastDFS是一款開源的、分布式文件系統(Distributed File System),由淘寶開發平臺部資深架構師余慶開發。作為一個分布式文件系統,它對文件進行管理,功能包括:文件存儲、文件同步、文件訪問(文件上傳、文件下載)等,解決了大容量存儲和負載均衡的問題,特別適合中小文件(建議範圍:4KB < file_size <500MB),對以文件為載體的在線服務,如相冊網站、視頻網站等等具有顯著的效果。

二、FastDFS架構

FastDFS由客戶端,跟蹤服務器和存儲服務器構成,基本架構如下圖所示。

技術分享
Storage Server

Storage server(後簡稱storage)以組(卷,group或volume)為單位組織,一個group內包含多臺storage機器,數據互為備份,存儲空間以group內容量最小的storage為準,所以建議group內的多個storage盡量配置相同,以免造成存儲空間的浪費。

以group為單位組織存儲能方便的進行應用隔離、負載均衡、副本數定制(group內storage server數量即為該group的副本數),比如將不同應用數據存到不同的group就能隔離應用數據,同時還可根據應用的訪問特性來將應用分配到不同的group來做負載均衡;缺點是group的容量受單機存儲容量的限制,同時當group內有機器壞掉時,數據恢復只能依賴group內地其他機器,使得恢復時間會很長。

group內每個storage的存儲依賴於本地文件系統,storage可配置多個數據存儲目錄,比如有10塊磁盤,分別掛載在/data/disk1-/data/disk10,則可將這10個目錄都配置為storage的數據存儲目錄。

storage接受到寫文件請求時,會根據配置好的規則(後面會介紹),選擇其中一個存儲目錄來存儲文件。為了避免單個目錄下的文件數太多,在storage第一次啟動時,會在每個數據存儲目錄裏創建2級子目錄,每級256個,總共65536個文件,新寫的文件會以hash的方式被路由到其中某個子目錄下,然後將文件數據直接作為一個本地文件存儲到該目錄中。

Tracker Server

Tracker是FastDFS的協調者,負責管理所有的storage server和group,每個storage在啟動後會連接Tracker,告知自己所屬的group等信息,並保持周期性的心跳,tracker根據storage的心跳信息,建立group==>[storage serverlist]的映射表。

Tracker需要管理的元信息很少,會全部存儲在內存中;另外tracker上的元信息都是由storage匯報的信息生成的,本身不需要持久化任何數據,這樣使得tracker非常容易擴展,直接增加tracker機器即可擴展為tracker cluster來服務,cluster裏每個tracker之間是完全對等的,所有的tracker都接受stroage的心跳信息,生成元數據信息來提供讀寫服務。

Client
客戶端,作為業務請求的發起方,通過專有接口,使用TCP/IP協議與跟蹤器服務器或存儲節點進行數據交互。

三、FastDFS的存儲策略

為了支持大容量,存儲節點(服務器)采用了分卷(或分組)的組織方式。存儲系統由一個或多個卷組成,卷與卷之間的文件是相互獨立的,所有卷的文件容量累加就是整個存儲系統中的文件容量。一個卷可以由一臺或多臺存儲服務器組成,一個卷下的存儲服務器中的文件都是相同的,卷中的多臺存儲服務器起到了冗余備份和負載均衡的作用。

在卷中增加服務器時,同步已有的文件由系統自動完成,同步完成後,系統自動將新增服務器切換到線上提供服務。

當存儲空間不足或即將耗盡時,可以動態添加卷。只需要增加一臺或多臺服務器,並將它們配置為一個新的卷,這樣就擴大了存儲系統的容量。

四、FastDFS的上傳過程

FastDFS向使用者提供基本文件訪問接口,比如upload、download、append、delete等,以客戶端庫的方式提供給用戶使用。

技術分享

根據前邊的講解,我們知道Storage Server會定期的向Tracker Server發送自己的存儲信息。當Tracker Server Cluster中的Tracker Server不止一個時,各個Tracker之間的關系是對等的,所以客戶端上傳時可以選擇任意一個Tracker。

當Tracker收到客戶端上傳文件的請求時,會為該文件分配一個可以存儲文件的group,當選定了group後就要決定給客戶端分配group中的哪一個storage server。當分配好storage server後,客戶端向storage發送寫文件請求,storage將會為文件分配一個數據存儲目錄。然後為文件分配一個fileid,最後根據以上的信息生成文件名存儲文件。文件名的格式如下:
技術分享

五、FastDFS的文件同步

寫文件時,客戶端將文件寫至group內一個storage server即認為寫文件成功,storage server寫完文件後,會由後臺線程將文件同步至同group內其他的storage server。

每個storage寫文件後,同時會寫一份binlog,binlog裏不包含文件數據,只包含文件名等元信息,這份binlog用於後臺同步,storage會記錄向group內其他storage同步的進度,以便重啟後能接上次的進度繼續同步;進度以時間戳的方式進行記錄,所以最好能保證集群內所有server的時鐘保持同步。

storage的同步進度會作為元數據的一部分匯報到tracker上,tracke在選擇讀storage的時候會以同步進度作為參考。

比如一個group內有A、B、C三個storage server,A向C同步到進度為T1 (T1以前寫的文件都已經同步到B上了),B向C同步到時間戳為T2(T2 > T1),tracker接收到這些同步進度信息時,就會進行整理,將最小的那個做為C的同步時間戳,本例中T1即為C的同步時間戳為T1(即所有T1以前寫的數據都已經同步到C上了);同理,根據上述規則,tracker會為A、B生成一個同步時間戳。

六、FastDFS的文件下載

客戶端uploadfile成功後,會拿到一個storage生成的文件名,接下來客戶端根據這個文件名即可訪問到該文件。

技術分享

跟upload file一樣,在downloadfile時客戶端可以選擇任意tracker server。tracker發送download請求給某個tracker,必須帶上文件名信息,tracke從文件名中解析出文件的group、大小、創建時間等信息,然後為該請求選擇一個storage用來服務讀請求。

本文是在閱讀某大神的文章時進行的整理和摘錄,同時加入了自己的一些思考,下面附上大神的鏈接:http://blog.yunnotes.net/index.php/fastdfs_design/

(轉) 分布式文件存儲FastDFS(一)初識FastDFS