FastDFS集羣安裝手冊

簡介:

FastDFS是一款開源、C語言開發的分佈式文件系統(Distributed File System),由淘寶開發平臺部資深架構師餘慶開發。作爲一個分佈式文件系統,它對文件進行管理,功能包括:文件存儲、文件同步、文件訪問(文件上傳、文件下載)等,解決了大容量存儲和負載均衡的問題,特別適合中小文件(建議範圍:4KB < file_size <500MB),對以文件爲載體的在線服務,如相冊網站、視頻網站等等具有顯著的效果。

場景:

FastDFS與HDFS區別:定位和應用場合不同。
Hadoop的文件系統HDFS主要解決並行計算中分佈式存儲數據的問題。其單個數據文件通常很大,採用了分塊(切分)存儲的方式;

FastDFS主要用於大中網站,爲文件上傳和下載提供在線服務。所以在負載均衡、動態擴容等方面都支持得比較好,FastDFS不會對文件進行分快(切分)存儲。

架構:

FastDFS 系統有三個角色:跟蹤服務器(Tracker Server)、存儲服務器(Storage Server)和客戶端(Client)。
在這裏插入圖片描述

安裝:

1.軟件說明

名稱 版本 說明
CentOS CentOS Linux release 7.4.1708 (Core) 發行版
libfastcommon libfastcommon-1.0.39.tar.gz 包含了FastDFS運行所需要的一些基礎庫
FastDFS fastdfs-5.11.tar.gz 核心安裝包
fastdfs-nginx-module fastdfs-nginx-module-1.20.tar.gz FastDFS和nginx的關聯模塊,解決組內同步延遲問題
nginx nginx-1.16.0.tar.gz 反向代理、負載均衡

2.集羣規劃

同一個group之間的storage互爲備份,所有group累積爲全量數據

服務器 角色 分組 軟件
192.168.1.1 Tracker FastDFS+libfastcommon+nginx
192.168.1.2 Tracker FastDFS+libfastcommon+nginx
192.168.1.3 Storage1 group1 FastDFS+libfastcommon+nginx+fastdfs-nginx-module
192.168.1.4 Storage2 group1 FastDFS+libfastcommon+nginx+fastdfs-nginx-module
192.168.1.5 Storage3 group2 FastDFS+libfastcommon+nginx+fastdfs-nginx-module
192.168.1.6 Storage4 group2 FastDFS+libfastcommon+nginx+fastdfs-nginx-module
192.168.1.7 nginx

3.安裝軟件

  • 添加用戶權限
# 創建一個gid爲246的fdfs用戶組
groupadd -g 246 fdfs
# 創建一個uid爲246,gid爲246的fdfs 用戶
useradd -u 246 -g 246 fdfs
passwd fdfs [password]
# 查看用戶uid
id fdfs
# 刪除用戶組
# userdel -rf fdfs
# 查看用戶列表
# cut -d : -f 1 /etc/passwd
  • 設置文件夾權限
chown -R fdfs fastdfs-5.11
chgrp -R fdfs fastdfs-5.11

1.安裝FastDFS依賴(T&S)

FastDFS由C開發,所以依賴gcc

# 安裝編譯環境
yum install git gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl-devel wget vim -y

2.安裝libfatscommon(T&S)

libfatscommon包含了FastDFS運行所需要的一些基礎庫

# 上傳解壓
cd /home/fdfs
tar zxvf libfastcommon-1.0.39.tar.gz
cd libfastcommon-1.0.39
# 編譯安裝
./make.sh && ./make.sh install

3.安裝FastDFS(T&S)

# 上傳解壓
cd /home/fdfs
tar zxvf fastdfs-5.11.tar.gz
cd fastdfs-5.11
# 編譯安裝
./make.sh && ./make.sh install 
# 安裝成功後,會在etc目錄下生成fdfs配置文件目錄

4.fastdfs-nginx-module(S)

1、fastdfs-nginx-module 作用說明
FastDFS 通過 Tracker 服務器,將文件放在 Storage 服務器存儲, 但是同組存儲服務器之間需要進入文件複製, 有同步延遲的問題。假設 Tracker 服務器將文件上傳到了 192.168.1.1,上傳成功後文件 ID已經返回給客戶端。此時 FastDFS 存儲集羣機制會將這個文件同步到同組存儲 192.168.1.2,在文件還沒有複製完成的情況下,客戶端如果用這個文件 ID 在 192.168.1.2 上取文件,就會出現文件無法訪問的錯誤。而 fastdfs-nginx-module 可以重定向文件連接到源服務器取文件,避免客戶端由於複製延遲導致的文件無法訪問錯誤。(解壓後的 fastdfs-nginx-module 在 nginx 安裝時使用)

