Centos 7.X部署分佈式文件系統:FastDFS+Nginx

1、FastDFS簡介

1.1 介紹

  • FastDFS是一個開源的,高性能的的分佈式文件系統,他主要的功能包括:文件存儲,同步和訪問,設計基於高可用和負載均衡,FastDFS非常適用於基於文件服務的站點,例如圖片分享和視頻分享網站。

  • FastDFS它是一個輕量級的開源分佈式文件系統,主要解決了大容量的文件存儲和高併發訪問的問題,文件存取時實現了負載均衡。 

  • 支持存儲服務器在線擴容,支持相同的文件只保存一份,節約磁盤。 

  • FastDFS只能通過Client API訪問,不支持POSIX訪問方式。 

  • FastDFS適合中大型網站使用,用來存儲資源文件(如:圖片、文檔、視頻等)


1.2 FastDFS組成

tracker server

跟蹤服務器:用來調度來自客戶端的請求。且在內存中記錄所有存儲組和存儲服務器的信息狀態。

storage server

存儲服務器:用來存儲文件(data)和文件屬性(metadata)

client

客戶端:業務請求發起方,通過專用接口基於TCP協議與tracker以及storage server進行交互

group

組,也可稱爲卷:同組內上的文件是完全相同的

文件標識

包括兩部分:組名和文件名(包含路徑)

meta data

文件相關屬性:鍵值對(Key Value Pair)方式

fid

文件標識符: (例如: group1/M00/00/00/CgEOxVegXB2AdYafAAAB0b8tBbQ9155303 )

  • group1:存儲組的組名;上傳完成後,需要客戶端自行保存 

  • M00:服務器配置的虛擬路徑,與磁盤選項store_path#對應 

  • 00/00:兩級以兩位16進制數字命名的目錄 

  • CgEOxVegXB2AdYafAAAB0b8tBbQ9155303:文件名,與原文件名並不相同;由storage server根據特定信息生成。文件名包含:源存儲服務器的IP地址、文件創建時間戳、文件大小、隨機數和文件擴展名等


1.3 FastDFS同步機制

  • 同一組內的storage server之間是對等的,文件上傳、刪除等操作可以在任意一臺storage server上進行; 

  • 文件同步只在同組內的storage server之間進行,採用push方式,即源服務器同步給目標服務器; 

  • 源頭數據才需要同步,備份數據不需要再次同步,否則就構成環路了;  

    提示:上述第二條規則有個例外,就是新增加一臺storage server時,由已有的一臺storage server將已有的所有數據(包括源頭數據和備份數據)同步給該新增服務器。


1.4 FastDFS特性

指標
說明
系統簡潔性
很簡潔,只有兩個角色:tracker、storage
系統性能很高、沒有使用數據庫,文件同步直接點對點,不經過tracker中轉
系統穩定性

高、C語言開發,可支持高併發和負載

RAID方式
分組(組內冗餘),具有很高的靈活性
通信協議專有協議,下載文件支持HTTP
屬性(meta,data)
支持
相同內容文件只保存一份
支持
下載文件時支持文件偏移量
支持


2、背景

    在這裏,我用3臺服務器集羣部署,這3臺服務器都要部署nginx+fastdfs以及相關模塊。3臺服務器部署方式都一樣,只不過storage服務器有些配置會不同,部署的過程中請大家看清楚在哪裏操作,過程有點麻煩,請大家一定要有耐心,一步一步走下去部署是OK的。


2.1  環境說明

172.18.18.111(tracker服務器): nginx、fastdfs(運行tracker、storage)、fastfds其它模塊

172.18.18.112(storage服務器):nginx、fastdfs(運行storage)、fastfds其它模塊

172.18.18.113(storage服務器):nginx、fastdfs(運行storage)、fastfds其它模塊


2.2 軟件包、安裝路徑

準備的軟件包:

nginx-1.9.3.tar.gz

lua-5.1.4.tar.gz

libfastcommon-1.0.35.zip

fastdfs-master.zip

LuaJIT-2.1.0-beta2.tar.gz

v0.2.19.tar.gz

GraphicsMagick-1.3.25.tar.gz

GraphicsMagick-1.3.25.tar

安裝的路徑:

服務目錄
nginx/usr/local/nginx/
fastdfs配置

/etc/fdfs/

fastdfs

/usr/local/fastDFS/

Storage_data

/usr/local/fastDFS/storage/
安裝包/usr/src


3、部署FastDFS

3.1、安裝libfastcommon(tracker和storage服務器操作)

    安裝fastDFS前,首先下載最新版本的libfastcommon進行安裝,上傳至/usr/src目錄中。下載地址https://github.com/happyfish100/libfastcommon/releases

  • 解壓、配置和編譯:


