1. 程式人生 > >FastDFS 分散式檔案系統詳解

FastDFS 分散式檔案系統詳解

## 什麼是檔案系統 ![](https://mrhelloworld.com/resources/articles/fastdfs/20180810094347_11565.jpg " ")   檔案系統是作業系統用於在磁碟或分割槽上組織檔案的方法和資料結構。磁碟空間是什麼樣的我們並不清楚,但檔案系統可以給我們呈現一個非常清晰的表象,我們可以建立、刪除、修改和複製這些檔案,而實現這些功能的軟體就是檔案系統。作業系統中負責**管理和儲存檔案資訊的軟體被稱為檔案管理系統**,簡稱檔案系統。   檔案系統是作業系統的一個重要組成部分,通過對作業系統所管理的儲存空間的抽象,向用戶提供統一的、物件化的訪問介面,遮蔽對物理裝置的直接操作和資源管理。也就是說,**檔案系統解決了普通使用者使用磁碟儲存資料的問題**。    ## 檔案系統的發展史      根據計算環境和所提供功能的不同,檔案系統可劃分為以下幾種。    ### 單機檔案系統      **特點**:用於作業系統和應用程式的本地儲存。   **缺點**:資料無法在多臺機器之間共享。   **代表**:EXT2、EXT3、EXT4、NTFS、FAT、FAT32、XFS、JFS 等等。 ![](https://mrhelloworld.com/resources/articles/fastdfs/image-20200926091104679.png " ")    ### 網路檔案系統      **特點**:基於現有乙太網架構,實現不同伺服器之間傳統檔案系統的資料共享。   **缺點**:兩臺伺服器不能同時訪問修改,效能有限。   **代表**:NFS、CIFS 等等,比如下圖 Windows 主機之間進行網路檔案共享就是通過微軟公司自己的 CIFS 服務實現的。 ![](https://mrhelloworld.com/resources/articles/fastdfs/image-20200926091543122.png " ")    ### 分散式檔案系統      資料量越來越多,在一個作業系統管轄的範圍存不下了,那麼就分配到更多的作業系統管理的磁碟中,但是不方便管理和維護,因此迫切需要一種系統來管理多臺機器上的檔案,**這就是分散式檔案管理系統**。   分散式檔案系統(Distributed File System)是一種允許檔案通過網路在多臺主機上共享的檔案系統,可以讓多機器上的多使用者進行檔案分享和儲存。在這樣的檔案系統中,客戶端並非直接訪問底層的資料儲存區塊,而是通過網路,以特定的通訊協議和伺服器溝通。DFS 為分佈在網路上任意位置的資源提供一個邏輯上的樹形檔案系統結構,讓使用者訪問分佈在網路上的共享檔案更加簡便。所有高層次的檔案系統都是以低層次的傳統檔案系統為基礎,實現了更高階的功能。   **特點**:在傳統檔案系統上,通過額外模組實現資料跨伺服器分佈,並且自身整合 RAID 保護功能,可以保證多臺伺服器同時訪問、修改同一個檔案系統。效能優越,擴充套件性強,可靠性高。   **缺點**:部分型別存在單點故障風險。   **代表**:HDFS(ASF)、MogileFS(LiveJournal)、FastDFS(餘慶)、Lustre(Oracle)、GlusterFS(RedHat)等等。 ![](https://mrhelloworld.com/resources/articles/fastdfs/hdfsarchitecture.png " ") #### 通用型      通用分散式檔案系統和傳統的本地檔案系統(如 EXT4、NTFS 等)相對應。典型代表:Lustre、MooseFS。   **優點**:傳統檔案系統的操作方式,對開發者門檻較低。   **缺點**:系統複雜性較高,需要支援若干標準的檔案操作,如:目錄結構、檔案讀寫許可權、檔案鎖等。系統整體效能有所降低,因為要支援 POSIX 標準(可移植作業系統介面 Portable Operating System Interface of UNIX)。 > POSIX 全稱:可移植作業系統介面。當 Unix 誕生之後,各個廠商都實現了自己的 Unix 系統,導致介面不統一,基於不同的作業系統開發變得極其混亂,為了解決這一問題,便有了 POSIX 標準。 > > 總結:POSIX 標準的誕生就是為了統一作業系統的介面,方便開發者開發應用程式,寫出可移植的程式碼程式。基於 POSIX 標準的庫函式都是可以在此標準的作業系統平臺上移植。    #### 專用型      專用分散式檔案系統基於谷歌檔案系統論文(Google File System)的設計思想而來,檔案上傳後不能修改。使用專有 API 對檔案進行訪問,也可稱為分散式檔案儲存服務。典型代表:HDFS、MogileFS、FastDFS。   **優點**:系統複雜性較低,不需要支援若干標準的檔案操作,如:目錄結構、檔案讀寫許可權、檔案鎖等。系統整體效能較高,因為無需支援 POSIX 標準,系統更加高效。   **缺點**:採用專有 API 對檔案進行訪問,對開發者門檻較高,一般都是**直接封裝成工具類**進行使用。    ## 檔案伺服器的發展史      隨著網際網路圖片、視訊時代的到來,對檔案的處理成為各個業務系統面臨的巨大挑戰,亟需搭建特有的檔案伺服器解決檔案共享的問題。    ### 本地檔案伺服器      **特點**:本地檔案伺服器是指**檔案資料直接儲存在本地節點**中。比如直接在專案目錄下建立資料夾存放專案檔案資源,如果按不同型別再細分,可以在專案目錄下繼續建立不同的子目錄用於區分。   **優點**:簡單便捷,專案可以直接引用,訪問方便。   **缺點**:檔案與程式碼混合儲存不便於管理,隨著檔案的增多影響專案釋出上線週期。    ### 獨立檔案伺服器      **特點**:搭建一臺獨立的伺服器用於檔案儲存使用,專案上傳檔案時,先通過 ftp 或者 ssh 將檔案上傳至伺服器某個目錄下,再通過 Ngnix 或者 Apache Http Server 反向代理此目錄,返回一個獨立域名的檔案 URL 地址,前端通過這個 URL 地址即可直接訪問檔案。   **優點**:獨立儲存,可以方便擴容、容災和資料遷移。方便做圖片訪問請求的負載均衡,方便應用各種快取策略(HTTP Header、Proxy Cache 等),也更加方便遷移到 CDN。而且圖片訪問是很消耗伺服器資源的(因為會涉及到作業系統的上下文切換和磁碟 I/O 操作),分離出來以後,Web/App 伺服器可以更專注發揮動態處理的能力。   **缺點**:單機存在效能瓶頸,容災、垂直擴充套件性差。    ### 分散式檔案伺服器      **特點**:分散式檔案系統一般包括**訪問的仲裁**,**檔案的儲存**,**檔案的容災**三大塊。仲裁模組相當於檔案伺服器的大腦,根據一定的演算法來決定檔案儲存的位置。檔案儲存模組負責儲存檔案。容災模組負責檔案資料的相互備份。   **優點**:彈性伸縮,效能優越,擴充套件性強,可靠性高。   **缺點**:系統複雜度稍高,需要更多伺服器。    ## FastDFS 簡介      FastDFS 就是我們上述所說的**專用分散式檔案系統**,接下來我們就詳細瞭解它的核心概念,架構體系及環境的搭建與使用。   FastDFS 是基於 C 語言開發的,是一個輕量級開源的高效能分散式檔案系統。主要功能有:檔案儲存、檔案同步、檔案訪問(檔案上傳/下載),解決了大容量的檔案儲存和高併發訪問的問題,檔案存取時實現了負載均衡。FastDFS 特別適合中大型網站以檔案為載體的線上服務,適合儲存 `4KB ~ 500MB` 之間的小檔案,如照片共享網站、視訊共享網站(圖片、文件、音訊、視訊等等)。   FastDFS 是一款國產開源軟體,作者餘慶,專案開源地址 Github:https://github.com/happyfish100/fastdfs 官方論壇:http://bbs.chinaunix.net/forum-240-1.html    ## FastDFS 架構    ![](https://mrhelloworld.com/resources/articles/fastdfs/clip_image002.jpg " ")    ### Client      **客戶端**,實現檔案上傳下載的伺服器,就是我們自己的專案所部署在的伺服器。通過專有介面,使用 TCP/IP 協議與跟蹤伺服器或儲存伺服器進行資料互動。FastDFS 向使用者提供基本檔案訪問介面,比如 upload、download、append、delete 等,以客戶端庫的方式提供給使用者使用。    ### Tracker Server      **跟蹤伺服器**,負責檔案訪問的排程和負載均衡,負責管理所有的 Storage Server 和 group 組/卷。    ### Storage Server      **儲存伺服器**,負責檔案儲存,檔案同步/備份,提供檔案訪問介面,檔案元資料管理。以 group 為單位,每個 group 內可以有多臺 Storage Server,資料互為備份,達到容災的目的。每個 Storage 在啟動以後會主動連線 Tracker,告知自己所屬 group 等儲存相關資訊,並保持週期性心跳。    ### Group      **組**, 也可稱為 Volume 卷。同組內伺服器上的檔案是完全相同的,同一組內的 Storage Server 之間是對等的,檔案上傳、刪除等操作可以在任意一臺 Storage Server 上進行。    ### Metadata      檔案系統中儲存的資料分為**資料**和**元資料**兩部分,資料是指檔案中的實際資料,即檔案的實際內容;而元資料是用來描述一個檔案特徵的系統資料,諸如訪問許可權、檔案擁有者以及檔案資料塊的分佈資訊等等。如果檔案是一張圖片,元資料就是圖片的寬,高等等。    ## FastDFS 儲存策略      為了支援大容量儲存,Storage 儲存伺服器採用了分組(或分卷)的方式。儲存系統由一個或多個組組成,組與組之間的檔案是相互獨立的,所有組的檔案容量累加就是整個儲存系統中的檔案容量。一個組可以由一臺或多臺儲存伺服器組成,一個組下的儲存伺服器中的檔案都是相同的,組中的多臺儲存伺服器起到了冗餘備份和負載均衡的作用。   當組中增加了新的伺服器時,系統會自動同步已有的檔案,同步完成後,系統自動將新增的伺服器切換至線上提供服務。   當儲存空間不足時,可以動態新增組,只需要增加一臺或多臺伺服器,並將它們配置為一個新的組,即可擴大儲存系統的容量。當你的某個應用或者模組(對應的 group)的併發過高的時候,可以直接在 group 中增加若干個 Storage 來實現負載均衡。   為了避免單個目錄下的檔案數太多,當 Storage 第一次啟動時,會在每個資料儲存目錄中建立 2 級子目錄,每級 256 個,總共 65536 個目錄,上傳的檔案會以 hash 的方式被路由到其中某個子目錄下,然後將檔案資料直接作為一個本地檔案儲存到該目錄。 ![](https://mrhelloworld.com/resources/articles/fastdfs/id.png " ")    ## FastDFS 安裝    ### 下載資源      直接通過 Github:https://github.com/happyfish100 下載 `libfastcommon`,`fastdfs`,`fastdfs-nginx-module` 三個專案對應的壓縮包或者使用 git 命令下載,或者通過資源地址:https://sourceforge.net/projects/fastdfs/files/ 下載。 - `libfastcommon`:從 `fastdfs` 專案和 `fastdht` 專案中提取出來的公共 C 函式庫。 - `fastdfs`:FastDFS 核心專案。 - `fastdfs-nginx-module`:Nginx 整合 FastDFS 時 Nginx 需要新增的模組資源。    ### 安裝依賴      FastDFS 是基於 C 語言開發的,安裝它之前必須先安裝它所依賴的環境。 ```shell yum install -y make cmake gcc gcc-c++ ```    ### 安裝公共函式庫      上傳資源 `libfastcommon-master.zip` 至伺服器 `/usr/local/src` 目錄後並解壓。 ```shell # 安裝 unzip 用於解壓 yum install -y unzip # 解壓 libfastcommon 至當前所在目錄 unzip libfastcommon-master.zip ```      編譯並安裝。 ```shell # 進入解壓後的 libfastcommon-master 目錄 cd libfastcommon-master # 編譯並安裝 ./make.sh && ./make.sh install ```   `libfastcommon` 預設安裝在 `/usr/lib64` 和 `/usr/include/fastcommon` 兩個目錄中,並且會在 `/usr/lib` 目錄中建立軟連結。 ![](https://mrhelloworld.com/resources/articles/fastdfs/image-20200924154752150.png " ")    ### 安裝 FastDFS      上傳資源 `fastdfs-master.zip` 至伺服器 `/usr/local/src` 目錄後並解壓。 ```shell # 解壓 fastdfs 至當前所在目錄 unzip fastdfs-master.zip ```      編譯並安裝。 ```shell # 進入解壓後的 libfastcommon-master 目錄 cd fastdfs-master # 編譯並安裝 ./make.sh && ./make.sh install ```   `fastdfs` 預設安裝在以下位置: - `/usr/bin`:可執行檔案 - `/etc/fdfs`:配置檔案 - `/etc/init.d`:主程式程式碼 - `/usr/include/fastdfs`:外掛組 ![](https://mrhelloworld.com/resources/articles/fastdfs/image-20200924161246390.png " ")    ### 啟動 Tracker      `tracker` 和 `storage` 其實都是 `fastdfs`,只不過啟動時通過不同的配置檔案啟動,所扮演的角色不同而已。也就是說,安裝 `tracker` 和 `storage` 就是在安裝 `fastdfs`,然後通過每個角色具體的配置檔案啟動即可。   檢視 `/etc/fdfs` 目錄下所有配置檔案。 ```shell [root@localhost ~]# ls /etc/fdfs/ client.conf.sample storage.conf.sample storage_ids.conf.sample tracker.conf.sample ``` - `client.conf.sample`:客戶端的配置檔案,測試用 - `storage.conf.sample`:儲存器的配置檔案 - `tracker.conf.sample`:跟蹤器的配置檔案      編輯 `tracker.conf` 配置檔案。 ```shell # 拷貝檔案 tracker.conf.sample 並重命名為 tracker.conf cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf # 編輯 tracker.conf 配置檔案 vi /etc/fdfs/tracker.conf ```   配置檔案中的配置項還是蠻多的,這裡暫且關注以下幾個即可,後期根據實際情況再對其他配置項作出調整。 ```properties # 允許訪問 tracker 伺服器的 IP 地址,為空則表示不受限制 bind_addr = # tracker 服務監聽埠 port = 22122 # tracker 伺服器的執行資料和日誌的儲存父路徑(需要提前建立好) base_path = /fastdfs/tracker # tracker 伺服器 HTTP 協議下暴露的埠 http.server_port = 8080 ```      啟動 `tracker` 服務。 ```shell # 建立 tracker 伺服器的執行資料和日誌的儲存父路徑 mkdir -p /fastdfs/tracker # 啟動 tracker 服務 service fdfs_trackerd start # 檢視 tracker 服務狀態 service fdfs_trackerd status # 重啟 tracker 服務 service fdfs_trackerd restart # 停止 tracker 服務 service fdfs_trackerd stop ``` ![](https://mrhelloworld.com/resources/articles/fastdfs/image-20200924181037310.png " ")    ### 啟動 Storage      編輯 `storage.conf` 配置檔案。 ```shell # 拷貝檔案 storage.conf.sample 並重命名為 storage.conf cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf # 編輯 storage.conf 配置檔案 vi /etc/fdfs/storage.conf ```   配置檔案中的配置項還是蠻多的,這裡暫且關注以下幾個即可,後期根據實際情況再對其他配置項作出調整。 ```properties # storage 組名/卷名,預設為 group1 group_name = group1 # 允許訪問 storage 伺服器的 IP 地址,為空則表示不受限制 bind_addr = # storage 伺服器的執行資料和日誌的儲存父路徑(需要提前建立好) base_path = /fastdfs/storage/base # storage 伺服器中客戶端上傳的檔案的儲存父路徑(需要提前建立好) store_path0 = /fastdfs/storage/store # storage 伺服器 HTTP 協議下暴露的埠 http.server_port = 8888 # tracker 伺服器的 IP 和埠 tracker_server = 192.168.10.101:22122 ```      啟動 `storage` 服務。 ```shell # 建立 storage 伺服器的執行資料和日誌的儲存父路徑 mkdir -p /fastdfs/storage/base # 建立 storage 伺服器中客戶端上傳的檔案的儲存父路徑 mkdir -p /fastdfs/storage/store # 啟動 storage 服務 service fdfs_storaged start # 檢視 storage 服務狀態 service fdfs_storaged status # 重啟 storage 服務 service fdfs_storaged restart # 停止 storage 服務 service fdfs_storaged stop ``` ![](https://mrhelloworld.com/resources/articles/fastdfs/image-20200924185430354.png " ")      檢視 `/fastdfs/storage/store` 目錄可以看到 Storage 伺服器建立了 `65536` 個資料夾用於儲存客戶端上傳的檔案。 ![](https://mrhelloworld.com/resources/articles/fastdfs/image-20200924190930024.png " ")    ## Client 操作      FastDFS 向使用者提供基本檔案訪問介面,比如 upload、download、append、delete 等,以客戶端庫的方式提供給使用者使用。   在 Tracker 伺服器的機器上編輯 `tracker.conf` 配置檔案。 ```shell # 拷貝檔案 client.conf.sample 並重命名為 client.conf cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf # 編輯 client.conf 配置檔案 vi /etc/fdfs/client.conf ```   修改配置檔案中以下兩處內容即可。 ```properties # client 客戶端的執行資料和日誌的儲存父路徑(需要提前建立好) base_path = /fastdfs/client # tracker 伺服器的 IP 和埠 tracker_server = 192.168.10.101:22122 ```   記得 `mkdir -p /fastdfs/client` 建立 Client 目錄。    ### 上傳 ![](https://mrhelloworld.com/resources/articles/fastdfs/upload.png " ") **選擇 Tracker Server**      如上圖所示,Storage Server 會定期向 Tracker Server 傳送自己的所屬 group 等儲存相關資訊。如果 Tracker Server 是叢集環境,因為各個 Tracker 之間的關係是對等的,所以客戶端上傳時可以選擇任意一個 Tracker。    **選擇 group**      當 Tracker 收到客戶端上傳檔案的請求時,會為該檔案分配一個可用的 group 用於儲存,當選定了 group 以後就要決定給客戶端分配 group 中的哪個 Storage Server。 ![](//p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b5f973b5c0884c318b8db14f87ff8067~tplv-k3u1fbpfcp-zoom-1.image " ")   如上圖所示,`tracker.conf` 配置檔案中 group 的可選規則有: - `round robin`:所有的 group 間輪詢 - `specify group`:指定一個具體的 group - `load balance`:優先選擇剩餘儲存空間多的 group    **選擇 Storage Server**      當分配好 Storage Server 以後,客戶端會向 Storage Server 傳送上傳檔案請求,Storage Server 會為檔案分配一個具體的資料儲存目錄。 ![](https://mrhelloworld.com/resources/articles/fastdfs/image-20200925232336482.png " ")   如上圖所示,`storage.conf` 配置檔案中檔案分發的可選規則有: - `round robin`:在 group 中的所有 Storage 間輪詢 - `random`:隨機,按 hash code 分發    **生成 file_id**      選定儲存目錄以後,Storage 會為檔案生一個 file_id,由 Storage Server IP、檔案建立時間、檔案大小、檔案 crc32 和一個隨機陣列成,然後將這個二進位制串進行 base64 編碼,轉換為字串。    **生成檔名**      當檔案儲存到某個子目錄後,即認為該檔案儲存成功,接下來會為該檔案生成一個檔名,檔名由 `group名稱/儲存目錄/兩級子目錄/file_id.字尾名` 拼接而成。 ![](https://mrhelloworld.com/resources/articles/fastdfs/id.png " ")    **FastDFS檔案上傳返回資訊解讀**    - `group1`:**組名**/**卷名**。檔案上傳成功以後所在的 Storage 組名稱,由 Storage 伺服器返回。 - `M00`:**虛擬磁碟路徑**。與 Storage 配置檔案中磁碟選項 `store_path*` 對應。如果配置了 `store_path0` 則是 `M00`,如果配置了 `store_path1` 則是 `M01`,以此類推。比如:`store_path0 = /fastdfs/storage/store`,`M00` 則表示:`/fastdfs/storage/store/data`。 - `/02/44`:**資料兩級目錄**。Storage 伺服器在每個虛擬磁碟路徑下建立的兩級目錄,用於儲存資料檔案。 - `wKgDrE34E8wAAAAAAAAGkEIYJK42378`:file_id,由 Storage Server IP、檔案建立時間、檔案大小、檔案 crc32 和一個隨機陣列成,然後將這個二進位制串進行 base64 編碼,轉換為字串。 - `group1/M00/02/44/wKgDrE34E8wAAAAAAAAGkEIYJK42378.sh`:檔名。    #### 方式一      上傳命令格式為:`fdfs_upload_file /etc/fdfs/client.conf 要上傳的檔案`。 ```shell [root@localhost ~]# fdfs_upload_file /etc/fdfs/client.conf /usr/local/src/china.jpg group1/M00/00/00/wKgKZl9skn6AHZKUAADhaCZ_RF0650.jpg ``` ![](//p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/672160235f974c7d805955f3f6deaeb1~tplv-k3u1fbpfcp-zoom-1.image " ")   檔案上傳成功以後,會返回該檔案在 Storage 伺服器中的儲存位置及隨機生成的檔名。其中 `group1` 表示 Storage 組名/卷名,`M00` 是一個虛擬目錄,表示 `/fastdfs/storage/store/data/` 真實路徑中的 `data` 目錄。   如下圖所示,檢視 Storage 伺服器發現該檔案已成功上傳。 ![](//p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/9f9e822c22724ddcb7df75a434889e93~tplv-k3u1fbpfcp-zoom-1.image " ")    #### 方式二      或者使用:`fdfs_test /etc/fdfs/client.conf upload 要上傳的檔案`。 ```shell [root@localhost ~]# fdfs_test /etc/fdfs/client.conf upload /usr/local/src/china.jpg This is FastDFS client test program v6.07 Copyright (C) 2008, Happy Fish / YuQing FastDFS may be copied only under the terms of the GNU General Public License V3, which may be found in the FastDFS source kit. Please visit the FastDFS Home Page http://www.fastken.com/ for more detail. [2020-09-24 20:59:11] DEBUG - base_path=/fastdfs/client, connect_timeout=5, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0 tracker_query_storage_store_list_without_group: server 1. group_name=, ip_addr=192.168.10.102, port=23000 group_name=group1, ip_addr=192.168.10.102, port=23000 storage_upload_by_filename group_name=group1, remote_filename=M00/00/00/wKgKZl9smB-AVBRKAADhaCZ_RF0518.jpg source ip address: 192.168.10.102 file timestamp=2020-09-24 20:59:11 file size=57704 file crc32=645874781 example file url: http://192.168.10.102/group1/M00/00/00/wKgKZl9smB-AVBRKAADhaCZ_RF0518.jpg storage_upload_slave_by_filename group_name=group1, remote_filename=M00/00/00/wKgKZl9smB-AVBRKAADhaCZ_RF0518_big.jpg source ip address: 192.168.10.102 file timestamp=2020-09-24 20:59:11 file size=57704 file crc32=645874781 example file url: http://192.168.10.102/group1/M00/00/00/wKgKZl9smB-AVBRKAADhaCZ_RF0518_big.jpg ```   通過 `fdfs_test` 的方式上傳檔案,會返回該檔案上傳成功以後詳細的相關資訊。 ![](https://mrhelloworld.com/resources/articles/fastdfs/image-20200924211113061.png " ") - `group_name`:Storage 組名/卷名 - `remote_filename`:上傳成功檔案的儲存路徑及檔名 - `source_ip address`:上傳成功檔案所在的 Storage 伺服器的 IP 地址 - `file timestamp`:上傳成功檔案時的時間戳 - ` file size`:上傳成功檔案的檔案大小 - `example file url`:上傳成功檔案的 url 地址,**配合 Nginx 可以直接訪問** - `storage_upload_slave_by_filename`:FastDFS 的檔案主/從特性,由主檔案產生從檔案   如下圖所示,檢視 Storage 伺服器發現該檔案已成功上傳。字尾為 `jpg-m` 的檔案存放了上傳成功檔案的元資料資訊。 ![](//p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/061b2d3b85d2404a9b8a25507431375a~tplv-k3u1fbpfcp-zoom-1.image " ")   檢視元資料資訊如下: ```shell [root@localhost ~]# more /fastdfs/storage/store/data/00/00/wKgKZl9smB-AVBRKAADhaCZ_RF0518.jpg-m ext_namejpgfile_size115120height80width160 ```    ### 下載 ![](https://mrhelloworld.com/resources/articles/fastdfs/download.png " ")   客戶端 upload file 成功以後,會拿到一個 Storage 生成的檔名,接下來客戶端根據這個檔名即可訪問到該檔案。跟 upload file 一樣,在 download file 時客戶端可以選擇任意 Tracker Server。客戶端傳送 download 請求給某個 Tracker,必須帶上檔名資訊,Tracke 從檔名中解析出該檔案的 group、大小、建立時間等資訊,然後為該請求選擇一個 Storage 用於提供讀取服務。 ![](https://mrhelloworld.com/resources/articles/fastdfs/find.jpg " ")    #### 方式一      下載命令格式為:`fdfs_download_file /etc/fdfs/client.conf group_name/remote_filename`。 ```shell fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/wKgKZl9smB-AVBRKAADhaCZ_RF0518.jpg ```    #### 方式二      或者使用:`fdfs_test /etc/fdfs/client.conf download group_name remote_filename`。 ```shell fdfs_test /etc/fdfs/client.conf download group1 M00/00/00/wKgKZl9smB-AVBRKAADhaCZ_RF0518.jpg ```    ### 刪除    #### 方式一      刪除命令格式為:`fdfs_delete_file /etc/fdfs/client.conf 要刪除的檔案`。 ```shell fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKgKZl9smB-AVBRKAADhaCZ_RF0518.jpg ``` > Tips:刪除檔案操作會將元資料檔案一併刪除。    #### 方式二      或者使用:`fdfs_test /etc/fdfs/client.conf delete group_name remote_filename`。 ```shell fdfs_test /etc/fdfs/client.conf delete group1 M00/00/00/wKgKZl9smB-AVBRKAADhaCZ_RF0518_big.jpg ```      至此 FastDFS 的核心概念,架構體系及環境的搭建與使用就到這裡。說到檔案伺服器的使用,我們最終的目的是通過 HTTP 實現對檔案的訪問,但是此時還無法通過 HTTP 對檔案進行訪問,這就需要藉助其他工具來實現了,Nginx 就是一個不錯的選擇,它是一個高效能的 HTTP 和反向代理 Web 伺服器。下一篇我們就使用 Nginx 整合 FastDFS 實現檔案伺服器的搭建。 ![](//p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/550fd22d35cd428891c1277390bb6f81~tplv-k3u1fbpfcp-zoom-1.image) 本文采用 `知識共享「署名-非商業性使用-禁止演繹 4.0 國際」許可協議`。 大家可以通過 `分類` 檢視更多關於 `FastDFS` 的文章。