FastDFS +Nginx實現動態縮略

一、FastDFS是什麼?

FastDFS是一款開源的輕量級分佈式文件系統純C實現,支持Linux、FreeBSD等UNIX系統類google FS,不是通用的文件系統,只能通過專有API訪問,目前提供了C、Java和PHP API爲互聯網應用量身定做,她對文件進行管理,功能包括:文件存儲、文件同步、文件訪問(文件上傳、文件下載)等,解決了大容量文件存儲問題,追求高性能和高擴展性FastDFS可以看做是基於文件的key value pair存儲系統,稱作分佈式文件存儲服務更爲合適。
特別適合以文件爲載體的在線服務,如相冊網站、視頻網站等等。

FastDFS服務端有兩個角色:跟蹤器(tracker)和存儲節點(storage)。跟蹤器主要做調度工作,在訪問上起負載均衡的作用。

存儲節點存儲文件,完成文件管理的所有功能:存儲、同步和提供存取接口,FastDFS同時對文件的meta data進行管理。所謂文件的meta data就是文件的相關屬性,以鍵值對(key value pair)方式表示,如:width=1024,其中的key爲width,value爲1024。文件meta data是文件屬性列表,可以包含多個鍵值對。

二、相關術語釋義:

tracker-server:
跟蹤服務器, 主要做調度工作, 起負載均衡的作用。 在內存中記錄集羣中所有存儲組和存儲服務器的狀態信息, 是客戶端和數據服務器交互的樞紐。 相比GFS中的master更爲精簡, 不記錄文件索引信息, 佔用的內存量很少。

storage-server:
存儲服務器( 又稱:存儲節點或數據服務器) , 文件和文件屬性( metadata) 都保存到存儲服務器上。 Storage server直接利用OS的文件系統調用管理文件。

group:
組, 也可稱爲卷。 同組內服務器上的文件是完全相同的 ,同一組內的storage server之間是對等的, 文件上傳、 刪除等操作可以在任意一臺storage server上進行 。

meta data:
meta data:文件相關屬性,鍵值對( Key Value Pair) 方式,如:width=1024,heigth=768 。

三、FastDFS系統結構如下圖所示:

FastDFS系統結構

跟蹤器和存儲節點都可以由一臺或多臺服務器構成。跟蹤器和存儲節點中的服務器均可以隨時增加或下線而不會影響線上服務。其中跟蹤器中的所有服務器都是對等的,可以根據服務器的壓力情況隨時增加或減少。

爲了支持大容量,存儲節點(服務器)採用了分卷(或分組)的組織方式。存儲系統由一個或多個卷組成,卷與卷之間的文件是相互獨立的,所有卷 的文件容量累加就是整個存儲系統中的文件容量。一個卷可以由一臺或多臺存儲服務器組成,一個卷下的存儲服務器中的文件都是相同的,卷中的多臺存儲服務器起 到了冗餘備份和負載均衡的作用。

在卷中增加服務器時,同步已有的文件由系統自動完成,同步完成後,系統自動將新增服務器切換到線上提供服務。

當存儲空間不足或即將耗盡時,可以動態添加捲。只需要增加一臺或多臺服務器,並將它們配置爲一個新的卷,這樣就擴大了存儲系統的容量。
FastDFS中的文件標識分爲兩個部分:卷名和文件名,二者缺一不可。

四、上傳下載文件交互過程:

FastDFS file upload
上傳文件交互過程:

client詢問tracker上傳到的storage,不需要附加參數;
tracker返回一臺可用的storage;
client直接和storage通訊完成文件上傳。

FastDFS file download
下載文件交互過程:

client詢問tracker下載文件的storage,參數爲文件標識(卷名和文件名);
tracker返回一臺可用的storage;
client直接和storage通訊完成文件下載。
需要說明的是,client爲使用FastDFS服務的調用方,client也應該是一臺服務器,它對tracker和storage的調用均爲服務器間的調用。