#cd /usr/src/

#unzip libfastcommon-1.0.35.zip

#cd libfastcommon-1.0.35/

#./make.sh

#./make.sh install

提示:確認make沒有錯誤後,執行安裝,64位系統默認會複製到/usr/lib64下。


  • 設置環境變量、創建軟鏈接:

#export LD_LIBRARY_PATH=/usr/lib64/

#ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so


3.2、安裝fastdfs(tracker和storage服務器操作)

    下載最新版本的fastDFS,上傳至/usr/src/目錄中。下載地址:https://github.com/happyfish100/fastdfs

  • 解壓、編譯:


#cd /usr/src/

#unzip fastdfs-master.zip

#cd fastdfs-master/

#./make.sh

#./make.sh install


提示:確認make沒有錯誤後,執行安裝,默認會安裝到/usr/bin中,以及會在/etc/fdfs生成以.sample結尾的4個文件,如下所示:

#ll /etc/fdfs/

-rw-r--r-- 1 root root 1461 Aug 12 15:48 client.conf.sample

-rw-r--r-- 1 root root 7927 Aug 12 15:48 storage.conf.sample

-rw-r--r-- 1 root root  105 Aug 12 15:48 storage_ids.conf.sample

-rw-r--r-- 1 root root 7389 Aug 12 15:48 tracker.conf.sample


# ll /usr/bin/fdfs_*

-rwxr-xr-x 1 root root  317432 Aug 12 15:48 /usr/bin/fdfs_appender_test

-rwxr-xr-x 1 root root  317208 Aug 12 15:48 /usr/bin/fdfs_appender_test1

-rwxr-xr-x 1 root root  304064 Aug 12 15:48 /usr/bin/fdfs_append_file

-rwxr-xr-x 1 root root  303800 Aug 12 15:48 /usr/bin/fdfs_crc32

-rwxr-xr-x 1 root root  304120 Aug 12 15:48 /usr/bin/fdfs_delete_file

-rwxr-xr-x 1 root root  304856 Aug 12 15:48 /usr/bin/fdfs_download_file

-rwxr-xr-x 1 root root  304448 Aug 12 15:48 /usr/bin/fdfs_file_info

-rwxr-xr-x 1 root root  322360 Aug 12 15:48 /usr/bin/fdfs_monitor

-rwxr-xr-x 1 root root 1111640 Aug 12 15:48 /usr/bin/fdfs_storaged

-rwxr-xr-x 1 root root  327376 Aug 12 15:48 /usr/bin/fdfs_test

-rwxr-xr-x 1 root root  326592 Aug 12 15:48 /usr/bin/fdfs_test1

-rwxr-xr-x 1 root root  453880 Aug 12 15:48 /usr/bin/fdfs_trackerd

-rwxr-xr-x 1 root root  305048 Aug 12 15:48 /usr/bin/fdfs_upload_appender

-rwxr-xr-x 1 root root  306072 Aug 12 15:48 /usr/bin/fdfs_upload_file


3.3 配置tracker服務器(在tracker服務器操作)

  • 複製tracker樣例配置文件,並重命名

#cd /etc/fdfs/

#cp tracker.conf.sample tracker.conf


  • 修改tracker配置文件


#vim tracker.conf

bind_addr=172.18.18.111     #綁定服務IP,如果不填則表示所有的

port=22122            #提供服務的端口

base_path=/usr/local/fastDFS    #存儲日誌和數據的根目錄

store_group=group1    #設當上一個參數設定爲1 時 (store_lookup=1,即指定組名時),必須設置本參數爲系統中存在的一個組名。如果選擇其他的上傳方式,這個參數就沒有效了。

store_server=1     #選擇哪個storage server 進行上傳操作,1表示根據ip 地址進行排序選擇第一個服務器(IP地址最小者)

download_server=1         #選擇哪個 storage server 作爲下載服務器,1表示哪個爲源storage server 就用哪一個

http.server_port=80        #HTTP服務端口,默認爲8080,你也可以不用改,但是測試訪問你要帶8080端口訪問

其它參數保留默認配置, 具體配置解釋可參考官方文檔說明:http://bbs.chinaunix.net/thread-1941456-1-1.html


  • 創建bash_path指定路徑


#mkdir /usr/local/fastDFS/

#mkdir -p /usr/local/fastDFS/storage/data


3.4 配置storage服務器(tracker和storage服務器操作)

  • 複製storage樣例配置文件,並重命名:


#cd /etc/fdfs/
#cp storage.conf.sample  storage.conf


  • 修改tstorage配置文件

