1、背景
FastDFS 是一款開源的、分布式文件系統(Distributed File System),由淘寶開發平台部資深架構師余慶開發。該開源項目的主頁是 http://code.google.com/p/fastdfs 。可以通過 fastdfs.sourceforge.net 下載。FastDFS論壇是 http://www.csource.org ,目前是指向 ChinaUnix 開源項目孵化平台的一個板塊 FastDFS,網址為 bbs.chinaunix.net/forum-240-1.html 。(摘自 http://blog.csdn.net/poechant/article/details/6977407)
2、上傳流程
我們可以通過 FastDFS 對文件的上傳過程,來初步了解 FastDFS 的基本架構。首先客戶端 client 發起對 FastDFS 的文件傳輸動作,是通過連接到某一台 Tracker Server 的指定端口來實現的,Tracker Server 根據目前已掌握的信息,來決定選擇哪一台 Storage Server ,然后將這個Storage Server 的地址等信息返回給 client,然后 client 再通過這些信息連接到這台 Storage Server,將要上傳的文件傳送到給 Storage Server上。
上傳流程簡述:
- 1、client詢問tracker上傳到的storage,不需要附加參數;
- 2、tracker返回一台可用的storage;
- 3、client直接和storage通訊完成文件上傳。
下載流程簡述:
- 1、client詢問tracker下載文件的storage,參數為文件標識(組名和文件名);
- 2、tracker返回一台可用的storage;
- 3、client直接和storage通訊完成文件下載。
3、架構簡析
FastDFS 是包括一組 Tracker Server 和 Storage Server 的。Tracker Server 與 Storage Server 之間不直接通信,其基本的信息由配置文件在系統啟動加載時獲知。多台 Tracker Server 之間保證了 Tracker 的分布式,Tracker Server 之間是對等的,防止了單點故障。 Storage Server 是分成多個 Group,每個 Group 中的Storage 都是互相備份的,也就是說,如果 Group1 有 Storage1、Storage2、Storage3,其容量分別是100GB、100GB、100GB,那么 Group1 的存儲能力是 100GB,而不是 300GB,這就是互相備份的意思。進一步說,整個 Group 的存儲能力由該組中該儲能力最小的 Storage 決定。多個 Group 之間的存儲方式,可以采用 round robin(輪訓)、load balanced(負載均衡)或指定 Group 的方式。
術語
FastDFS兩個主要的角色:Tracker Server 和 Storage Server
Tracker Server:跟蹤服務器,主要負責調度storage節點與client通信,在訪問上起負載均衡的作用,和記錄storage節點的運行狀態,是連接client和storage節點的樞紐。
Storage Server:存儲服務器,保存文件和文件的meta data(元數據)
Group:文件組,也可以稱為卷。同組內服務器上的文件是完全相同的,做集群時往往一個組會有多台服務器,上傳一個文件到同組內的一台機器上后,FastDFS會將該文件即時同步到同組內的其它所有機器上,起到備份的作用。
meta data:文件相關屬性,鍵值對(Key Value Pair)方式,如:width=1024, height=768。和阿里雲OSS的meta data相似。
5、安裝環境准備
提示:本例安裝目標為:一台虛擬機(centos 7)安裝部署一個 tracker 和一個組 group1(其中包含兩個 storage)
linux 基礎環境:centos 7 minimal(官方歷史版本:http://vault.centos.org/)
相關源碼包(此處省略通過 ftp 傳送源碼包,有興趣的可移步至:)
- fastdfs-nginx-module_v1.16.tar.gz (nginx 依賴包https://sourceforge.net/projects/fastdfs/files/FastDFS%20Nginx%20Module%20Source%20Code/)
- FastDFS_v5.05.tar.gz (本例使用5.05版本,官方歷史版本:https://sourceforge.net/p/fastdfs/activity?source=project_activity)
- libfastcommonV1.0.7.tar.gz(FastDFS依賴包,官方下載地址:https://sourceforge.net/projects/fastdfs/files/FastDFS%20Nginx%20Module%20Source%20Code/)
- nginx-1.7.8.tar.gz
- ngx_cache_purge-2.1.tar.gz (nginx 圖片緩存,http://labs.frickle.com/nginx_ngx_cache_purge/)
- perl-5.20.2.tar.gz(因為從 linux 系統直接下載網速太慢,所以提前准備,上傳到 linux 再安裝,官方歷史版本下載地址:http://www.cpan.org/src/ 吐嘈一下 cnds 上的選手,源碼又不是你開發的,你掛就掛吧,下載還還要積分,呵呵。)
linux 中需要事先准備相關程序(linux 聯網直接安裝)
yum -y install gcc (必須在最開始的環境里就已經安裝了,否則上面的源碼包安裝過程會出錯)
yum -y install gcc-c++(必須在最開始的環境里就已經安裝了,否則上面的源碼包安裝過程會出錯)
yum -y install vim (可選擇,文本編輯器)
perl-5.20.2
nginx 負載均衡環境部署先的依賴程序准備
- yum install gcc-c++
- yum install -y pcre pcre-devel
- yum install -y zlib zlib-devel
- yum install -y openssl openssl-devel
6、文件夾初始化
創建 tracker 所需的文件夾 base_path:mkdir /opt/fastdfs_tracker
創建 storage所需的日志目錄:mkdir /opt/fastdfs_storage_info (這個目錄是用來記錄 storage 同步文件的日志)
創建 storage 存儲所需的文件目錄:mkdir /opt/fastdfs_storage_data (此目錄存儲文件)
7、 安裝 libfastcommon-1.0.7
解壓:tar -zxvf libfastcommonV1.0.7.tar.gz
進入安裝文件夾:cd libfastcommon-1.0.7
依次執行 make 命令:./make.sh 和 ./make.sh install
從安裝記錄可以看出:安裝路徑為 /usr/lib64,但是FastDFS主程序設置的默認安裝目錄是lib目錄:/usr/local/lib,所以要創建連接:
- ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so
- ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so
- ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so (先創建着,后面會使用到)
- ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so (先創建着,后面會使用到)
8、安裝 FastDFS-5.0.5
解壓 tar 包:tar -zxvf FastDFS_v5.05.tar.gz
進入安裝文件夾:cd FastDFS
依次執行 make 命令:./make.sh 和 ./make.sh install
安裝過程沒有錯誤提示,再檢查 /etc/fdfs 目錄中是否含有以下文件,如果有則安裝成功:
9、配置 tracker
9.1 進入 /etc/fdfs 文件夾,執行如下命令: cp tracker.conf.sample tracker.conf
9.2 編輯 tracker.conf 文件:vim tracker.conf
9.3 具體配置信息:
a. disabled=false # 啟用配置文件
b. port=22122 # 設置 tracker 端口好,一般采用默認端口 22122
c. base_path=/opt/fastdfs_tracker # 設置 tracker 的數據文件和日志目錄
d. http.server_port=80 # fastdfs5.0.5版本沒有,保險起見,這里設置成 80 端口
其他配置信息保持默認,不用動。
9.4 啟動 tracker: /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
檢測是否啟動成功:
方法1: netstat -unltp|grep fdfs ,看 22122 端口監聽情況
方法2: 通過命令查看 tracker 啟動日志:tail -100f /opt/fastdfs_tracker/logs/trackerd.log
9.5 如果成功啟動 tracker,將啟動命令添加到服務器的開機啟動配置中:
vim /etc/rc.d/rc.local
在文本中添加這行,並保存:/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
10、配置 stroage(和 trcker 配置類似)
10.1 進入 /etc/fdfs 文件夾,執行命令: cp storage.conf.sample storage.conf
10.2 編輯 storage.conf 文件,執行命令: vim storage.conf
10.3 具體配置信息:
a. disabled=false #啟用配置文件
b. group_name=group1 #組名,這里本例只配置一組,所以命名為 group1
c. port=23000 #這里設置 storage 端口號,23000是默認端口,同一個組的 storage 端口號必須一致
d. base_path=/opt/fastdfs_storage_info #記錄 storage 日志(預先已經創建的文件夾)
e. store_path_count=1 #存儲的路徑個數,個數需要和 store_path 的個數一致
f. store_path0=/opt/fastdfs_storage_data #存儲路徑,這里是一個 group1 組配置了兩個 storage
store_path1=/opt/fastdfs_storage_data
g. tracker_server=192.168.25.131:22122 # tracker 服務器的 ip 和端口號,本 ip 是本 linux的 ip
h. http.server_port=80 # 設置 http 端口號,fastdfs-5.0.5 這個版本已經不用配置,保險起見,就配置一下吧
10.4 啟動 tracker:/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
檢測是否啟動成功:
方法1: netstat -unltp|grep fdfs ,看 23000 端口監聽情況(配置的是 什么端口就監聽哪個端口)
方法2: 通過命令查看 tracker 啟動日志:tail -100f /opt/fastdfs_storage_info/logs/storage.log
啟動成功之后,可以通過 fdfs_monitor 查看集群情況:stroage 是否已經注冊到服務器中:
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf # 查看192.168.25.131:23000 是 “ ACTIVE ”狀態即可
10.5 啟動沒有問題,則將 stroage 啟動命令配置到服務器啟動項里: vim /etc/rc.d/rc.local
添加這行命令,並保存: /usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
===================================分割線====================================
以上安裝配置步驟就是 fastdfs 的配置。
storage 中安裝 nginx 目的是為了提供 http 的訪問服務,同時解決 group 和 storage 同步延遲問題,
tracker 中安裝 nginx 目的是為了提供 http 訪問的反向代理、負載均衡及緩存服務。
===================================分割線====================================
11、nginx 安裝前的環境准備
yum install -y gcc # 前面步驟已安裝,略過
yum install -y gcc-c++ # 前面步驟已安裝,略過
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
yum install -y openssl openssl-devel
12、 在 storage 中安裝 nginx
12.1 創建 nginx 默認安裝文件夾: mkdir /usr/local/nginx
12.2 解壓 tar 包:
tar -zxvf nginx1.7.8.tar.gz # 得到 nginx-1.7.8 文件目錄
tar -zxvf fastdfs-nginx-module_v1.16.tar.gz # 得到 fastdfs-nginx-module 文件目錄
12.3 修改 fastdfs-nginx-module 文件目錄中的 config 文件:
cd /fastdfs-nginx-module/src
vim config
將 CORE_INCS中 的參數路徑修改一下,local 全部不要: CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
12.4 建立軟連接,在第七步驟中已經創建,可略過:
ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so (第七步驟中已經創建,可略過)
ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so (第七步驟中已經創建,可略過)
12.5 進入nginx 安裝文件夾:cd nginx-1.7.8
執行命令:./configure --prefix=/usr/local/nginx --add-module=/usr/local/src/fastdfs-nginx-module/src
備注:執行命令中的 add-module 參數為 fastdfs-nginx-module 文件目錄路徑,這里是 /usr/local/src 目錄下的。
命令執行完畢之后,依次執行 make 和 make install,沒有錯誤提示表示安裝成功。
12.6 執行命令 cd /usr/local/nginx/conf, 編輯 vim nginx.conf 文件:
在 http 語句塊中將 listen 修改成:listen 80;
在 server 語句塊中添加:
location /group1/M00 {
root/fdfs/storage/data;
ngx_fastdfs_module;
}
注意:這里 group 組名是上面配置的 group1,要和第 10 步驟的 10.3 步驟中的配置組信息一致
如果 nginx 成功啟動,瀏覽器不能訪問,就在 nginx.conf 這個配置文件中,把第一行的注解打開,配置成:user root; 即可。
12.7 執行命令:cd /usr/local/rsrc/FastDFS/conf ,將 conf 文件夾目錄下的 http.conf 和 mime.types 復制到 /etc/fdfs/ 下,
cp http.conf /etc/fdfs/
cp mime.types /etc/fdfs/
如果不執行這個操作,啟動 nginx 會報異常
12.8 執行命令:cd/usr/local/rsrc/fastdfs-nginx-module/src
將 conf 文件夾下的 mod_fastdfs.conf 文件復制到 /etc/fdfs/下:cp mod_fastdfs.conf /etc/fdfs/
12.9 在 /etc/fdfs/ 文件目錄下,打開編輯:vim mod_fastdfs.conf
a. base_path=/opt/fastdfs_storage_info # 保存日志目錄
b. tracker_server=192.168.25.131:22122 # tracker的ip和端口
c. storage_server_port=23000 # storage服務器的端口號
d. group_name=group1 #當前服務器的 group名稱
e. url_have_group_name= true # 文件 url中是否有 group名稱
f. store_path_count=2 #存儲路徑個數,必須和 下面的store_path個數一致
g. store_path0=/opt/fastdfs_storage_data #文件存儲路徑
store_path1=/opt/fastdfs_storage_data #本例設置了兩個stroage,和第 10 步驟的 10.3 步驟配置一致
h. http.need_find_content_type=true #從文件擴展名查找文件類型,這個配置 fastdfs-5.0.5沒有,保險起見,還是配置吧
i. group_count= 1 # 設置組的個數 這里設置了一個組 group1 所以配置為 1
j. 在配置信息的最后,將注解的 group 信息展開,這里設置的是一個組,所以只配置一個:
注意組的名稱 端口 存儲路徑個數 和存儲路徑
12.10 創建軟連接: ln -s /opt/fastdfs_storage_data/data /opt/fastdfs_storage_data/data/M00
12.11 啟動 nginx:/usr/local/nginx/sbin/nginx
提示:/usr/local/nginx/sbin/nginx -s stop # 停止nginx
檢查是否啟動成功:netstat -anp | grep 80,如果有寬口沖突,也可以檢測到,kill -9 對應的pid 即可。
啟動成功只會提示一個 pid,需要自己通過瀏覽器驗證。
常見問題:
如果上面配置都完整無誤,瀏覽器還是無法訪問,則可以 ping 一下網絡,再 telnet 一下端口,很有可能是防火牆的問題:
添加開放端口 firewall-cmd --zone=public --add-port=80/tcp --permanent (--permanent永久生效,沒有此參數重啟后失效)
刪除開放端口 firewall-cmd --zone=public --remove-port=80/tcp --permanent
添加或者刪除開放端口之后需要更新防火牆規則: firewall-cmd --reload
查看所有打開的端口: firewall-cmd --zone=public --list-ports 或者 firewall-cmd --list-services
顯示防火牆狀態是否運行:firewall-cmd --state 或者 systemctl status firewalld.service
用了一天時間,折騰好幾次,又是重裝系統又是查資料的,感覺能這么細致的講解的真不多,於是就想把這個心得寫下來,讓讀者們少走坑。
通過 java 代碼測試一番,成功!
13、tracker 中安裝 nginx
待續…