FastDFS 分佈式文件系統基本原理

一、FastDFS介紹

FastDFS 是一個使用C編寫的開源的高性能分佈式文件系統(Distributed File System,簡稱DFS),由淘寶開發平臺部資深架構師餘慶開發。FastDFS孵化平臺(ChinaUnix)版塊地址: http://bbs.chinaunix.net/forum-240-1.html

FastDFS對文件進行管理,功能包括:文件存儲、文件同步、文件訪問(文件上傳、文件下載)等,解決了大容量
存儲和負載均衡的問題,特別適合以文件爲載體的在線服務,如相冊網站、視頻網站、電商網站等等。特別適合以中小文件(建議範圍:4KB < file_size <500MB)爲載體的在線服務。

FastDFS爲互聯網量身定製,充分考慮了冗餘備份、負載均衡、線性擴容等機制,並注重高可用、高性能等指標,使用FastDFS很容易搭建一套高性能的文件服務器集羣提供文件上傳、下載等服務。

二、架構原理分析

1.架構分析

FFastDFS系統中有如下三個角色:

①:Tracker Server:跟蹤服務器

  • 主要做調度工作,並對Storage Server起到負載均衡的作用;
  • 負責管理所有的Storage Server 和group,每個Storage在啓動後會連接Tracker,告知自己所屬group等信息,並保持週期性心跳。
  • Tracker Server可以有多臺,Tracker Server之間是相互平等的關係並且同事提供服務,Tracker Server不存在單點故障,Tracker Server採用輪詢方式工作,當請求的Server無法提供服務的時候,則會換另一個Tracker Server。

②Storage Server:存儲服務器

  • 主要提供存儲和備份服務;
  • 以group爲單位,不同的group之間相互獨立,每個group內可以有多臺storage server,數據互爲備份;
  • 採用分組存儲方式的好處是靈活、可控性較強,比如上傳文件的時候,可以由客戶端直接指定上傳到的group,也可以由Tracker進行調度選擇;
  • 一個分組存儲服務器的訪問壓力大的時候,可以在改組增加存儲服務器來擴充服務能力(縱向擴容),當系統容量不足是,可以增加組來擴充存儲容量(橫向擴容)。

③client:客戶端

  • 上傳和下載數據的服務器,即就是我們自己項目所部署在的服務器。

                                          FastDFS架構圖

2.存儲策略

爲了支持大容量存儲,存儲服務器使用分組(group)的組織方式,存儲系統是由一個或者多個group組成,group與group之間的文件是相互獨立的,所有的group文件容量的累加就是整個存儲系統中的文件容量。

一個group可以由一臺或者多臺存儲服務器組成,一個group可以由一臺或者多臺存儲服務器組成,一個group下的各個服務器中的文件都是相同的,同group中的各個服務器起到了冗餘備份和負載均衡的作用。

在group中增加服務器時,同步已有的文件是由系統自動完成,同步完成後,系統會將新的服務器切換到線上提供服務,當存儲空間不足時,動態添加group,給該group中增加一個或者多個服務器,具擴大了存儲容量(橫向擴容)。

3.Storage狀態收集

Storage Server 會通過配置連接到集羣中的所有Tracker Server,定時報告自己的狀態,包含磁盤剩餘空間、文件同步狀況、文件上傳下載次數等統計信息。

Storage的狀態如下:

FDFS_STORAGE_STATUS_INIT :初始化,尚未得到同步已有數據的源服務器
FDFS_STORAGE_STATUS_WAIT_SYNC :等待同步,已得到同步已有數據的源服務器
FDFS_STORAGE_STATUS_SYNCING :同步中
FDFS_STORAGE_STATUS_DELETED :已刪除,該服務器從本組中摘除(注:本狀態的功能尚未實現)
FDFS_STORAGE_STATUS_OFFLINE :離線
FDFS_STORAGE_STATUS_ONLINE :在線,尚不能提供服務
FDFS_STORAGE_STATUS_ACTIVE :在線,可以提供服務

4.文件上傳流程,圖解分析

 

1.Tracker Server 收集Storage Server的狀態信息

Storage Server定時向已知的Tracker Server(可以使多個)發送磁盤空間,文件同步狀況,文件上傳下載等統計信息。Storage Server會向連接整個集羣中的所有Tracker Server報告自己的狀態。

2.選擇Tracker Server

當集羣中不止一個Tracker Server時,由於每個Tracker之間的關係是完全對等的,客戶端在upload文件的時候可以任意選擇一個Tracker。

3.選擇存儲的group

當tracker接收到upload file的請求時,會爲該文件分配一個可以存儲該文件的group,支持如下選擇group的規則:

①Round Robin:在所有的group之間輪詢

②Specified group:指定某一個確定的group

③Load balance:剩餘存儲空間多的group優先

4.選擇Storage Server