#vim storage.conf

group_name=group1                       #指定此 storage server 所在 組

bind_addr=                              #綁定服務IP,可以不用填寫(如果是tracker服務器,也可以配置tracker服務器自身IP地址)

base_path=/usr/local/fastDFS            #儲日誌和數據的根目錄

store_path0=/usr/local/fastDFS/storage  #第1個存儲目錄

tracker_server=172.18.18.111:22122      #tracker服務器的IP和端口,如果有多個tracker服務器可以寫多行

http.server_port=80                     #HTTP服務端口,默認爲8888,你也可以不用改,但是測試訪問你要帶8080端口訪問

其它參數保留默認配置, 具體配置解釋可參考官方文檔說明:http://bbs.chinaunix.net/thread-1941456-1-1.html


3. 5修改tracker服務器客戶端配置文件(tracker服務器操作)

  • 複製client樣例配置文件,並重命名

#cd /etc/fdfs/

#cp client.conf.sample  client.conf


  • 修改client.conf配置文件:

#cd /etc/fdfs/

#cp client.conf.sample client.conf

#vim client.conf

base_path=/usr/local/fastDFS              #修改路徑

tracker_server=172.18.18.111:22122    #tracker服務器IP和端口,有多個tracker服務器可以寫多條配置


4、文件上傳測試

4.1 啓動tracker服務(tracker服務器操作)

#/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf


檢查FastDFS Tracker Server是否啓動成功:

#ps -ef | grep fdfs_trackerd

root     27077 25738  0 15:11 pts/2    00:00:00 grep --color=auto fdfs_trackerd

root     31854     1  0 Nov20 ?        00:02:34 /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf



4.2 啓動storage服務(tracker和storage服務器操作)

    到了這裏,有些朋友可能會問我,爲什麼我啓動storage服務也要在tracker服務器上操作呢?大家有沒有注意,我在2.1的步驟中,就聲明瞭tracker服務器同時運行(tracker、storage)這兩個服務,所以不要覺得奇怪。

# /usr/bin/fdfs_storaged /etc/fdfs/storage.conf

# ps -ef | grep fdfs_storaged

root     27234 25738  0 15:15 pts/2    00:00:00 grep --color=auto fdfs_storaged

root     31863     1  0 Nov20 ?        00:03:37 /usr/bin/fdfs_storaged /etc/fdfs/storage.conf


4.3 執行文件上傳(tracker服務器操作)

  • 我先放張測試圖片(test.jpg)至/home目錄下:


#ll /home

drwx------. 14 admin admin    4096 Apr 22  2017 admin

-rw-r--r--   1 root  root  4121391 Dec  7 17:13 test.jpg


  • 使用fdfs_test命令來測試上傳,格式如下:


#fdfs_test /etc/fdfs/client.conf upload  /home/test.jpg 

This is FastDFS client test program v5.11


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.csource.org/ 

for more detail.


[2017-12-27 15:20:21] DEBUG - base_path=/usr/local/fastDFS, connect_timeout=30, 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=172.18.18.111, port=23000


group_name=group1, ip_addr=172.18.18.111, port=23000

storage_upload_by_filename

group_name=group1, remote_filename=M00/00/12/rBISb1pDSbWAeUGaAD7jL_Zyu6I957.jpg

source ip address: 172.18.18.111

file timestamp=2017-12-27 15:20:21

file size=4121391

file crc32=4134714274

example file url: http://172.18.18.111/group1/M00/00/12/rBISb1pDSbWAeUGaAD7jL_Zyu6I957.jpg

storage_upload_slave_by_filename

group_name=group1, remote_filename=M00/00/12/rBISb1pDSbWAeUGaAD7jL_Zyu6I957_big.jpg

source ip address: 172.18.18.111

file timestamp=2017-12-27 15:20:21

file size=4121391

file crc32=4134714274

example file url: http://172.18.18.111/group1/M00/00/12/rBISb1pDSbWAeUGaAD7jL_Zyu6I957_big.jpg


如下圖的結果,能返回文件ID,說明圖片上傳成功:

image.png

說明:剛纔把test.jpg的圖片上傳至fastdfs了,如果要用瀏覽器訪問測試上面給出的url地址,還需要安裝nginx服務。


  • 用fdfs_delete_file命令來測試刪除(這裏我不做刪除的測試了,我下面還要用到這張上傳的圖片),如下操作:

# fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/12/rBISb1pDSbWAeUGaAD7jL_Zyu6I957.jpg


4、安裝LuaJIT、nginx-lua-module、GraphicsMagick模塊(tracker和storage服務器操作)