FastDFS和nginx的關聯模塊,解決組內同步延遲問題

# 上傳解壓
cd /home/fdfs
tar zxvf fastdfs-nginx-module-1.20.tar.gz

高版本FastDFS將/usr/local/include改成了/usr/include,需要修改配置,否則nginx添加fastdfs-nginx-module模塊時會報錯

vi /home/fdfs/fastdfs-nginx-module-1.20/src/config
# 修改以下內容(高版本FastDFS將/usr/local/include改成了/usr/include)
ngx_module_incs="/usr/include/fastdfs /usr/include/fastcommon/"
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"

5.安裝nginx(T&S)

1.安裝nginx依賴
# 上傳解壓
cd /home/fdfs
tar zxvf pcre-8.38.tar.gz
cd pcre-8.38
./configure
make -j4 && make install
2.安裝nginx
# 上傳解壓
cd /home/fdfs
tar zxvf nginx-1.16.0.tar.gz
cd /home/fdfs/nginx-1.16.0
# 添加fastdfs-nginx-module模塊
./configure --prefix=/home/fdfs/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/home/fdfs/pcre-8.38 --add-module=/home/fdfs/fastdfs-nginx-module-1.20/src 
# -j4啓用4個線程,-j8啓用8個線程,加快安裝速度
make -j4 && make install
# 啓動nginx服務
cd /home/fdfs/nginx-1.16.0/nginx/sbin
./nginx
# 驗證服務是否啓動成功
netstat -ntlp | grep nginx
3.nginx自啓
chmod u+x /etc/rc.local
vi /etc/rc.local
# 在sleep 1s 後面加
sudo -u fdfs /home/fdfs/nginx/sbin/nginx

配置:

1.準備配置文件

# 配置文件準備
cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
# 客戶端文件,測試用
cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf 
# 供nginx訪問使用
cp /home/fdfs/fastdfs-5.11/conf/http.conf /etc/fdfs/ 
# 供nginx訪問使用
cp /home/fdfs/fastdfs-5.11/conf/mime.types /etc/fdfs/ 

2.配置Tracker(T:tracker.conf)

創建Tracker數據目錄

# 用於保存tracker的data和log
mkdir /home/fdfs/fastdfs_tracker

配置tracker(tracker默認使用22122端口)

vi /etc/fdfs/tracker.conf
# 配置可用
disabled=false 
# tracker服務器端口(默認22122,一般不修改)
port=22122 
# 存儲日誌和數據的根目錄
base_path=/home/fdfs/fastdfs_tracker
# 默認端口是8080(該端口要和tracker節點上nginx配置端口相同)
http.server_port=80 
# 採用輪詢策略進行存儲(0:輪詢,1:始終定向到某個group,2:負載進行存儲文件(選擇最大剩餘空間的組上傳))
# 輪詢方便測試,負載均衡需要容量到一定大小數據纔會到其他group
store_lookup=0

# 白名單配置,可以防止別人惡意上傳文件(可以配置多行)
# allow_hosts=192.168.1.1

# 白名單配置本機IP,storage無法正常啓動
# allow_hosts=192.168.1.[128-130]

啓動tracker

/etc/init.d/fdfs_trackerd start

查看服務

netstat -unlpt | grep fdfs
ps aux | grep fdfs

查看日誌

cat /home/fdfs/fastdfs_tracker/logs/trackerd.log

tracker自啓動

service fdfs_trackerd start
service fdfs_trackerd restart
service fdfs_trackerd stop
chkconfig --add fdfs_trackerd
#自啓動tracker服務
chkconfig fdfs_trackerd on

報錯28:沒有足夠的存儲空間

注意FastDFS中有預留空間的概念,在tracker.conf中設置,配置項爲:reserved_storage_space,缺省值爲4GB,即預留4GB的空間。請酌情設置reserved_storage_space這個參數,比如可以設置爲磁盤總空間的20%左右。

3.配置Storage(S:storage.conf)

創建文件存儲路徑,用於保存storage的data和log

mkdir /home/fdfs/fastdfs_storage
mkdir /home/fdfs/fastdfs_storage_data

