FastDFS 分佈式文件系統詳解

什麼是文件系統

  文件系統是操作系統用於在磁盤或分區上組織文件的方法和數據結構。磁盤空間是什麼樣的我們並不清楚,但文件系統可以給我們呈現一個非常清晰的表象,我們可以創建、刪除、修改和複製這些文件,而實現這些功能的軟件就是文件系統。操作系統中負責管理和存儲文件信息的軟件被稱爲文件管理系統,簡稱文件系統。

  文件系統是操作系統的一個重要組成部分,通過對操作系統所管理的存儲空間的抽象,向用戶提供統一的、對象化的訪問接口,屏蔽對物理設備的直接操作和資源管理。也就是說,文件系統解決了普通用戶使用磁盤存儲數據的問題

  

文件系統的發展史

  

  根據計算環境和所提供功能的不同,文件系統可劃分爲以下幾種。

  

單機文件系統

  

  特點:用於操作系統和應用程序的本地存儲。

  缺點:數據無法在多臺機器之間共享。

  代表:EXT2、EXT3、EXT4、NTFS、FAT、FAT32、XFS、JFS 等等。

  

網絡文件系統

  

  特點:基於現有以太網架構,實現不同服務器之間傳統文件系統的數據共享。

  缺點:兩臺服務器不能同時訪問修改,性能有限。

  代表:NFS、CIFS 等等,比如下圖 Windows 主機之間進行網絡文件共享就是通過微軟公司自己的 CIFS 服務實現的。

  

分佈式文件系統

  

  數據量越來越多,在一個操作系統管轄的範圍存不下了,那麼就分配到更多的操作系統管理的磁盤中,但是不方便管理和維護,因此迫切需要一種系統來管理多臺機器上的文件,這就是分佈式文件管理系統

  分佈式文件系統(Distributed File System)是一種允許文件通過網絡在多臺主機上共享的文件系統,可以讓多機器上的多用戶進行文件分享和存儲。在這樣的文件系統中,客戶端並非直接訪問底層的數據存儲區塊,而是通過網絡,以特定的通信協議和服務器溝通。DFS 爲分佈在網絡上任意位置的資源提供一個邏輯上的樹形文件系統結構,讓用戶訪問分佈在網絡上的共享文件更加簡便。所有高層次的文件系統都是以低層次的傳統文件系統爲基礎,實現了更高級的功能。

  特點:在傳統文件系統上,通過額外模塊實現數據跨服務器分佈,並且自身集成 RAID 保護功能,可以保證多臺服務器同時訪問、修改同一個文件系統。性能優越,擴展性強,可靠性高。

  缺點:部分類型存在單點故障風險。

  代表:HDFS(ASF)、MogileFS(LiveJournal)、FastDFS(餘慶)、Lustre(Oracle)、GlusterFS(RedHat)等等。