4.1 安裝LuaJIT

  • 下載最新的LuaJIT,然後上傳至/usr/src目錄下:


#cd /usr/src

#wget http://luajit.org/download/LuaJIT-2.1.0-beta2.tar.gz


  • 解壓、配置:


# tar zxf LuaJIT-2.1.0-beta2.tar.gz

# cd LuaJIT-2.1.0-beta2

# make

# make install


4.2 安裝nginx_devel_kit(NDK)模塊

  • 下載最新的nginx_devel_kit模塊,然後上傳至/usr/src目錄下:


#cd /usr/src

# wget http://luajit.org/download/LuaJIT-2.1.0-beta2.tar.gz


  • 解壓、配置:


# tar zxf LuaJIT-2.1.0-beta2.tar.gz

# cd LuaJIT-2.1.0-beta2

# make

# make install


4.3 安裝lua_nginx_module模塊

  • 下載最新的nginx_devel_module模塊,然後上傳至/usr/src目錄:


#cd /usr/src

# wget https://github.com/openresty/lua-nginx-module/archive/v0.10.2.tar.gz


4.4 安裝GraphicsMagick模塊(免費的圖片編輯、合成等功能的軟件)

  • 下載最新的GraphicsMagick模塊,然後上傳至/usr/src目錄:


#cd /usr/src

#wget ftp://ftp.graphicsmagick.org/pub/GraphicsMagick/1.3/GraphicsMagick-1.3.5.tar.gz


  • 安裝ImageMagick依賴包:


# yum -y install libpng-devel libpng

# yum -y install libjpeg-devel libjpeg

# yum -y install libtool-ltdl libtool-ltdl-devel

#yum -y install ImageMagick ImageMagick-devel



  • 編譯、配置:


# cd GraphicsMagick-1.3.25

# ./configure

#make && make install


PS:
將會默認在一下目錄中安裝相應文件:

    /usr/local/bin

    /usr/local/include

    /usr/local/lib

    /usr/local/share

提示:整個第4步可根據公司的業務情況來增加這些模塊,如果你們公司不需要用到這些模塊,這一步可以省略......


5、安裝fastdfs-nginx-module模塊(在所有storage節點安裝,相當於在tracker和storage服務器操作)

5.1 fastdfs-nginx-module作用說明

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


5.2 下載fastdfs-nginx-module

下載最新的fastdfs-nginx-module,然後上傳至/usr/src目錄下:

#cd /usr/src

#wget https://github.com/happyfish100/fastdfs-nginx-module/archive/master.zip

#unzip master


5.3 安裝nginx依賴包

#yum -y install gcc gcc-c++ make automake autoconf libtool pcre* zlib openssl openssl-devel


5.3 編譯安裝nginx(把剛纔幾個模塊編譯添加進去)

# cd /usr/src

#tar -zxvf nginx-1.9.3.tar.gz

# cd nginx-1.9.3

# ./configure --prefix=/usr/local/nginx --user=www --group=www \

--with-http_stub_status_module \

--with-http_realip_module \

--with-pcre  \

--with-http_ssl_module \

--with-stream  \

--add-module=/usr/src/fastdfs/ngx_devel_kit-0.2.19/ \

--add-module=/usr/src/fastdfs/lua-nginx-module-0.10.2/ \

--add-module=/usr/src/fastdfs/fastdfs-nginx-module-master/src

#make

#make install

如果出現如下錯誤:

./configure: error: ngx_http_lua_module requires the Lua library.

解決:

  • 安裝lua的相關依賴:yum install readline-dev readline-devel

  • 安裝lua5.1:


下載lux5.1的包

# tar -zxvf lua-5.1.4.tar.gz

# cd lua-5.1.4

# make linux test

# make install


然後在重新:

./configure

make &&  make install


5.4 複製fastdfs-nginx-module 源碼中的配置文件到/etc/fdfs 目錄,並修改

#cp /usr/src/fastdfs-nginx-module/src/mod_fastdfs.conf      /etc/fdfs/

#vim /etc/fdfs/mod_fastdfs.conf

修改以下內容:

base_path=/usr/local/fastDFS                          #存儲數據庫根目錄

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

url_have_group_name = true                            #url中包含group名稱

store_path0=/usr/local/fastDFS/storage

log_filename=/usr/local/fastDFS/logs/mod_fastdfs.log  #mod_fastdfs日記存放路徑

group_count = 1


在文件末尾添加:

[group1]

group_name=group1

storage_server_port=23000

store_path_count=1

store_path0=/usr/local/fastDFS/storage

#手動創建mod_fastdfs.log日誌文件