當選定group後,tracker會在group內的選擇一個Storage Server給客戶端,支持如下選擇Storage的規則:

①Round Robin:在group內的所有Storage之間輪詢

②First Server ordered by ip :按照ip排序

③First Server ordered by priority :按照優先級排序,優先級可以再storage上面進行配置

5.選擇Storage path

當分配好storage server後,客戶端向storage發送寫文件的請求,storage將會爲文件分配一個數據存儲目錄,支持如下規則(在storage配置文件中可以通過配置storage_path*參數來設置,該參數可以設置多個,通過*來進行區別):

①Round Robin:多個存儲目錄之間輪詢

②剩餘存儲空間最多的優先

6.生成文件名

當文件存儲到某個子目錄後,即認爲該文件存儲成功,接下來會爲該文件生成一個文件名,文件名由group、存儲目錄、兩級子目錄、fileid、文件後綴名(由客戶端指定,主要用於區分文件類型)拼接而成。

7.選擇兩級目錄

選定存儲目錄後,storage會爲文件分配一個fileid,每個存儲目錄下有兩級256*256的子目錄,storage會按照文件名稱進行兩次hash。路由到其中一個子目錄,然後將文件以fileid爲文件名存儲到該子目錄下。

8.生成fileid

選定存儲目錄之後,storage會爲文件生一個Fileid,由storage server ip、文件創建時間、文件大小、文件crc32和一個隨機數拼接而成,然後將這個二進制串進行base64編碼,轉換爲可打印的字符串。

 

5.同group的storage間文件同步

寫文件時,當客戶端將文件上傳至group內的一個storage server就認爲寫文件成功,storage寫文件後,會由後臺線程將文件同步至group內其他的storage server。

每個Storage寫文件後,同時會寫一份binlog,binlog中不包含文件數據,只包含文件名等元信息,這份binlog用戶後臺同步,Storage會記錄向group中其他Storage同步的進度,以便重啓後能夠接上次的進度繼續同步;進度會以時間戳的方式進行記錄,所以儘量保證集羣內的多有服務器的時間保持同步。

同步規則如下

1.只在本組的Storage Server之間進行同步;

2.源頭數據才需要同步,備份數據不需要再次同步,否則就構成環路了;

3.當新增一臺Storage Server 時,由已有的一臺Storage Server將已有的所有數據(包含源頭數據和備份數據)同步給新增的服務器。

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

6.文件下載

 

客戶端上傳文件成功後,會獲得一個Storage生成的文件名,在客戶端根據該文件名就可以訪問到該文件

1.Tracker Server 收集Storage Server的狀態信息

Storage Server定時向已知的Tracker Server(可以使多個)發送磁盤空間,文件同步狀況,文件上傳下載等統計信息。Storage Server會向連接整個集羣中的所有Tracker Server報告自己的狀態。

2.選擇Tracker Server

與上傳文件時一樣,在下載文件的時候客戶端也可以選擇任意的Tracker Server

3.選擇Storage Server

客戶端發送下載請求給某個Tracker,必須帶上文件名信息,Tracker從文件名中解析出文件所在的group、路徑信息、文件大小、創建時間、源Storage Server ip等信息,然後爲該請求選擇一個Storage用來服務讀請求。

 

7.新增Storage Server 分析

當group中新增一臺Storage Server C的時候,由系統自動完成已有數據的同步。

1. Storage Server C連接Tracker Server,Tracker Server 將Storage Server C的狀態設置爲 FDFS_STORAGE_STATUS_INIT。Storage Server C詢問追加同步的源服務器和追加同步截止時間點,如果該group中只有Storage Server C或者該group中成功上傳的文件數目爲0,則沒有數據同步,Storage Server就可以提供在線服務,此時Tracker會將其狀態設置爲FDFS_STORAGE_STATUS_ONLINE,否則Tracker會將其狀態設置爲FDFS_STORAGE_STATUS_WAIT_SYNC,進入第二步處理。

2. 假設Tracker Server分配想Storage Server C同步數據的源Storage Server爲B,同組的Tracker Server和Storage Server通訊得知新增了Storage Server C,將會啓動同步線程,並向Tracker Server詢問Storage Server C追加至同步的源服務器和截止時間點。Storage Server B將把截止時間之前的的所有數據同步給Storage Server C,而其餘的Storage Server從截止時間之後進行正常同步,只把源頭數據同步給Storage Server C 。到了截止時間之後,Storage Server B會將對Storage Server C的同步由追加同步改爲正常同步,只同步源頭數據;

3.Storage Server B向Storage Server C同步完所有數據後,暫時沒有數據同步時,Storage Server B請求Tracker Server將Storage Server C的狀態設置爲FDFS_STORAGE_STATUS_ONLINE;

4.當Storage Server C向 Tracker Server發起heart beat時,Tracker Server將其狀態改爲FDFS_STORAGE_STATUS_ACTIVE。

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章