fastdfs
FastDFS是一個開源的輕量級分布式文件系統,它對文件進行管理,功能包括:文件存儲、文件同步、文件訪問(文件上傳、文件下載)等,解決了大容量存儲和負載均衡的問題。特別適合以文件為載體的在線服務,如相冊網站、視頻網站等等。
FastDFS服務端有兩個角色:跟蹤器(tracker)和存儲節點(storage)。跟蹤器主要做調度工作,在訪問上起負載均衡的作用。
存儲節 點存儲文件,完成文件管理的所有功能:存儲、同步和提供存取接口,FastDFS同時對文件的metadata進行管理。所謂文件的meta data就是文件的相關屬性,以鍵值對(key value pair)方式表示,如:width=1024,其中的key為width,value為1024。文件metadata是文件屬性列表,可以包含多個鍵值對。
跟蹤器和存儲節點都可以由一臺或多臺伺服器構成。跟蹤器和存儲節點中的伺服器均可以隨時增加或下線而不會影響線上服務。其中跟蹤器中的所有伺服器都是對等的,可以根據伺服器的壓力情況隨時增加或減少。
為了支持大容量,存儲節點(伺服器)採用了分卷(或分組)的組織方式。存儲系統由一個或多個卷組成,卷與卷之間的文件是相互獨立的,所有卷的文件容量累加就是整個存儲系統中的文件容量。一個卷可以由一臺或多臺存儲伺服器組成,一個卷下的存儲伺服器中的文件都是相同的,卷中的多臺存儲伺服器起到了冗餘備份和負載均衡的作用。
在卷中增加伺服器時,同步已有的文件由系統自動完成,同步完成後,系統自動將新增伺服器切換到線上提供服務。
當存儲空間不足或即將耗盡時,可以動態添加卷。只需要增加一臺或多臺伺服器,並將它們配置為一個新的卷,這樣就擴大了存儲系統的容量。
FastDFS中的文件標識分為兩個部分:卷名和文件名,二者缺一不可。
FastDFS file upload
上傳文件交互過程:
1. client詢問tracker上傳到的storage,不需要附加參數;
2. tracker返回一臺可用的storage;
3. client直接和storage通訊完成文件上傳。
FastDFS file download
下載文件交互過程:
1. client詢問tracker下載文件的storage,參數為文件標識(卷名和文件名);
2. tracker返回一臺可用的storage;
3. client直接和storage通訊完成文件下載。
group0/M00/00/02/Cs8b8lFJIIyAH841AAAbpQt7xVI4715674
組名:group0 磁碟: M00 目錄:00/02 文件名:Cs8b8lFJIIyAH841AAAbpQt7xVI4715674
文件名包含的信息: 採用Base64編碼, 包含的欄位包括 : 源storage server Ip 地址 文件創建時間 文件大小 文件CRC32效驗碼 隨機數
需要說明的是,client為使用FastDFS服務的調用方,client也應該是一臺伺服器,它對tracker和storage的調用均為伺服器間的調用。
FastDFS 同步機制說明:
tracker server會在內存中保存storage分組及各個組下的storage server,並將連接過自己的storage server及其分組保存到文件中,以便下次重啟服務時能直接從本地磁碟中獲得storage相關信息。storage server會在內存中記錄本組的所有伺服器,並將伺服器信息記錄到文件中。tracker server和storage server之間相互同步storage server列表:
1. 如果一個組內增加了新的storage
server或者storage server的狀態發生了改變,tracker server都會將storage server列表同步給該組內的所有storage server。以新增storage server為例,因為新加入的storage
server主動連接tracker server,tracker server發現有新的storage server加入,就會將該組內所有的storage server返回給新加入的storage server,並重新將該組的storage server列表返回給該組內的其他storage server;
2. 如果新增加一臺tracker server,storage server連接該tracker server,發現該tracker server返回的本組storage server列表比本機記錄的要少,就會將該tracker server上沒有的storage server同步給該tracker server。同一組內的storage server之間是對等的,文件上傳、刪除等操作可以在任意一臺storage server上進行。文件同步只在同組內的storage server之間進行,採用push方式,即源伺服器同步給目標伺服器。以文件上傳為例,假設一個組內有3臺storage server A、B和C,文件F上傳到伺服器B,由B將文件F同步到其餘的兩臺伺服器A和C。我們不妨把文件F上傳到伺服器B的操作為源頭操作,在伺服器B上的F文件為源頭數據;文件F被同步到伺服器A和C的操作為備份操作,在A和C上的F文件為備份數據。同步規則總結如下:
1. 只在本組內的storage server之間進行同步;
2. 源頭數據才需要同步,備份數據不需要再次同步,否則就構成環路了;
3. 上述第二條規則有個例外,就是新增加一臺storage server時,由已有的一臺storage server將已有的所有數據(包括源頭數據和備份數據)同步給該新增伺服器。storage server有7個狀態,如下:
# 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 :在線,可以提供服務
當storage
server的狀態為FDFS_STORAGE_STATUS_ONLINE時,當該storage server向tracker server發起一次heart beat時,tracker server將其狀態更改為FDFS_STORAGE_STATUS_ACTIVE。
組內新增加一臺storage server A時,由系統自動完成已有數據同步,處理邏輯如下:
1. storage server A連接tracker server,tracker server將storage server A的狀態設置為FDFS_STORAGE_STATUS_INIT。storage server A詢問追加同步的源伺服器和追加同步截至時間點,如果該組內只有storage server A或該組內已成功上傳的文件數為0,則沒有數據需要同步,storage server A就可以提供在線服務,此時tracker將其狀態設置為FDFS_STORAGE_STATUS_ONLINE,否則tracker
server將其狀態設置為FDFS_STORAGE_STATUS_WAIT_SYNC,進入第二步的處理;
2. 假設tracker
server分配向storage server A同步已有數據的源storage server為B。同組的storage server和tracker server通訊得知新增了storage server A,將啟動同步線程,並向tracker server詢問向storage server A追加同步的源伺服器和截至時間點。storage server B將把截至時間點之前的所有數據同步給storage server A;而其餘的storage server從截至時間點之後進行正常同步,只把源頭數據同步給storage server A。到了截至時間點之後,storage server B對storage server A的同步將由追加同步切換為正常同步,只同步源頭數據;
3. storage server
B向storage server A同步完所有數據,暫時沒有數據要同步時,storage server B請求tracker server將storage server A的狀態設置為FDFS_STORAGE_STATUS_ONLINE;
4 當storage server A向tracker server發起heart beat時,tracker server將其狀態更改為FDFS_STORAGE_STATUS_ACTIVE。
FastDFS原理
存儲節點採用了分組(group)的方式。存儲系統由一個或多個group組成,group與group之間的文件是相互獨立的,所有group的文件容量累加就是整個存儲系統中的文件容量。一個group可以由一臺或多臺存儲伺服器組成,一個group下的存儲伺服器中的文件都是相同的,group中的多臺存儲伺服器起到了冗餘備份和負載均衡的作用(一個組的存儲容量為該組內存儲伺服器容量最小的那個,不同組的Storage server之間不會相互通信,同組內的Storage server之間會相互連接進行文件同步)。
在group中增加伺服器時,同步已有的文件由系統自動完成,同步完成後,系統自動將新增伺服器切換到線上提供服務。
當存儲空間不足或即將耗盡時,可以動態添加group。只需要增加一臺或多臺伺服器,並將它們配置為一個新的group,這樣就擴大了存儲系統的容量。
FastDFS只有兩個角色:Tracker server和Storage server。Tracker server作為中心結點,其主要作用是負載均衡和調度。Tracker server在內存中記錄分組和Storage server的狀態等信息,不記錄文件索引信息,佔用的內存量很少。另外,客戶端(應用)和Storage server訪問Tracker server時,Tracker server掃描內存中的分組和Storage server信息,然後給出應答。由此可以看出Tracker server非常輕量化,不會成為系統瓶頸。
FastDFS中的Storage server在其他文件系統中通常稱作Trunk server或Data server。Storage server直接利用OS的文件系統存儲文件。FastDFS不會對文件進行分塊存儲,客戶端上傳的文件和Storage server上的文件一一對應(FastDFS中的文件標識分為兩個部分:組名和文件名,二者缺一不可)。