一、簡介
FastDFS是一款類Google FS的開源分布式檔案系統,它用純C語言實作,支援Linux、FreeBSD、AIX等UNIX系統。它隻能通過專有API對檔案進行存取通路,不支援POSIX接口方式,不能mount使用。準确地講,Google FS以及FastDFS、mogileFS、HDFS、TFS等類Google FS都不是系統級的分布式檔案系統,而是應用級的分布式檔案存儲服務。
二、FastDFS的架構
圖1展示的是FastDFS的系統架構。

圖1 FastDFS的系統架構
從圖1可以看出,Tracker server之間互相獨立,不存在直接聯系。
用戶端和Storage server主動連接配接Tracker server。Storage server主動向Tracker server報告其狀态資訊,包括磁盤剩餘空間、檔案同步狀況、檔案上傳下載下傳次數等統計資訊。Storage server會連接配接叢集中所有的Tracker server,向他們報告自己的狀态。Storage server啟動一個單獨的線程來完成對一台Tracker server的連接配接和定時報告。需要說明的是,一個組包含的Storage server不是通過配置檔案設定的,而是通過Tracker server擷取到的。
不同組的Storage server之間不會互相通信,同組内的Storage server之間會互相連接配接進行檔案同步。
Storage server采用binlog檔案記錄檔案上傳、删除等更新操作。binlog中隻記錄檔案名,不記錄檔案内容。
檔案同步隻在同組内的Storage server之間進行,采用push方式,即源頭伺服器同步給目标伺服器。隻有源頭資料才需要同步,備份資料并不需要再次同步,否則就構成環路了。有個例外,就是新增加一台Storage server時,由已有的一台Storage server将已有的所有資料(包括源頭資料和備份資料)同步給該新增伺服器。
Storage server中由專門的線程根據binlog進行檔案同步。為了最大程度地避免互相影響以及出于系統簡潔性考慮,Storage server對組内除自己以外的每台伺服器都會啟動一個線程來進行檔案同步。
檔案同步采用增量同步方式,系統記錄已同步的位置(binlog檔案偏移量)到辨別檔案中。辨別檔案名格式:{dest storage IP}_{port}.mark,例如:192.168.1.14_23000.mark。
三、檔案上傳和下載下傳的互動過程
接下來我們一起看一下檔案上傳和下載下傳的互動過程。檔案上傳和下載下傳流程分别如圖2、圖3所示。檔案上傳流程的步驟如下:
圖2 檔案上傳流程
圖3 檔案下載下傳流程
1. Client詢問Tracker server上傳到的Storage server;
2. Tracker server傳回一台可用的Storage server,傳回的資料為該Storage server的IP位址和端口;
3. Client直接和該Storage server建立連接配接,進行檔案上傳,Storage server傳回新生成的檔案ID,檔案上傳結束。
檔案下載下傳流程的步驟如下:
1. Client詢問Tracker server可以下載下傳指定檔案的Storage server,參數為檔案ID(包含組名和檔案名);
2. Tracker server傳回一台可用的Storage server;
3. Client直接和該Storage server建立連接配接,完成檔案下載下傳。
四、ip位址配置設定(本文預設關閉防火牆)
1.172.16.8.8 nginx tracker
2.172.16.8.9 storage1
3.172.168.8.10 storage2
備注:所有的下載下傳位址為http://sourceforge.net/projects/fastdfs/files/?source=navbar
五、安裝tracker
1.安裝
1
2
3
4
5
6
7
<code># wget </code>
<code># tar xf download </code>
<code># cd FastDFS/</code>
<code># ./make.sh 運作檔案</code>
<code>有報錯資訊</code>
<code>compilation terminated.</code>
<code>make</code><code>: *** [..</code><code>/common/fdfs_global</code><code>.o] Error 1</code>
2.檢視官方文檔,需要安裝libfastcommon
<code> </code>
<code> </code><code># wget https://github.com/happyfish100/libfastcommon/archive/master.zip</code>
<code> </code><code># unzip master.zip </code>
<code> </code><code># cd libfastcommon-master/</code>
<code> </code><code># ./make.sh</code>
<code> </code><code># ./make.sh install</code>
3.繼續安裝FastDFS
<code> </code><code># cd FastDFS/</code>
4.配置
<code># cd /etc/fdfs/</code>
<code># cp tracker.conf.sample tracker.conf</code>
<code>修改配置檔案</code>
<code>disabled=</code><code>false</code> <code>#啟用配置檔案</code>
<code>port=22122 </code><code>#設定tracker的端口号</code>
<code>base_path=</code><code>/data/fastdfs/trackerd</code> <code>#設定tracker的資料檔案和日志目錄(需預先建立)</code>
<code>http.server_port=18080 </code><code>#設定http端口号</code>
5.啟動
<code># mkdir -p /data/fastdfs/trackerd</code>
<code># /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart</code>
<code>設定開機啟動</code>
<code># echo '/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart' >> /etc/rc.d/rc.local</code>
六、安裝storage(兩台都一樣,本出給出一台配置)
1.安裝 與tracker 安裝步驟相同
2.配置
8
<code>disabled=</code><code>false</code> <code>#啟用配置檔案 </code>
<code>group_name=group1 </code><code>#組名,根據實際情況修改</code>
<code>port=23000 </code><code>#設定storage的端口号</code>
<code>base_path=</code><code>/data/fastdfs/storage</code> <code>#設定storage的日志目錄(需預先建立) </code>
<code>store_path_count=1 </code><code>#存儲路徑個數,需要和store_path個數比對 </code>
<code>store_path0=</code><code>/data/fastdfs/storage</code> <code>#存儲路徑</code>
<code>tracker_server=172.16.8.8:22122 </code><code>#tracker伺服器的IP位址和端口号 </code>
<code>http.server_port=18888 </code><code>#設定http端口号</code>
3.啟動
<code># mkdir -p /data/fastdfs/storage</code>
<code># /usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart</code>
<code># echo '/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart' >> /etc/rc.d/rc.local</code>
4.檢視狀态
<code>/usr/bin/fdfs_monitor</code> <code>/etc/fdfs/storage</code><code>.conf</code>
七、在storage安裝nginx
在storage上安裝nginx主要為了提高http的通路服務,同時解決group中的storage服務的同步延遲問題
9
10
11
12
13
14
15
<code># tar xf download.1 </code>
<code> </code><code>3.解決報錯</code>
<code> </code><code>make</code><code>的時候會報一下錯誤,</code>
<code> </code><code>root</code><code>/fastdfs-nginx-module/src//common</code><code>.c:21:25: fatal error: fdfs_define.h: No such </code><code>file</code> <code>or directory</code>
<code> </code><code>#include "fdfs_define.h"</code>
<code> </code><code>^</code>
<code>make</code><code>[1]: *** [objs</code><code>/addon/src/ngx_http_fastdfs_module</code><code>.o] Error 1</code>
<code>解決辦法:</code>
<code> </code><code>vim </code><code>/root/fastdfs-nginx-module/src/config</code>
<code> </code><code>CORE_INCS=</code><code>"$CORE_INCS /usr/local/include/fastdfs /usr/local/include/fastcommon/"</code>
<code> </code><code>CORE_LIBS=</code><code>"$CORE_LIBS -L/usr/lib -lfastcommon -lfdfsclient"</code>
<code> </code><code>重新編譯,安裝即可</code>
16
17
18
19
<code># cp /root/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/.</code>
<code># cp /root/FastDFS/conf/http.conf /etc/fdfs/.</code>
<code>/root/FastDFS/conf/mime</code><code>.types </code><code>/etc/fdfs/</code><code>.</code>
<code>修改nginx的配置檔案 </code>
<code>server {</code>
<code> </code><code>listen 18888;</code>
<code> </code><code>server_name localhost;</code>
<code> </code><code>location ~</code><code>/group1/M00</code> <code>{</code>
<code> </code><code>root </code><code>/fdfs/storage/data</code><code>;</code>
<code> </code><code>ngx_fastdfs_module;</code>
<code>}</code>
<code> </code><code>error_page 500 502 503 504 </code><code>/50x</code><code>.html;</code>
<code> </code><code>location = </code><code>/50x</code><code>.html {</code>
<code> </code><code>root </code><code>/usr/share/nginx/html</code><code>;</code>
<code> </code><code>}</code>
6.啟動nginx
八、在tracker安裝nginx
在tracker上安裝的nginx主要為了提供http通路的反向代理、負載均衡已經緩存服務
1.安裝配置與storage上相同
2.配置負載功能
20
21
22
<code>upstream fdfs_group3 { </code>
<code>server 172.16.1.207:8080 weight=1 max_fails=2 fail_timeout=30s; </code>
<code>server 172.16.1.208:8080 weight=1 max_fails=2 fail_timeout=30s; </code>
<code> </code><code>} </code>
<code> </code>
<code>server { </code>
<code>#</code>
<code>設定伺服器端口</code>
<code>listen 8080; </code>
<code>設定</code>
<code>group1</code>
<code>的負載均衡參數</code>
<code>location </code><code>/group1/M00</code> <code>{ </code>
<code> </code><code>proxy_next_upstream http_502 http_504 error timeout invalid_header; </code>
<code>proxy_cache http-cache; </code>
<code> </code><code>proxy_cache_valid 200 304 12h; </code>
<code> </code><code>proxy_cache_key $uri$is_args$args; </code>
<code> </code><code>proxy_pass http:</code><code>//fdfs_group1</code><code>; </code>
<code>expires 30d;</code>
九。測試
<code>cd</code> <code>/etc/fdfs/</code>
<code>cp</code> <code>client.conf.sample client.conf</code>
<code>base_path=</code><code>/data/fdfs/tracker</code> <code>#</code>
<code>日志存放路徑</code>
<code>tracker_server=172.16.8.8:22122 </code><code>#tracker</code>
<code>伺服器</code>
<code>IP</code>
<code>位址和端口号</code>
<code>http.tracker_server_port=8080 </code><code>#tracker</code>
<code>伺服器的</code>
<code>http</code>
<code>端口号</code>
<code> </code><code>上傳檔案</code>
<code> </code><code>/usr/bin/fdfs_upload_file</code> <code>/etc/fdfs/client</code><code>.conf </code><code>/root/install3</code><code>.sh </code>
<code>group1</code><code>/M00/00/00/rBAIClZB6ySAYFbtAAAGpOjLUVA6601</code><code>.sh</code>
<code>日志報錯</code>
[2015-11-10 21:04:04] ERROR - file: ../common/fdfs_global.c, line: 52, the format of filename "group1/M00/00/00/rBAIClZB6ySAYFbtAAAGpOjLUVA6601.sh" is invalid
vi /etc/fdfs/mod_fastdfs.conf
url_have_group_name = true
再次測試上傳
[root@vrvap2 fdfs]# /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /root/new.jpg
group1/M00/00/00/rBAIClZB7fWAF2BmAADCkWSm8AA128.jpg
本文轉自wangfeng7399 51CTO部落格,原文連結:http://blog.51cto.com/wangfeng7399/1711589,如需轉載請自行聯系原作者