配置storage.conf(storage默認使用23000端口)

vi /etc/fdfs/storage.conf
# 配置當前storage節點屬於的group
group_name=group1
# storage服務端口(默認23000,一般不修改)
port=23000 
#################################################
## Storage3和Storage4修改爲group_name=group2    ##
## Storage3和Storage4修改爲port=23001           ##
#################################################
# 配置storage存放日誌的路徑
base_path=/home/fdfs/fastdfs_storage
# 配置storage文件存儲路徑
store_path0=/home/fdfs/fastdfs_storage_data
# 多個tracker服務器IP和端口換行
tracker_server=192.168.1.1:22122
tracker_server=192.168.1.2:22122
# http訪問文件的端口(默認8888,看情況修改,和nginx中保持一致)
http.server_port=8888 
# 白名單配置,可以防止別人惡意上傳文件(可以配置多個)
# allow_hosts=192.168.1.1
# allow_hosts=192.168.1.[128-130]

修復官方fdfs_storaged文件BUG

vi /etc/init.d/fdfs_storaged
# /usr/bin/fdfs_storaged執行文件需要加配置文件和命令
# /usr/bin/fdfs_storaged
# Usage: /usr/bin/fdfs_storaged <config_file> [start | stop | restart]

# 1.註釋掉這一段,不同系統兼容有問題
# Source function library.
#if [ -f /etc/init.d/functions ]; then
#  . /etc/init.d/functions
#fi

# 2.start方法中缺少start
start() {
        echo -n "Starting FastDFS storage server: "
        $CMD start &
        RETVAL=$?
        echo
        return $RETVAL
}

啓動storage

/etc/init.d/fdfs_storaged start

查看服務

netstat -unlpt | grep fdfs
ps aux | grep fdfs

查看日誌

cat /home/fdfs/fastdfs_storage/logs/storaged.log

storage自啓動

service fdfs_storaged start
service fdfs_storaged restart
service fdfs_storaged stop
chkconfig --add fdfs_storaged
#自啓動storage服務
chkconfig fdfs_storaged on

4.配置nginx訪問

1.配置fastdfs-nginx-module(S:mod_fastdfs.conf)

作用:重定向文件連接到源服務器取文件,避免客戶端由於複製延遲導致的文件無法訪問錯誤。

# 複製fastdfs-nginx-module配置文件
cp /home/fdfs/fastdfs-nginx-module-1.20/src/mod_fastdfs.conf /etc/fdfs

配置mod_fastdfs.conf

vi /etc/fdfs/mod_fastdfs.conf
# 配置storage存放日誌的路徑
base_path=/home/fdfs/fastdfs_storage
# tracker服務器IP和端口
tracker_server=192.168.1.1:22122
tracker_server=192.168.1.2:22122
# 當前機器的storage的端口
storage_server_port=23000
# 當前機器storage的group名稱
group_name=group1
# 請求路徑使用分組(默認爲false)
url_have_group_name=true
# 配置storage文件存儲路徑
store_path0=/home/fdfs/fastdfs_storage_data
# 集羣中group的數量
group_count=2
[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/home/fdfs/fastdfs_storage_data

[group2]
group_name=group2
storage_server_port=23000
store_path_count=1
store_path0=/home/fdfs/fastdfs_storage_data

創建軟連接:爲了nginx能夠訪問儲存路徑的時候能直接訪問到M00的數據

ln -s /home/fdfs/fastdfs_storage_data/data/ /home/fdfs/fastdfs_storage_data/data/M00

2.配置Storage上nginx(S:nginx.conf)

每個Storage節點上都可以在本機上通過nginx訪問文件

vi /home/fdfs/nginx-1.16.0/nginx/conf/nginx.conf

監聽8888 端口值是要與/etc/fdfs/storage.conf中的 http.server_port=8888 相對應,因爲 http.server_port 默認爲 8888,如果想改成 80,則要對應修改過來。

#添加如下配置
server {
	# 該端口爲storage.conf中的http.server_port相同
    listen       8888;    
    server_name  localhost;
    location ~/group[1-2]/M00 {
        ngx_fastdfs_module;
        # 跨域配置
        add_header Access-Control-Allow-Origin *;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
    root   html;
    }
}

啓動nginx

#啓動nginx
/usr/local/nginx/sbin/nginx
#重啓nginx
/usr/local/nginx/sbin/nginx -s reload
#停止nginx
/usr/local/nginx/sbin/nginx -s stop
# 驗證服務是否啓動成功
netstat -ntlp | grep nginx
# 查看本機端口監聽情況
netstat -ntulp

3.配置Tracker上nginx(T:nginx.conf)

在tracker上安裝的nginx主要爲了提供http訪問的反向代理、負載均衡以及緩存服務

vi /home/fdfs/nginx-1.16.0/nginx/conf/nginx.conf
#設置 group1 的服務器
upstream fdfs_group1 {
	server 192.168.1.3:8888 weight=1 max_fails=2 fail_timeout=30s;
	server 192.168.1.4:8888 weight=1 max_fails=2 fail_timeout=30s;
}
#設置 group2 的服務器
upstream fdfs_group2 {
	server 192.168.1.5:8888 weight=1 max_fails=2 fail_timeout=30s;
	server 192.168.1.6:8888 weight=1 max_fails=2 fail_timeout=30s;
}

server {
	# 該端口爲tracker.conf中的http.server_port相同
    listen       80;    
    server_name  localhost;
    
    #設置 group 的負載均衡參數
    location /group1/M00 {
        proxy_pass http://fdfs_group1;
    }
    location /group2/M00 {
        proxy_pass http://fdfs_group2;
    }
    
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
    root   html;
    }
}

