什麼是文件系統
文件系統是操做系統用於在磁盤或分區上組織文件的方法和數據結構。磁盤空間是什麼樣的咱們並不清楚,但文件系統能夠給咱們呈現一個很是清晰的表象,咱們能夠建立、刪除、修改和複製這些文件,而實現這些功能的軟件就是文件系統。操做系統中負責管理和存儲文件信息的軟件被稱爲文件管理系統,簡稱文件系統。html
文件系統是操做系統的一個重要組成部分,經過對操做系統所管理的存儲空間的抽象,向用戶提供統一的、對象化的訪問接口,屏蔽對物理設備的直接操做和資源管理。也就是說,文件系統解決了普通用戶使用磁盤存儲數據的問題。前端
文件系統的發展史
根據計算環境和所提供功能的不一樣,文件系統可劃分爲如下幾種。nginx
單機文件系統
特色:用於操做系統和應用程序的本地存儲。c++
缺點:數據沒法在多臺機器之間共享。git
表明:EXT二、EXT三、EXT四、NTFS、FAT、FAT3二、XFS、JFS 等等。github
網絡文件系統
特色:基於現有以太網架構,實現不一樣服務器之間傳統文件系統的數據共享。算法
缺點:兩臺服務器不能同時訪問修改,性能有限。shell
表明:NFS、CIFS 等等,好比下圖 Windows 主機之間進行網絡文件共享就是經過微軟公司本身的 CIFS 服務實現的。數組
分佈式文件系統
數據量愈來愈多,在一個操做系統管轄的範圍存不下了,那麼就分配到更多的操做系統管理的磁盤中,可是不方便管理和維護,所以迫切須要一種系統來管理多臺機器上的文件,這就是分佈式文件管理系統。緩存
分佈式文件系統(Distributed File System)是一種容許文件經過網絡在多臺主機上共享的文件系統,可讓多機器上的多用戶進行文件分享和存儲。在這樣的文件系統中,客戶端並不是直接訪問底層的數據存儲區塊,而是經過網絡,以特定的通訊協議和服務器溝通。DFS 爲分佈在網絡上任意位置的資源提供一個邏輯上的樹形文件系統結構,讓用戶訪問分佈在網絡上的共享文件更加簡便。全部高層次的文件系統都是以低層次的傳統文件系統爲基礎,實現了更高級的功能。
特色:在傳統文件系統上,經過額外模塊實現數據跨服務器分佈,而且自身集成 RAID 保護功能,能夠保證多臺服務器同時訪問、修改同一個文件系統。性能優越,擴展性強,可靠性高。
缺點:部分類型存在單點故障風險。
表明:HDFS(ASF)、MogileFS(LiveJournal)、FastDFS(餘慶)、Lustre(Oracle)、GlusterFS(RedHat)等等。
通用型
通用分佈式文件系統和傳統的本地文件系統(如 EXT四、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 下載 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 語言開發的,安裝它以前必須先安裝它所依賴的環境。
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
tracker
和 storage
其實都是 fastdfs
,只不過啓動時經過不一樣的配置文件啓動,所扮演的角色不一樣而已。也就是說,安裝 tracker
和 storage
就是在安裝 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
:指定一個具體的 groupload 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/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 要上傳的文件
。
[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 國際」許可協議
。
🤗 您的點贊
和轉發
是對我最大的支持。
📢 掃碼關注 哈嘍沃德先生
「文檔 + 視頻」每篇文章都配有專門視頻講解,學習更輕鬆噢 ~