通用型

  

  通用分佈式文件系統和傳統的本地文件系統(如 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 架構

  

  

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 的方式被路由到其中某個子目錄下,然後將文件數據直接作爲一個本地文件存儲到該目錄。

  

FastDFS 安裝

  

下載資源

  

  直接通過 Github:https://github.com/happyfish100 下載 libfastcommonfastdfsfastdfs-nginx-module 三個項目對應的壓縮包或者使用 git 命令下載,或者通過資源地址:https://sourceforge.net/projects/fastdfs/files/ 下載。

  • libfastcommon:從 fastdfs 項目和 fastdht 項目中提取出來的公共 C 函數庫。
  • fastdfs:FastDFS 核心項目。
  • fastdfs-nginx-module:Nginx 整合 FastDFS 時 Nginx 需要添加的模塊資源。

  

安裝依賴

  

  FastDFS 是基於 C 語言開發的,安裝它之前必須先安裝它所依賴的環境。

yum install -y make cmake gcc gcc-c++

  

安裝公共函數庫

  

  上傳資源 libfastcommon-master.zip 至服務器 /usr/local/src 目錄後並解壓。

# 安裝 unzip 用於解壓
yum install -y unzip
# 解壓 libfastcommon 至當前所在目錄
unzip libfastcommon-master.zip

  

  編譯並安裝。

# 進入解壓後的 libfastcommon-master 目錄
cd libfastcommon-master
# 編譯並安裝
./make.sh && ./make.sh install

  libfastcommon 默認安裝在 /usr/lib64/usr/include/fastcommon 兩個目錄中,並且會在 /usr/lib 目錄中創建軟鏈接。

  

安裝 FastDFS

  

  上傳資源 fastdfs-master.zip 至服務器 /usr/local/src 目錄後並解壓。

# 解壓 fastdfs 至當前所在目錄
unzip fastdfs-master.zip

  

  編譯並安裝。

# 進入解壓後的 libfastcommon-master 目錄
cd fastdfs-master
# 編譯並安裝
./make.sh && ./make.sh install

  fastdfs 默認安裝在以下位置:

  • /usr/bin:可執行文件
  • /etc/fdfs:配置文件
  • /etc/init.d:主程序代碼
  • /usr/include/fastdfs:插件組

  

啓動 Tracker

  

  trackerstorage 其實都是 fastdfs,只不過啓動時通過不同的配置文件啓動,所扮演的角色不同而已。也就是說,安裝 trackerstorage 就是在安裝 fastdfs,然後通過每個角色具體的配置文件啓動即可。

  查看 /etc/fdfs 目錄下所有配置文件。

[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 配置文件。

# 拷貝文件 tracker.conf.sample 並重命名爲 tracker.conf
cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
# 編輯 tracker.conf 配置文件
vi /etc/fdfs/tracker.conf

  配置文件中的配置項還是蠻多的,這裏暫且關注以下幾個即可,後期根據實際情況再對其他配置項作出調整。

# 允許訪問 tracker 服務器的 IP 地址,爲空則表示不受限制
bind_addr =

# tracker 服務監聽端口
port = 22122

# tracker 服務器的運行數據和日誌的存儲父路徑(需要提前創建好)
base_path = /fastdfs/tracker

# tracker 服務器 HTTP 協議下暴露的端口
http.server_port = 8080

  

  啓動 tracker 服務。

# 創建 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

  

啓動 Storage

  

  編輯 storage.conf 配置文件。

# 拷貝文件 storage.conf.sample 並重命名爲 storage.conf
cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
# 編輯 storage.conf 配置文件
vi /etc/fdfs/storage.conf

  配置文件中的配置項還是蠻多的,這裏暫且關注以下幾個即可,後期根據實際情況再對其他配置項作出調整。

# 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 服務。

# 創建 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

  

  查看 /fastdfs/storage/store 目錄可以看到 Storage 服務器創建了 65536 個文件夾用於存儲客戶端上傳的文件。

  

Client 操作

  

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

  在 Tracker 服務器的機器上編輯 tracker.conf 配置文件。

# 拷貝文件 client.conf.sample 並重命名爲 client.conf
cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
# 編輯 client.conf 配置文件
vi /etc/fdfs/client.conf

  修改配置文件中以下兩處內容即可。

# client 客戶端的運行數據和日誌的存儲父路徑(需要提前創建好)
base_path = /fastdfs/client

# tracker 服務器的 IP 和端口
tracker_server = 192.168.10.101:22122

  記得 mkdir -p /fastdfs/client 創建 Client 目錄。

  

上傳

選擇 Tracker Server

  

  如上圖所示,Storage Server 會定期向 Tracker Server 發送自己的所屬 group 等存儲相關信息。如果 Tracker Server 是集羣環境,因爲各個 Tracker 之間的關係是對等的,所以客戶端上傳時可以選擇任意一個 Tracker。

  

選擇 group

  

  當 Tracker 收到客戶端上傳文件的請求時,會爲該文件分配一個可用的 group 用於存儲,當選定了 group 以後就要決定給客戶端分配 group 中的哪個 Storage Server。

  如上圖所示,tracker.conf 配置文件中 group 的可選規則有:

  • round robin:所有的 group 間輪詢
  • specify group:指定一個具體的 group
  • load balance:優先選擇剩餘存儲空間多的 group

  

選擇 Storage Server

  

  當分配好 Storage Server 以後,客戶端會向 Storage Server 發送上傳文件請求,Storage Server 會爲文件分配一個具體的數據存儲目錄。

  如上圖所示,storage.conf 配置文件中文件分發的可選規則有:

  • round robin:在 group 中的所有 Storage 間輪詢
  • random:隨機,按 hash code 分發

  

生成 file_id

  

  選定存儲目錄以後,Storage 會爲文件生一個 file_id,由 Storage Server IP、文件創建時間、文件大小、文件 crc32 和一個隨機數組成,然後將這個二進制串進行 base64 編碼,轉換爲字符串。

  

生成文件名

  

  當文件存儲到某個子目錄後,即認爲該文件存儲成功,接下來會爲該文件生成一個文件名,文件名由 group名稱/存儲目錄/兩級子目錄/file_id.後綴名 拼接而成。

  

FastDFS文件上傳返回信息解讀

  

  • group1組名/卷名。文件上傳成功以後所在的 Storage 組名稱,由 Storage 服務器返回。
  • M00虛擬磁盤路徑。與 Storage 配置文件中磁盤選項 store_path* 對應。如果配置了 store_path0 則是 M00,如果配置了 store_path1 則是 M01,以此類推。比如:store_path0 = /fastdfs/storage/storeM00 則表示:/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 要上傳的文件

[root@localhost ~]# fdfs_upload_file /etc/fdfs/client.conf /usr/local/src/china.jpg
group1/M00/00/00/wKgKZl9skn6AHZKUAADhaCZ_RF0650.jpg

  文件上傳成功以後,會返回該文件在 Storage 服務器中的存儲位置及隨機生成的文件名。其中 group1 表示 Storage 組名/卷名,M00 是一個虛擬目錄,表示 /fastdfs/storage/store/data/ 真實路徑中的 data 目錄。

  如下圖所示,查看 Storage 服務器發現該文件已成功上傳。

  

方式二

  

  或者使用:fdfs_test /etc/fdfs/client.conf upload 要上傳的文件

[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 的方式上傳文件,會返回該文件上傳成功以後詳細的相關信息。

  • 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 的文件存放了上傳成功文件的元數據信息。

  查看元數據信息如下:

[root@localhost ~]# more /fastdfs/storage/store/data/00/00/wKgKZl9smB-AVBRKAADhaCZ_RF0518.jpg-m 
ext_namejpgfile_size115120height80width160

  

下載

  客戶端 upload file 成功以後,會拿到一個 Storage 生成的文件名,接下來客戶端根據這個文件名即可訪問到該文件。跟 upload file 一樣,在 download file 時客戶端可以選擇任意 Tracker Server。客戶端發送 download 請求給某個 Tracker,必須帶上文件名信息,Tracke 從文件名中解析出該文件的 group、大小、創建時間等信息,然後爲該請求選擇一個 Storage 用於提供讀取服務。

  

方式一

  

  下載命令格式爲:fdfs_download_file /etc/fdfs/client.conf group_name/remote_filename

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

fdfs_test /etc/fdfs/client.conf download group1 M00/00/00/wKgKZl9smB-AVBRKAADhaCZ_RF0518.jpg

  

刪除

  

方式一

  

  刪除命令格式爲:fdfs_delete_file /etc/fdfs/client.conf 要刪除的文件

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

fdfs_test /etc/fdfs/client.conf delete group1 M00/00/00/wKgKZl9smB-AVBRKAADhaCZ_RF0518_big.jpg

  

  至此 FastDFS 的核心概念,架構體系及環境的搭建與使用就到這裏。說到文件服務器的使用,我們最終的目的是通過 HTTP 實現對文件的訪問,但是此時還無法通過 HTTP 對文件進行訪問,這就需要藉助其他工具來實現了,Nginx 就是一個不錯的選擇,它是一個高性能的 HTTP 和反向代理 Web 服務器。下一篇我們就使用 Nginx 整合 FastDFS 實現文件服務器的搭建。

本文采用 知識共享「署名-非商業性使用-禁止演繹 4.0 國際」許可協議

大家可以通過 分類 查看更多關於 FastDFS 的文章。

  

🤗 您的點贊轉發是對我最大的支持。

📢 掃碼關注 哈嘍沃德先生「文檔 + 視頻」每篇文章都配有專門視頻講解,學習更輕鬆噢 ~

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