天天看點

分布式檔案系統FastDFS部署

一、簡介

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

二、FastDFS的架構

圖1展示的是FastDFS的系統架構。

分布式檔案系統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所示。檔案上傳流程的步驟如下:

分布式檔案系統FastDFS部署

圖2 檔案上傳流程

分布式檔案系統FastDFS部署

圖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' &gt;&gt; /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' &gt;&gt; /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,如需轉載請自行聯系原作者