#touch  /usr/local/fastDFS/log/mod_fastdfs.lo


5.5 複製 fastdfs-mast的部分配置文件到/etc/fdfs 目錄

#cd /usr/src/fastdfs-master/conf

#cp http.conf mime.types /etc/fdfs/


5.6 nginx配置、啓動

  • 創建www用戶


#groupadd www

#useradd -g www www


  • 修改fastDFS目錄屬組權限:


#chown  -R www:www /usr/local/fastDFS/


  • 修改nginx.conf文件:

#vim /usr/local/nginx/conf/nginx.conf

user  www;

worker_processes  auto;


server {

        listen       80;

        server_name  localhost;

        location / {

            root   html;

            index  index.php index.html index.htm;

        

        location /group1/M00 {

        ngx_fastdfs_module;

        alias /usr/local/fastDFS/storage/data;

        set $image_root "/usr/local/fastDFS/storage/data";

     

        if ($uri ~ "/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/(.*)") {

            set $image_dir "$image_root/$3/$4/";

            set $image_name "$5";

            set $file "$image_dir$image_name";

        }

        if ($image_name ~ "([a-zA-Z0-9_\-]+)_([0-9]+x[0-9]+|water)?(q[0-9]{1,2})?.([a-zA-Z0-9]+)") {

            set $a  "$1";

            set $b  "$2";

            set $c  "$3";

            set $d  "$4";

            set $e  "$5";

            set $f  "$6";

            set $file "$file";

        }

       

        }

}

說明: 

 A、/etc/fdfs/storage.conf 中的配置 http.server_port=8888 ,默認端口是8888,我改成 80,如果大家沒有修改這個默認端口,那麼nginx配置監聽的端口也要改成8888。

 B、Storage 對應有多個 group 的情況下,訪問路徑帶 group 名,如/group1/M00/00/00/xxx, 對應的 Nginx 配置爲:

     location ~/group([0-9])/M00 {

         ngx_fastdfs_module;

}


  • 啓動nginx服務:


#/usr/local/nginx/sbin/nginx  -t

ngx_http_fastdfs_set pid=6715

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok

nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful


#/usr/local/nginx/sbin/nginx


6、用http的方式測試剛纔上傳的圖片

http://172.18.18.111/group1/M00/00/12/rBISb1pDSbWAeUGaAD7jL_Zyu6I957_big.jpg

測試如下圖所示:

image.png

到這裏有點難爲情了,上面這張是筆者自己的照片,在電腦上隨手拿了一張圖片就上傳了,唯一一張圖片,當然,讀者朋友們覺得很帥的話也可以收藏起來,哈哈!!


然後,我們來測試一下圖片能不能裁剪(前提條件是你要配置了4.4的操作步驟),修改下面紅色的字體爲裁剪的大小,然後在瀏覽器中訪問:

http://172.18.18.111/group1/M00/00/12/rBISb1pDSbWAeUGaAD7jL_Zyu6I957_400x400.jpg

image.png

通過上圖可以看到,我這裏可以把上傳的圖片進行裁剪,圖片確實裁剪小了,是OK的。


7、fastDFS一些簡單操作命令

#重啓storage服務:

# /usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart


#重啓tracker服務:

# /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart


#關閉storage服務:

# killall fdfs_storaged


#關閉tracker服務:

# killall fdfs_trackered


#查看集羣狀態:

#/usr/bin/fdfs_monitor   /etc/fdfs/storage.conf    


#上傳操作:

#fdfs_test  /etc/fdfs/client.conf  upload  文件具體url


#刪除操作:

#fdfs_delete_file  /etc/fdfs/client.conf  上傳後的路徑

比如:

#fdfs_delete_file  /etc/fdfs/client.conf group1/M00/00/00/ZciEZlepkl6Abj28AAAPOSSdASU225_big.gif)


8、Java API 客戶端配置

1.前往GitHub下載Java_client代碼。https://github.com/fzmeng/fastdfs.client

2.在你的項目src/java/resources 下加入文件 fastdfs_client.conf

注意修改tracker服務器Ip地址:

connect_timeout = 2

network_timeout = 30

charset = ISO8859-1

http.tracker_http_port = 80

http.anti_steal_token = no

tracker_server=172.18.18.111:22122

default_group_name=group1


當然,還有php及其它客戶端連接到fastdfs,我就不挨個介紹了,感興趣的朋友可以自行百度或留言討論,最後要感謝張秋方大師筆者才能才能順利完成此篇文稿。


參考文章:

https://blog.51cto.com/xinzong/1834466

https://github.com/qieangel2013/nginxLuaGmFastdfs

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