分布式檔案儲存 FastDFS簡單使用與原理分析

2021-10-01 10:32:50 字數 4512 閱讀 6621

fastdfs 服務端有兩個角色:tracker 與 storage,其中 tracker 主要做排程工作,有著負載均衡作用,storage 負責檔案訪問、同步等操作。

fastdfs 系統結構:

客戶端訪問 fastdfs 分布式儲存,一般為後端應用。

2.2、tracker

tracker 在 fastdfs 集群中有兩大作用:

client 訪問 storage 服務之前,必須先訪問 tracker,動態獲取到 storage 服務的連線資訊,有著負載均衡的作用。

2.3、storage

storage 是資料儲存伺服器,檔案和 meta data 都儲存在 storage 伺服器中。 有以下特點:

檔案上傳的原理如下圖:

client 詢問 tracker 可以上傳到哪個 storage。

tracker 返回一台可用的 storage 連線資訊。

client 直接與 storage 通訊,完成檔案上傳。

storage 儲存檔案以後,返回 client 檔案標識(組名、檔名)。

client 詢問 tracker 下文檔案的 storage,引數為檔案標識(組名、檔名)。

tracker 返回一台可用的 storage。

6.1、trackerserver

$


|__data


| |__storage_groups.dat:儲存分組資訊


| |__storage_servers.dat:儲存伺服器列表


|__logs


|__trackerd.log:tracker server日誌檔案

6.2、storageserver
$


|__data


| |__.data_init_flag:當前storage server 初始化資訊


| |__storage_stat.dat:當前storage server統計資訊


| | |__binlog.index:當前的binlog檔案索引號


| | |__binlog.###:存放更新操作記錄(日誌)


| | |__$_$.mark:存放同步的完成情況


| |


| |__一級目錄:256個存放資料檔案的目錄,如:00, 1f


| |__二級目錄:256個存放資料檔案的目錄


|__logs


|__storaged.log:storage server日誌檔案

7.1、 通訊協議介紹

fastdfs 服務端與客戶端通訊時候採用的是自定義的通訊協議,如下圖所示:

協議包由兩部分組成:header 和 body

body 資料報格式取決於具體的命令,body 可以為空。

7.2、命令**和通訊狀態**

7.2.1、tracker 管理命令**

名稱命令

刪除 storage

93102

獲取更新節點 query_update

103不按組獲取儲存節點

101按組獲取儲存節點

104獲取組列表

91獲取儲存節點列表92

7.2.2、 store 檔案上傳命令**

名稱命令

說明檔案上傳

11一般的檔案上傳,上傳後為主檔案

上傳附屬檔案

21「上傳從檔案檔案,比如主檔案為 ***.jpg,從檔案(縮圖)為 ***-150_150.jpg」

刪除檔案

12刪除檔案

設定檔案元資料

13上傳檔案建立日期,標籤等

14獲取檔案元資料

15查詢檔案資訊

22查詢檔案資訊

建立支援斷點續傳的檔案

23建立乙個支援斷點續傳的檔案

斷點續傳

24上傳可斷點上傳的檔案,如將大檔案切為幾份,分開上傳

檔案修改

34修改支援斷點上傳的檔案

清除檔案

36擷取(清除)支援斷點上傳的檔案

7.2.3、報文通訊狀態**

名稱**

客戶端關閉連線命令

82連線狀態檢查命令

111服務端正確返回報文

100這個庫從 17 年 6 月 5 號之後就停止更新了,最近又開始更新**了,看樣子要維護了啊。

簡單的對客戶端進行了連線池的封裝,方便使用。

clawhub/fastdfs-pool

以下為核心**:

1.1、 初始化連線池

/**

* build fast dfs conn pool.

** @return the fast dfs conn pool

*/public fastdfsconnpool build() catch (ioexception | myexception e)

// 往執行緒池中新增預設大小的執行緒

trackerserver trackerserver;

for (int i = 0; i < minpoolsize; i )

}// 註冊心跳

new heartbeat(this).beat();

return this;

}

1.2、 客戶端執行請求
/**

* 執行方式

** @param the type parameter

* @param invoke the invoke

* @return the t

*/public t processfdfs(callbackinvoke) catch (exception e)

}

1.3、 心跳
/**

* 心跳任務

*/private class heartbeattask implements runnable else

} catch (exception e) }}

}

1.4、 使用方式
//初始化連線池

fastdfsconnpool fastdfsconnpool = new fastdfsconnpool()

.conffilename("./config/fdfs_client.conf")

.maxpoolsize(8)

.minpoolsize(1)

.reconnnum(2)

.waittimes(2).build();

//使用客戶端

fastdfsclient client = new fastdfsclient(fastdfsconnpool);

//上傳 ilename 檔案全路徑 extname 副檔名,不包含(.) metas 檔案擴充套件資訊

string parts = client.processfdfs(storageclient -> storageclient.upload_file1("filename", "extname", new namevaluepair[0]));

byte bytes = client.processfdfs(storageclient -> storageclient.download_file1("fileid"));

//刪除 -1失敗,0成功

int result = client.processfdfs(storageclient -> storageclient.delete_file1("fileid"));

//獲取遠端伺服器檔案資源資訊 groupname 檔案組名 如:group1 remotefilename m00/00/00/wkgrsvjtwpsaxgwkaaaweeazrjw471.jpg

fileinfo fileinfo = client.processfdfs(storageclient -> storageclient.get_file_info("groupname", "remotefilename"));

fastdfs v5.12 分布式檔案系統介紹

tobato/fastdfs_client 的 wiki

分布式檔案儲存 FastDFS

7 fastdfs 和其他檔案儲存的簡單對比 寫操作 客戶端先是訪問tracker伺服器,由tracker伺服器幫我們尋找要寫入的卷 volume 一對主從備份為乙個卷,裡面可以有多台伺服器 然後返回可操作的storage server,這時客戶端訪問返回的storage server 進行寫操作 ...

FastDFS分布式檔案儲存

儲存能力是提供給上層業務系統以實現檔案訪問服務,這個儲存能力為xdfs,即可擴充套件的分布式檔案系統,實現的原理是封裝了第三方的分布式儲存系統實現的。目前封裝的第三方分布式系統包括fastdfs hadoop的hdfs,所提供的儲存介面如下 1 檔案上傳 2 檔案斷點上傳 5 檔案刪除 6 獲取檔案...

FastDFS分布式檔案儲存系統

負載均衡和排程,通過tracker server 在文上傳的時候可以根據一些策略找到storage server提供檔案上傳服務,可以將tracker 稱為追蹤伺服器或排程伺服器 檔案儲存,客戶端上傳的檔案最終儲存在storage 伺服器,storage server沒有實現自己的檔案系統而是利用作...