加入ngx_cache_purge(加入緩存模塊)

TODO

啓動nginx

#啓動nginx
/usr/local/nginx/sbin/nginx
#重啓nginx
/usr/local/nginx/sbin/nginx -s reload
#停止nginx
/usr/local/nginx/sbin/nginx -s stop
# 驗證服務是否啓動成功
netstat -ntlp | grep nginx
# 查看本機端口監聽情況
netstat -ntulp

5.測試:

1.查看集羣狀態

在啓動stroage的任意一臺機器上都可以查看集羣狀態

/usr/bin/fdfs_monitor  /etc/fdfs/storage.conf
# server_count:Tracker數量
# group count:group數量

2.測試文件上傳

配置client

vi /etc/fdfs/client.conf
base_path=/home/fdfs/fastdfs_storage_data
# tracker服務器IP和端口
tracker_server=192.168.1.1:22122
tracker_server=192.168.1.2:22122
# 白名單配置,可以防止別人惡意上傳文件(可以配置多個)
# allow_hosts=192.168.1.[128-130]

測試

# 上傳文件
fdfs_upload_file /etc/fdfs/client.conf /home/fdfs/win.png
返回ID表示成功 如:
group1/M00/00/00/rBKje113a2SAIqQlAABBJ3Ss-7w749.png

在storage節點中查找文件,所有的group累加纔是全量數據,同一個group中數據相同

# 文件先從這個路徑開始存儲:/home/fdfs/fastdfs_storage_data/data/00/00/
find /home/fdfs/ -name rBKje113BraAdeOvAAgy3XO_IeI058.pdf -print
find /home/fdfs/ -name rBKjdV13cRGAeCNXAABBJ3Ss-7w445.png -print

3.測試文件訪問

# 192.168.1.3
curl http://192.168.1.3:8888/group1/M00/00/00/rBKje113BraAdeOvAAgy3XO_IeI058.pdf
# 192.168.1.4
curl http://192.168.1.4:8888/group1/M00/00/00/rBKje113BraAdeOvAAgy3XO_IeI058.pdf
# 192.168.1.5
curl http://192.168.1.5:8888/group1/M00/00/00/rBKjdV13cRGAeCNXAABBJ3Ss-7w445.png
# 192.168.1.6
curl http://192.168.1.6:8888/group1/M00/00/00/rBKjdV13cRGAeCNXAABBJ3Ss-7w445.png

6.其他:

FastDFS服務器端運行時目錄結構如下:
  ${base_path}
    |__data:存放數據文件
    |__logs:存放日誌文件
其中,${base_path}由配置文件中的參數“base_path”設定。

一、tracker server
tracker server目錄及文件結構:
  ${base_path}
    |__data
    |     |__storage_groups.dat:存儲分組信息
    |     |__storage_servers.dat:存儲服務器列表
    |__logs
          |__trackerd.log:tracker server日誌文件
數據文件storage_groups.dat和storage_servers.dat中的記錄之間以換行符(\n)分隔,字段之間以西文逗號(,)分隔。
storage_groups.dat中的字段依次爲:
  1. group_name:組名
  2. storage_port:storage server端口號
