天天看點

分布式檔案存儲方案之FastDFS的安裝部署

作者:198兜兜裡有糖

一、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很容易搭建一套高性能的檔案伺服器叢集提供檔案上傳、下載下傳等服務。

分布式檔案存儲方案之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,最後根據以上的資訊生成檔案名存儲檔案。

分布式檔案存儲方案之FastDFS的安裝部署

圖-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用來服務讀請求。

分布式檔案存儲方案之FastDFS的安裝部署

圖-3:FastDFS下載下傳檔案過程圖

client發送下載下傳請求給某個tracker,必須帶上檔案名資訊,tracker從檔案名中解析出檔案的group、大小、建立時間等資訊,然後為該請求選擇一個storage用于讀請求;由于group内的檔案同步在背景是異步進行的,可能出現檔案沒有同到其他storage server上或者延遲的問題,後面我們在使用nginx_fastdfs_module子產品可以很好地解決這一問題

分布式檔案存儲方案之FastDFS的安裝部署

圖-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目錄下了,并解壓到目前目錄。

分布式檔案存儲方案之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/ 目錄下:

分布式檔案存儲方案之FastDFS的安裝部署

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            
分布式檔案存儲方案之FastDFS的安裝部署

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           
分布式檔案存儲方案之FastDFS的安裝部署

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           
分布式檔案存儲方案之FastDFS的安裝部署

F、設定 Storage 開機啟動

# chkconfig fdfs_storaged on

或者:
# vim /etc/rc.d/rc.local
加入配置:
/etc/init.d/fdfs_storaged start           
分布式檔案存儲方案之FastDFS的安裝部署

G、Storage 目錄

同 Tracker,Storage 啟動成功後,在base_path 下建立了data、logs目錄,記錄着 Storage Server 的資訊。在 store_path0 目錄下,建立了N*N個子目錄:

分布式檔案存儲方案之FastDFS的安裝部署

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           
分布式檔案存儲方案之FastDFS的安裝部署

ü 通過fdfs_upload_file上傳

# /usr/bin/fdfs_upload_file /etc/fdfs/client.conf test00.png           
分布式檔案存儲方案之FastDFS的安裝部署

傳回的檔案ID由group、存儲目錄、兩級子目錄、fileid、檔案字尾名(由用戶端指定,主要用于區分檔案類型)拼接而成。

分布式檔案存儲方案之FastDFS的安裝部署

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           

有下面這個就說明添加子產品成功

分布式檔案存儲方案之FastDFS的安裝部署

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           
分布式檔案存儲方案之FastDFS的安裝部署

H、在浏覽器通路之前上傳的圖檔、成功。注意和第三點中直接使用nginx路由通路不同的是,這裡配置 fastdfs-nginx-module 子產品,可以重定向檔案連結到源伺服器取檔案。

http://dahai.wang/group1/M00/00/00/wKg4WFvA9AuATik9ABHrL3S6K74300.png           

I、最終部署結構圖:可以按照下面的結構搭建環境。

分布式檔案存儲方案之FastDFS的安裝部署

以上就是整個搭建FastDFS分布式檔案系統并實作上傳下載下傳的全部過程。歡迎評論區留言讨論。

====================【分享結束】====================

繼續閱讀