五、配置要求:
1、下載的安裝包路徑 /usr/local/src/

2、使用兩臺服務器,其中一臺做tracker和storage,另一臺僅僅做storage

3、在兩臺storage中進行輪巡存儲,每臺服務器設置一個group,分別爲group1和group2

如下:
tracker+storage 192.168.110.114 group1
storage 192.168.110.113 group2

六、配置安裝:

group1+ group2
1 cd /udr/local/src
2 systemctl stop firewalld
setenforce 0 #關閉防火牆和沙盒和selinux
vi /etc/selinux/config
將 SELINUX=disabled
reboot
getenforce //驗證
3安裝依賴包和開發工具
yum –y install pcre* pcre-* gcc-c++ gcc* zlib zlib-devel openssl openssl-devel gc-devel gd gd-devel git unzip
4 安裝lib套件-安裝libfastcommon
git clone https://github.com/happyfish100/libfastcommon.git
cd libfastcommon
./make.sh
echo $?
./make.sh install
echo $?
5 設置軟連接
ln -s /usr/lib64/libfastcommon.so /usr/lib/
ln -s /usr/lib64/libfastcommon.so /usr/local/lib/
ln -s /usr/lib64/libfastcommon.so /usr/local/lib64/
ln -s /usr/lib64/libfdfsclient.so /usr/lib/
ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/
ln -s /usr/lib64/libfdfsclient.so /usr/local/lib64/
6 安裝fastdfs
unzip FastDFS.zip
cd fastdfs-master
./make.sh
./ make.sh install
cp –r /usr/local/src/fastdfs-master/conf/* /etc/fdfs/
cd /etc/fdfs

FastDFS安裝完成之後,所有配置文件在/etc/fdfs目錄下,
即可通過ls-l /etc/fdfs/查看
tracker需要tracker.conf配置文件,
storage需要storage.conf配置文件。

group 1:
1 配置tracker配置文件
vim /etc/fdfs/track.conf
//修改以下內容
bind_addr=192.168.110.114 #綁定tracker的地址,tracker和storage爲同一臺服務器
port=22122 # 端口
base_path=/data/server/fastdfs
store_lookup=0 #0爲輪巡
store_group=group1 #該服務器爲group1
store_server=0 #0爲輪巡
use_storage_id=true #這裏使用組id而不是ip地址
id_type_in_filename=id
2 vim /etc/fdfs/storage_ids.conf
100001 group1 192.168.110.114
100002 group2 192.168.110.113
3 配置client配置文件
vim /etc/fdfs/client.conf
base_path=/data/server/fastds_client
tracker_server=192.168.110.114:22122
use_storage_id = true
4 配置storage配置文件
vim /etc/fdfs/storage.conf
group_name=group1
bind_addr=192.168.110.114
base_path=/data/server/fastdfs_storage
store_path0=/data/server/fastdfs_storage
tracker_server=192.168.110.114:22122
5 創建相關目錄
mkdir –p /data/server/fastdfs_client
mkdir –p /data/server/fastdfs_storage
mkdir –p /data/server/fastdfs
mkdir /data/server/fastdfs_tracker

group2:
1 vim /etc/fdfs/storage_ids.conf
100001 group1 192.168.117.130
100002 group2 192.168.117.131
2 vim /etc/fdfs/storage.conf
group_name=group2
bind_addr=192.168.110.113
base_path=/data/server/fastdfs_storage
store_path0=/data/server/fastdfs_storage
tracker_server=192.168.110.114:22122
3 mkdir –p /data/server/fastdfs_storage

group1+ group2
1 cd /usr/local/src/
2 tar -zxvf fastdfs-nginx-module_v1.16.tar.gz
vim /usr/local/src/ fastdfs-nginx-module /src/config
//修改爲 CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"

group1
安裝nginx,解壓fastdfs_nginx_module,然後編譯安裝nginx,加上此模塊一起編譯
1 cd /usr/local/src/
tar -zxvf fastdfs_nginx_module.tar.gz
2 tar zxf nginx-1.10.0.tar.gz
cd nginx-1.10.0
3 ./configure --prefix=/data/server/nginx --add-module=/usr/local/src/fastdfs-nginx-module/src --with-http_gunzip_module --with-pcre --with-http_image_filter_module --with-http_stub_status_module echo $?
make
echo $?
make install
echo $?
在這裏插入圖片描述
編譯安裝nginx時遇到的問題:

問題一:
In file included from /data/server/fastdfs-nginx-module/src/ngx_http_fastdfs_module.c:6:0:
/data/server/fastdfs-nginx-module/src/common.c:21:25: 致命錯誤:fdfs_define.h:沒有那個文件或目錄
#include “fdfs_define.h”
答案:
編譯中斷。

原因:編譯安裝nginx的fastdfs插件的頭文件沒有找到,由於編譯nginx時候系統會到/usr/local/include,而編譯安裝fastdfs-nginx-module時則默認保存在了/usr/include目錄。

修復:ln -s /usr/include/fast* /usr/local/include/

解決方法一:
ln -s /usr/include/fast* /usr/local/include/
解決方法二,修改配置文件中一個地方(建議用此方法,最好在編譯前先修改好,就不會出錯了):
vim /usr/local/src/fastdfs-nginx-module/src/config
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"

然後重新進行上一步./configure 步驟。

開始編譯
#make
如果沒有問題就開始install
#make install

3 編輯nginx配置文件
vim /data/server/nginx/conf/nginx.conf
//在server模塊下添加
location /photo {
rewrite “/photo/path=M00/(\w+)/(\w+)/x=(\d+)&(\d+)/(.+).(png|jpg|gif)” /group1/M00/$1/$2/$5_$3x$4.$6;
}

location ~* /group1/M00/(\w+)/(\w+)/(.+)_(\d+)x(\d+).(png|jpg|gif){
root “/data/server/nginx/html/”;
ngx_fastdfs_module;
set $iw “$4”;
set $ih “$5”;
image_filter resize $iw $ih;
image_filter_buffer 2M;
try_files /group1/M00/$1/$2/$3.$6 /404.html;
}

  location /group1/M00 {
           root "/data/server/nginx/html";
           ngx_fastdfs_module;
  }

 location = /favicon.ico {
           log_not_found off;
            access_log off;
 }

cd /data/server/nginx/sbin
./nginx
4 mkdir –p /data/server/nginx/html/group1
ln –s /data/server/fastdfs_storage/data /data/server/nginx/html/group1/M00
5 修改mod_fastdfs.conf
先複製文件到/etc/fdfs目錄下:
cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/

vim /etc/fdfs/mod_fastdfs.conf
use_storage_id = true
tracker_server=192.168.110.114:22122
url_have_group_name = true
group_name=group1
store_path0=/data/server/fastdfs_storage
[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/data/server/fastdfs_storage

group2:
1 mkdir –p /data/server/nginx/html/group2
ln –s /data/server/fastdfs_storage/data /data/server/nginx/html/group2/M00
2 cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
vim /etc/fdfs/mod_fastdfs.conf
use_storage_id = true
tracker_server=192.168.110.114:22122
url_have_group_name = true
group_name=group1
store_path0=/data/server/fastdfs_storage
[group2]
group_name=group2
storage_server_port=23000
store_path_count=1
store_path0=/data/server/fastdfs_storage

group1:
1 cd /usr/local/src/nginx/sbin
./nginx
2 fdfs_trackerd /etc/fdfs/tracker.conf
fdfs_storaged /etc/fdfs/storage.conf

group2:
fdfs_storaged /etc/fdfs/storage.conf

group1:
fdfs_upload_file /etc/fdfs/client.conf /etc/fdfs/xxx.jpg

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