storage_servers.dat中記錄storage server相關信息,字段依次爲:
  1. group_name:所屬組名
  2. ip_addr:ip地址
  3. status:狀態
  4. sync_src_ip_addr:向該storage server同步已有數據文件的源服務器
  5. sync_until_timestamp:同步已有數據文件的截至時間(UNIX時間戳)
  6. stat.total_upload_count:上傳文件次數
  7. stat.success_upload_count:成功上傳文件次數
  8. stat.total_set_meta_count:更改meta data次數
  9. stat.success_set_meta_count:成功更改meta data次數
  10. stat.total_delete_count:刪除文件次數
  11. stat.success_delete_count:成功刪除文件次數
  12. stat.total_download_count:下載文件次數
  13. stat.success_download_count:成功下載文件次數
  14. stat.total_get_meta_count:獲取meta data次數
  15. stat.success_get_meta_count:成功獲取meta data次數
  16. stat.last_source_update:最近一次源頭更新時間(更新操作來自客戶端)
  17. stat.last_sync_update:最近一次同步更新時間(更新操作來自其他storage server的同步)

二、storage server
storage server目錄及文件結構:
  ${base_path}
    |__data
    |     |__.data_init_flag:當前storage server初始化信息
    |     |__storage_stat.dat:當前storage server統計信息
    |     |__sync:存放數據同步相關文件
    |     |     |__binlog.index:當前的binlog(更新操作日誌)文件索引號
    |     |     |__binlog.###:存放更新操作記錄(日誌)
    |     |     |__${ip_addr}_${port}.mark:存放向目標服務器同步的完成情況
    |     |
    |     |__一級目錄:256個存放數據文件的目錄,目錄名爲十六進制字符,如:00, 1F
    |           |__二級目錄:256個存放數據文件的目錄,目錄名爲十六進制字符,如:0A, CF
    |__logs
          |__storaged.log:storage server日誌文件
.data_init_flag文件格式爲ini配置文件方式,各個參數如下:
  # storage_join_time:本storage server創建時間
  # sync_old_done:本storage server是否已完成同步的標誌(源服務器向本服務器同步已有數據)
  # sync_src_server:向本服務器同步已有數據的源服務器IP地址,沒有則爲空
  # sync_until_timestamp:同步已有數據文件截至時間(UNIX時間戳)
storage_stat.dat文件格式爲ini配置文件方式,各個參數如下:
  # total_upload_count:上傳文件次數
  # success_upload_count:成功上傳文件次數
  # total_set_meta_count:更改meta data次數
  # success_set_meta_count:成功更改meta data次數
  # total_delete_count:刪除文件次數
  # success_delete_count:成功刪除文件次數
  # total_download_count:下載文件次數
  # success_download_count:成功下載文件次數
  # total_get_meta_count:獲取meta data次數
  # success_get_meta_count:成功獲取meta data次數
  # last_source_update:最近一次源頭更新時間(更新操作來自客戶端)
  # last_sync_update:最近一次同步更新時間(更新操作來自其他storage server)
binlog.index中只有一個數據項:當前binlog的文件索引號
binlog.###,###爲索引號對應的3位十進制字符,不足三位,前面補0。索引號基於0,最大爲999。一個binlog文件最大爲1GB。記錄之間以換行符(\n)分隔,字段之間以西文空格分隔。字段依次爲:
  1. timestamp:更新發生時間(Unix時間戳)
  2. op_type:操作類型,一個字符
  3. filename:操作(更新)的文件名,包括相對路徑,如:5A/3D/FE_93_SJZ7pAAAO_BXYD.S
${ip_addr}_${port}.mark:ip_addr爲同步的目標服務器IP地址,port爲本組storage server端口。例如:10.0.0.1_23000.mark。文件格式爲ini配置文件方式,各個參數如下:
  # binlog_index:已處理(同步)到的binlog索引號
  # binlog_offset:已處理(同步)到的binlog文件偏移量(字節數)
  # need_sync_old:同步已有數據文件標記,0表示沒有數據文件需要同步
  # sync_old_done:同步已有數據文件是否完成標記,0表示未完成,1表示已完成
  # until_timestamp:同步已有數據截至時間點(UNIX時間戳)
  # scan_row_count:已掃描的binlog記錄數
  # sync_row_count:已同步的binlog記錄數
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章