一、FastDFS介紹
1.1、基本簡介
FastDFS是一個C語言實作的實作的開源的、高性能輕量級的、分布式檔案系統(DFS),作者餘慶(happyfish100),支援 Linux、FreeBSD、AID等Unix系統和Windows系統,主要功能包括:檔案存儲、檔案同步、檔案通路(上傳、下載下傳)、以及高容量和負載平衡等。主要解決了大容量存儲和讀寫負載均衡等問題,特别适合以中小檔案(建議範圍:4KB < file_size <500MB)為載體的線上服務,如圖檔網站、短視訊網站、文檔、app下載下傳站等;UC、京東、支付寶、迅雷、酷狗等都有使用,其中 UC基于FastDFS向使用者提供網盤、廣告和應用下載下傳的業務的存儲服務。FastDFS與 MogileF、HDFS、TFS 等都不是系統級的分布式檔案系統,而是應用級的分布式檔案存儲服務。
FastDFS 系統有三個角色:跟蹤伺服器(Tracker Server)、存儲伺服器(Storage Server)和用戶端(Client)。
Ø Tracker Server
跟蹤伺服器,主要做排程工作,起到均衡的作用;負責管理所有的storage server和 group,每個storage在啟動 後會連接配接Tracker,告知自己所屬groupg等資訊,并保持周期性心跳, Tracker根據storage心跳資訊,建立group--------->[storage server list]的映射表 ;tracker管理的中繼資料很少,會直接存放在記憶體 ;tracker上的元資訊都是由 storage彙報的 資訊生成彙報的,本身不需要持久化任何資料 ,tracker之間是對等關系,是以擴充tracker服務非常容易,之間增加tracker伺服器即可,所有 tracker都接受 stroage心跳資訊,生成中繼資料來提供讀寫服務(與其他 Master-Slave架構的優勢是沒有單點,tracker也不會成為瓶頸,最終資料是和一個可用的Storage Server進行傳輸的)。
Ø Storage Server
存儲伺服器,主要提供容量和備份服務;以group為機關,每個group内可以包多台storage server,資料互為備份,存儲容量空間以group内容量最小的storage為準;建議group内的storage server配置相同;以group為機關組織存儲能夠友善的進行應用隔離、負載均衡和副本數定制;缺點是group的容量受單機存儲限制,同時group内機器壞掉,資料恢複隻能依賴group内其他機器重新同步(壞盤 替換,重新挂載啟fdfs_storaged即可)。
多個group之間的存儲方式有3種政策:round robin(輪詢 )、load balance(選擇最大剩餘空間的組上傳檔案)、specify group(指定group上傳)。
group中storage存儲依賴本地檔案系統,storage可配置多個資料存儲目錄,磁盤不做raid,直接分别挂載到多個目錄,将這些目錄配置為storage的資料目錄即可。
storage接受寫請求時,會根據配置好的規則,選擇其中一個存儲目錄來存儲檔案;為避免單個目錄下的檔案過多,storage第一次啟時,會在每個資料存儲目錄裡建立2級子目錄,每級256個,總共65536個,新寫的檔案會以hash的方式被路由到其中某個子目錄下,然後将檔案資料直接作為一個本地檔案存儲到該目錄中。
Ø Client:用戶端,上傳下載下傳資料的伺服器,也就是我們自己的項目所部署在的伺服器。
總結:1. 高可靠性、無單點故障 2.高吞吐性:隻要Group足夠多,資料流量是分散的。
FastDFS為網際網路量身定制,充分考慮了備援備份、負載均衡、線性擴容等機制,并注重高可用、高性能等名額,使用FastDFS很容易搭建一套高性能的檔案伺服器叢集提供檔案上傳、下載下傳等服務。
圖-1:FastDFS架構圖
1.2、FastDFS的存儲政策
為了支援大容量,存儲節點(伺服器)采用了分卷(或分組)的組織方式。存儲系統由一個或多個卷組成,卷與卷之間的檔案是互相獨立的,所有卷的檔案容量累加就是整個存儲系統中的檔案容量。一個卷可以由一台或多台存儲伺服器組成,一個卷下的存儲伺服器中的檔案都是相同的,卷中的多台存儲伺服器起到了備援備份和負載均衡的作用。
在卷中增加伺服器時,同步已有的檔案由系統自動完成,同步完成後,系統自動将新增伺服器切換到線上提供服務。當存儲空間不足或即将耗盡時,可以動态添加卷。隻需要增加一台或多台伺服器,并将它們配置為一個新的卷,這樣就擴大了存儲系統的容量。
1.3、FastDFS的上傳過程
FastDFS向使用者提供基本檔案通路接口,比如upload、download、append、delete等,以用戶端庫的方式提供給使用者使用。
Storage Server會定期的向Tracker Server發送自己的存儲資訊。當Tracker Server Cluster中的Tracker Server不止一個時,各個Tracker之間的關系是對等的,是以用戶端上傳時可以選擇任意一個Tracker。
當Tracker收到用戶端上傳檔案的請求時,會為該檔案配置設定一個可以存儲檔案的group,當選定了group後就要決定給用戶端配置設定group中的哪一個storage server。當配置設定好storage server後,用戶端向storage發送寫檔案請求,storage将會為檔案配置設定一個資料存儲目錄。然後為檔案配置設定一個fileid,最後根據以上的資訊生成檔案名存儲檔案。
圖-2:FastDFS的上傳過程圖
FastDFS提供基本的檔案通路接口,如upload、download、append、delete等。
1.4、FastDFS的檔案同步
寫檔案時,用戶端将檔案寫至group内一個storage server即認為寫檔案成功,storage server寫完檔案後,會由背景線程将檔案同步至同group内其他的storage server。
每個storage寫檔案後,同時會寫一份binlog,binlog裡不包含檔案資料,隻包含檔案名等元資訊,這份binlog用于背景同步,storage會記錄向group内其他storage同步的進度,以便重新開機後能接上次的進度繼續同步;進度以時間戳的方式進行記錄,是以最好能保證叢集内所有server的時鐘保持同步。
storage的同步進度會作為中繼資料的一部分彙報到tracker上,tracke在選擇讀storage的時候會以同步進度作為參考。
1.5、FastDFS的下載下傳過程
用戶端uploadfile成功後,會拿到一個storage生成的檔案名,接下來用戶端根據這個檔案名即可通路到該檔案。
跟upload file一樣,在downloadfile時用戶端可以選擇任意tracker server。tracker發送download請求給某個tracker,必須帶上檔案名資訊,tracke從檔案名中解析出檔案的group、大小、建立時間等資訊,然後為該請求選擇一個storage用來服務讀請求。
圖-3:FastDFS下載下傳檔案過程圖
client發送下載下傳請求給某個tracker,必須帶上檔案名資訊,tracker從檔案名中解析出檔案的group、大小、建立時間等資訊,然後為該請求選擇一個storage用于讀請求;由于group内的檔案同步在背景是異步進行的,可能出現檔案沒有同到其他storage server上或者延遲的問題,後面我們在使用nginx_fastdfs_module子產品可以很好地解決這一問題
圖-4:client請求及響應流程圖
FastDFS提供合并存儲功能,預設建立的大檔案為64MB,然後在該大檔案中存儲很多小檔案;大檔案中容納一個小檔案的空間稱作一個Slot,規定Slotlotlot最小值為256位元組,最大為16MB,即小于256位元組的檔案也要占用256位元組,超過16MB的檔案獨立存儲。
為了支援檔案合并機制,FastDFS生成的檔案file_id需要額外增加16個位元組;每個trunk file由一個id 唯一辨別,trunk file由group内的trunk server負責建立(trunk server是tracker選出來的),并同步到group内其他的storage,檔案存儲合并存儲到trunk file後,根據其檔案偏移量就能從trunk file中讀取檔案。
二、安裝FastDFS環境
2.1、安裝前準備
操作環境:CentOS 7.4 x64,以下所有操作都是在單機環境完成的。
A、所有的安裝包都下載下傳到/opt/tools/fastdfs目錄下了,并解壓到目前目錄。
B、先做一件事,修改hosts,将檔案伺服器的ip與域名映射(單機TrackerServer環境),因為後面很多配置裡面都需要去配置伺服器位址,ip變了,就隻需要修改hosts即可。
C、安裝環境依賴包
# yum -y install gcc zlib pcre pcre-devel zlib-devel
2.2、安裝libfastcommon
libfastcommon是從 FastDFS 和 FastDHT 中提取出來的公共 C 函數庫,基礎環境,安裝即可 。這裡已經将libfastcommon下載下傳并上傳至/opt/tools/fastdfs目錄。
下載下傳位址:https://github.com/happyfish100/libfastcommon/archive/V1.0.7.tar.gz
A、開始安裝: # cd /opt/tools/fastdfs # unzip libfastcommon.zip # cd libfastcommon # ./make.sh && ./make.sh install |
2.3、安裝FastDFS
下載下傳位址:https://github.com/happyfish100/fastdfs/archive/V5.05.tar.gz
開始安裝FastDFS # cd /opt/tools/fastdfs # unzip fastdfs.zip # cd fastdfs #./make.sh && ./make.sh install # cp -rf ./conf/* /etc/fdfs/ 預設安裝方式安裝後的相應檔案與目錄 A、服務腳本: /etc/init.d/fdfs_storaged /etc/init.d/fdfs_trackerd B、配置檔案(這三個是作者給的樣例配置檔案) : /etc/fdfs/client.conf.sample /etc/fdfs/storage.conf.sample /etc/fdfs/tracker.conf.sample C、指令工具在 /usr/bin/ 目錄下: |
2.4、配置FastDFS跟蹤器(Tracker)
A、編輯tracker.conf ,标紅的需要修改下,其它的預設即可。
# vim /etc/fdfs/tracker.conf
# 配置檔案是否不生效,false 為生效
disabled=false
# 提供服務的端口
port=22122
# Tracker 資料和日志目錄位址(根目錄必須存在,子目錄會自動建立)
base_path=/home/yuqing/fastdfs
# HTTP 服務端口
http.server_port=80
B、檢視修改後内容
# grep -v "^#" /etc/fdfs/tracker.conf |grep -v "^#34;
C、建立tracker基礎資料目錄,即base_path對應的目錄
# mkdir -p /home/yuqing/fastdfs
D、防火牆中打開跟蹤端口(預設的22122)
# vim /etc/sysconfig/iptables
添加如下端口行:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22122 -j ACCEPT
重新開機防火牆:
# service iptables restart
E、啟動Tracker服務
初次成功啟動,會在/home/yuqing/fastdfs(配置的base_path)下建立 data、logs 兩個目錄。
可以用這種方式啟動
# /etc/init.d/fdfs_trackerd start
也可以用這種方式啟動,前提是上面建立了軟連結,後面都用這種方式
# service fdfs_trackerd start
檢視 FastDFS Tracker 是否已成功啟動 ,22122端口正在被監聽,則算是Tracker服務安裝并啟動成功。
# netstat -unltp|grep fdfs
# ps -ef |grep track |grep -v 'grep'
關閉Tracker服務
# service fdfs_trackerd stop
F、設定Tracker開機啟動
# chkconfig fdfs_trackerd on
或者:
# vim /etc/rc.d/rc.local
加入配置:
/etc/init.d/fdfs_trackerd start
G、Tracker Server 目錄及檔案結構
Tracker服務啟動成功後,會在base_path下建立data、logs兩個目錄。目錄結構如下:
${base_path}
|__data
| |__storage_groups.dat:存儲分組資訊
| |__storage_servers.dat:存儲伺服器清單
|__logs
| |__trackerd.log: tracker server 日志檔案
H、啟動、重新開機、停止、狀态檢視
#啟動:/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start
#重新開機:/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
#停止:/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf stop
#或者
#啟動:service fdfs_trackerd start
#重新開機:service fdfs_trackerd restart
#停止:service fdfs_trackerd stop
#狀态:service fdfs_trackerd status
2.5、配置FastDFS存儲 (Storage)
A、在實際的生産環境中Storage節點和Tracker節點一般是不同的伺服器,是以是仍須安裝libfastcommon、FastDFS的,具體安裝步驟請參考步驟2.2和2.3進行安裝;由于本文檔的安裝部署是在一台伺服器上進行的安裝,是以這裡的Storage就不再進行安裝了。
B、編輯storage.conf,标紅的需要修改,其它的預設即可。
# vim /etc/fdfs/storage.conf
#啟用配置檔案
disabled=false
#指定此 storage server 所在 組(卷)
group_name=group1
#設定storage server的端口号
port=23000
#設定Storage資料和日志目錄位址(根目錄必須存在,子目錄會自動生成)
base_path=/home/fastdfs
#存放檔案時 storage server 支援多個路徑。這裡配置存放檔案的基路徑數目,通常隻配一個目錄,需要和store_path個數比對
store_path_count=1
#逐一配置 store_path_count 個路徑,索引号基于 0
#如果不配置 store_path0,那它就和 base_path 對應的路徑一樣
#檔案存儲路徑
store_path0=/home/fastdfs/image-data0
#tracker伺服器的IP位址和端口号清單
#有多個 tracker server 時,每個 tracker server 寫一行
tracker_server=dahai.wang:22122
#設定http通路端口号
http.server_port=80
# 心跳間隔時間,機關為秒 (這裡是指主動向 tracker server 發送心跳)
heart_beat_interval=30
# FastDFS 存儲檔案時,采用了兩級目錄。這裡配置存放檔案的目錄個數。
# 如果本參數隻為 N(如: 256),那麼 storage server 在初次運作時,會在 store_path 下自動建立 N * N 個存放檔案的子目錄。
subdir_count_per_path=256
# 允許系統同步的時間段 (預設是全天) 。一般用于避免高峰同步産生一些問題而設定。
sync_start_time=00:00
sync_end_time=23:59
C、建立Storage基礎資料目錄,對應base_path目錄
# 這是配置的base_path路徑
# mkdir -p /home/fastdfs
# 這是配置的store_path0路徑
# mkdir -p /home/fastdfs/image-data0
D、防火牆中打開存儲器端口(預設的 23000)
# vim /etc/sysconfig/iptables
添加如下端口行:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 23000 -j ACCEPT
重新開機防火牆:
# service iptables restart
E、啟動 Storage
啟動Storage前確定Tracker是啟動的。初次啟動成功,會在 /ljzsg/fastdfs/storage 目錄下建立 data、 logs 兩個目錄。
可以用這種方式啟動
# /etc/init.d/fdfs_storaged start
也可以用這種方式,後面都用這種
# service fdfs_storaged start
檢視 Storage 是否成功啟動,23000 端口正在被監聽,就算 Storage 啟動成功。
# netstat -unltp|grep fdfs_storaged
關閉Storage指令:
# service fdfs_storaged stop
檢視Storage和Tracker是否在通信:
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
F、設定 Storage 開機啟動
# chkconfig fdfs_storaged on
或者:
# vim /etc/rc.d/rc.local
加入配置:
/etc/init.d/fdfs_storaged start
G、Storage 目錄
同 Tracker,Storage 啟動成功後,在base_path 下建立了data、logs目錄,記錄着 Storage Server 的資訊。在 store_path0 目錄下,建立了N*N個子目錄:
H、啟動、重新開機、停止、狀态檢視
#啟動:/usr/bin/fdfs_storaged /etc/fdfs/tracker.conf start
#重新開機:/usr/bin/fdfs_storaged /etc/fdfs/tracker.conf restart
#停止:/usr/bin/fdfs_storaged /etc/fdfs/tracker.conf stop
#或者
#啟動:service fdfs_storaged start
#重新開機:service fdfs_storaged restart
#停止:service fdfs_storaged stop
#狀态:service fdfs_storaged status
I、特别說明
如果是安裝了多個Storage服務的情況,需要在每個伺服器上全部安裝storage并确認運作正常。相關配置參照步驟2.5進行修改,注意配置檔案中group名參數需要根據實際情況調整,且每個group中所有storage的端口号必須一緻。
2.6、檔案上傳測試
A、修改 Tracker 伺服器中的用戶端配置檔案;修改如下配置即可,其它預設。
# vim /etc/fdfs/client.conf
# Client 的資料和日志目錄
base_path=/home/yuqing/fastdfs
# Tracker端口
tracker_server=dahai.wang:22122
#tracker伺服器的http端口号
http.tracker_server_port=80
B、上傳測試
ü 通過fdfs_test上傳
# /usr/bin/fdfs_test /etc/fdfs/client.conf upload test00.png
ü 通過fdfs_upload_file上傳
# /usr/bin/fdfs_upload_file /etc/fdfs/client.conf test00.png
傳回的檔案ID由group、存儲目錄、兩級子目錄、fileid、檔案字尾名(由用戶端指定,主要用于區分檔案類型)拼接而成。
3、配置fastdfs-nginx-module子產品
FastDFS 通過 Tracker 伺服器,将檔案存放在 Storage 伺服器存儲, 但是同組存儲伺服器之間需要進行檔案複制, 有同步延遲的問題。
假設 Tracker 伺服器将檔案上傳到了 192.168.56.88,上傳成功後檔案 ID已經傳回給用戶端。此時 FastDFS 存儲叢集機制會将這個檔案同步到同組存儲 192.168.56.89,在檔案還沒有複制完成的情況下,用戶端如果用這個檔案 ID 在 192.168.56.89 上取檔案,就會出現檔案無法通路的錯誤。而 fastdfs-nginx-module 可以重定向檔案連結到源伺服器取檔案,避免用戶端由于複制延遲導緻的檔案無法通路錯誤。
3.1、子產品配置
A、配置fastdfs-nginx-module插件
# cd /opt/tools/fastdfs
# 解壓fastdfs-nginx-module插件
# unzip fastdfs-nginx-module.zip
# 将FastDFS的nginx插件子產品的配置檔案copy到FastDFS配置檔案目錄
# cp -rf fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
B、編輯mod_fastdfs.conf
# vim /etc/fdfs/mod_fastdfs.conf
#儲存日志目錄
base_path=/home/fastdfs
#tracker伺服器的IP位址以及端口号
tracker_server=dahai.wang:22122
#storage伺服器的端口号
storage_server_port=23000
#目前伺服器的group名
group_name=group1
#檔案url中是否有group名
url_have_group_name=true
#存儲路徑個數,需要和store_path個數比對
store_path_count=1
#檔案存儲路徑
store_path0=/home/fastdfs/image-data0
#從檔案擴充名查找檔案類型(nginx時為true)
http.need_find_content_type=true
#設定組的個數
group_count=1
#在檔案末尾增加1個組的具體資訊:
[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/home/fastdfs/image-data0
C、建立M00的連結
# 建立M00至存儲目錄的符号連接配接:
# ln -s /home/fastdfs/data /home/fastdfs/data/M00
4、安裝Nginx并配置
經過以上步驟,已經将檔案上傳成功了,但我們還無法下載下傳。是以安裝Nginx作為伺服器以支援Http方式通路檔案。同時,後面安裝FastDFS的Nginx子產品也需要Nginx環境。
Nginx隻需要安裝到Storage Server所在的伺服器即可,用于通路檔案。我這裡由于是單機,Tracker Server和Storage Server在一台伺服器上。
4.1、安裝nginx所需環境
A、安裝所需依賴包
# yum -y install gcc-c++ \
pcre pcre-devel \
zlib zlib-devel \
openssl openssl-devel
4.2、安裝并配置Nginx
下載下傳位址:https://nginx.org/download/nginx-1.23.1.tar.gz
A、解壓、配置、安裝編譯nginx
# cd /opt/tools/fastdfs
# tar -zxf nginx-1.8.0.tar.gz
# cd nginx-1.8.0
# ./configure --prefix=/usr/local/nginx \
--add-module=../fastdfs-nginx-module/src
# make && make install
B、檢視Nginx的子產品
# /usr/local/nginx/sbin/nginx -V
有下面這個就說明添加子產品成功
C、配置nginx
# 注意這一行,我特别加上了使用 root 使用者去執行,不然有些目錄沒有權限通路
user root;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#設定緩存參數
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 300m;
sendfile on;
tcp_nopush on;
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
#設定緩存存儲路徑、存儲方式、配置設定記憶體大小、磁盤最大空間、緩存期限
proxy_cache_path /var/cache/nginx/proxy_cache levels=1:2 keys_zone=http-cache:500m max_size=10g inactive=30d;
proxy_temp_path /var/cache/nginx/proxy_cache/tmp;
keepalive_timeout 65;
server {
listen 80;
# 通路本機
server_name dahai.wang;
# 攔截包含 /group1/M00 請求,使用 fastdfs 這個 Nginx 子產品進行轉發
location ~/group[0-9] {
ngx_fastdfs_module;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
注意:
listen 80 端口值是要與 /etc/fdfs/storage.conf 中的 http.server_port=80 (前面改成80了)相對應。如果改成其它端口,則需要統一,同時在防火牆中打開該端口。
location 的配置,如果有多個group則配置location ~/group([0-9])/M00 ,沒有則不用配group。
D、啟動nginx
# /usr/local/nginx/sbin/nginx
其它指令
# /usr/local/nginx/sbin/nginx -s stop
# /usr/local/nginx/sbin/nginx -s quit
# /usr/local/nginx/sbin/nginx -s reload
E、設定開機啟動
# vim /etc/rc.local
添加一行:
/usr/local/nginx/sbin/nginx
# 設定執行權限
# chmod 755 rc.local
F、檢視nginx的版本及子產品
/usr/local/nginx/sbin/nginx -V
G、防火牆中打開nginx端口(預設的 80),添加後就能在本機使用80端口通路了。
# vim /etc/sysconfig/iptables
添加如下端口行:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
重新開機防火牆:
# service iptables restart
H、在浏覽器通路之前上傳的圖檔、成功。注意和第三點中直接使用nginx路由通路不同的是,這裡配置 fastdfs-nginx-module 子產品,可以重定向檔案連結到源伺服器取檔案。
http://dahai.wang/group1/M00/00/00/wKg4WFvA9AuATik9ABHrL3S6K74300.png
I、最終部署結構圖:可以按照下面的結構搭建環境。
以上就是整個搭建FastDFS分布式檔案系統并實作上傳下載下傳的全部過程。歡迎評論區留言讨論。
====================【分享結束】====================