1. 程式人生 > >FastDFS單機版安裝

FastDFS單機版安裝

kilo 依次 文件的 統計 安裝目錄 enc [1] 架構圖 tst


FastDFS

分布式文件系統

1 目標

了解項目中使用FastDFS的原因和意義。

掌握FastDFS的架構組成部分,能說出tracker和storage的作用。

了解FastDFS+nginx上傳和下載的執行流程。

掌握FastDFS+nginx在項目中作為圖片服務器,上傳和下載方法。

2 FastDFS介紹

2.1 什麽是FastDFS

FastDFS是用c語言編寫的一款開源的分布式文件系統。FastDFS為互聯網量身定制,充分考慮了冗余備份、負載均衡、線性擴容等機制,並註重高可用、高性能等指標,使用FastDFS很容易搭建一套高性能的文件服務器集群提供文件上傳、下載等服務。

2.2 FastDFS架構

FastDFS架構包括 Tracker server和Storage server。客戶端請求Tracker server進行文件上傳、下載,通過Tracker server調度最終由Storage server完成文件上傳和下載。

Tracker server作用是負載均衡和調度,通過Tracker server在文件上傳時可以根據一些策略找到Storage server提供文件上傳服務。可以將tracker稱為追蹤服務器或調度服務器。

Storage server作用是文件存儲,客戶端上傳的文件最終存儲在Storage服務器上,Storage server沒有實現自己的文件系統而是利用操作系統 的文件系統來管理文件。可以將storage稱為存儲服務器。

如下圖:

技術分享圖片

2.2.1 Tracker 集群

FastDFS集群中的Tracker server可以有多臺,Tracker server之間是相互平等關系同時提供服務,Tracker server不存在單點故障。客戶端請求Tracker server采用輪詢方式,如果請求的tracker無法提供服務則換另一個tracker。

2.2.2 Storage集群

Storage集群采用了分組存儲方式。storage集群由一個或多個組構成,集群存儲總容量為集群中所有組的存儲容量之和。一個組由一臺或多臺存儲服務器組成,組內的Storage server之間是平等關系,不同組的Storage server之間不會相互通信,同組內的Storage server之間會相互連接進行文件同步,從而保證同組內每個storage上的文件完全一致的。一個組的存儲容量為該組內存儲服務器容量最小的那個,由此可見組內存儲服務器的軟硬件配置最好是一致的。

采用分組存儲方式的好處是靈活、可控性較強。比如上傳文件時,可以由客戶端直接指定上傳到的組也可以由tracker進行調度選擇。一個分組的存儲服務器訪問壓力較大時,可以在該組增加存儲服務器來擴充服務能力(縱向擴容)。當系統容量不足時,可以增加組來擴充存儲容量(橫向擴容)。

2.2.3 Storage狀態收集

Storage server會連接集群中所有的Tracker server,定時向他們報告自己的狀態,包括磁盤剩余空間、文件同步狀況、文件上傳下載次數等統計信息。

2.2.4 文件上傳流程

技術分享圖片

客戶端上傳文件後存儲服務器將文件ID返回給客戶端,此文件ID用於以後訪問該文件的索引信息。文件索引信息包括:組名,虛擬磁盤路徑,數據兩級目錄,文件名。

技術分享圖片

n 組名:文件上傳後所在的storage組名稱,在文件上傳成功後有storage服務器返回,需要客戶端自行保存。

n 虛擬磁盤路徑:storage配置的虛擬路徑,與磁盤選項store_path*對應。如果配置了store_path0則是M00,如果配置了store_path1則是M01,以此類推。

n 數據兩級目錄:storage服務器在每個虛擬磁盤路徑下創建的兩級目錄,用於存儲數據文件。

n 文件名:與文件上傳時不同。是由存儲服務器根據特定信息生成,文件名包含:源存儲服務器IP地址、文件創建時間戳、文件大小、隨機數和文件拓展名等信息。

2.2.5 文件下載流程

技術分享圖片

tracker根據請求的文件路徑即文件ID 來快速定義文件。

比如請求下邊的文件:

技術分享圖片

1.通過組名tracker能夠很快的定位到客戶端需要訪問的存儲服務器組是group1,並選擇合適的存儲服務器提供客戶端訪問。

2.存儲服務器根據“文件存儲虛擬磁盤路徑”和“數據文件兩級目錄”可以很快定位到文件所在目錄,並根據文件名找到客戶端需要訪問的文件。

3 FastDFS+Nginx實現文件服務器

3.1 架構

3.1.1 架構圖

技術分享圖片

3.2 FastDFS--tracker安裝

在192.168.101.3上安裝tracker。

3.2.1 下載

tracker和storage使用相同的安裝包,下載地址:http://sourceforge.net/projects/FastDFS/ 或https://github.com/happyfish100/FastDFS(推薦)

本教程下載:FastDFS_v5.05.tar.gz

3.2.2 FastDFS安裝環境

FastDFS是C語言開發,建議在linux上運行,本教程使用Centos6.4作為安裝環境。

安裝FastDFS需要先將官網下載的源碼進行編譯,編譯依賴gcc環境,如果沒有gcc環境,需要安裝gcc:yum install gcc-c++

3.2.3 安裝libevent

FastDFS依賴libevent庫,需要安裝:

yum -y install libevent

3.2.4 安裝libfastcommon

libfastcommon是FastDFS官方提供的,libfastcommon包含了FastDFS運行所需要的一些基礎庫。

將libfastcommonV1.0.7.tar.gz拷貝至/usr/local/下

cd /usr/local

tar -zxvf libfastcommonV1.0.7.tar.gz

cd libfastcommon-1.0.7

./make.sh

./make.sh install

註意:libfastcommon安裝好後會自動將庫文件拷貝至/usr/lib64下,由於FastDFS程序引用usr/lib目錄所以需要將/usr/lib64下的庫文件拷貝至/usr/lib下。

要拷貝的文件如下:

技術分享圖片

3.2.5 tracker編譯安裝

將FastDFS_v5.05.tar.gz拷貝至/usr/local/下

tar -zxvf FastDFS_v5.05.tar.gz

cd FastDFS

./make.sh

./make.sh install

安裝成功將安裝目錄下的conf下的文件拷貝到/etc/fdfs/下。

技術分享圖片

3.2.6 配置

安裝成功後進入/etc/fdfs目錄:

技術分享圖片

拷貝一份新的tracker配置文件:

cp tracker.conf.sample tracker.conf

修改tracker.conf

vi tracker.conf

base_path=/home/yuqing/FastDFS

改為:

base_path=/home/FastDFS

3.2.7 啟動

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

啟動的日誌顯示先停止5619進程(實際環境不是5619)再啟動,如下圖:

技術分享圖片

註意:如果沒有顯示上圖要註意是否正常停止原有進程。

l 設置開機自動啟動。

[root@tracker FastDFS]# vim /etc/rc.d/rc.local

將運行命令行添加進文件:/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart

3.3 FastDFS--storage安裝

在192.168.101.3上安裝storage。

3.3.1 安裝libevent

同tracker安裝

3.3.2 安裝libfastcommon

同tracker安裝。

3.3.3 storage編譯安裝

同tracker編譯安裝。

3.3.4 配置

安裝成功後進入/etc/fdfs目錄:

技術分享圖片

拷貝一份新的storage配置文件:

cp storage.conf.sample storage.conf

修改storage.conf

vi storage.conf

group_name=group1

base_path=/home/yuqing/FastDFS改為:base_path=/home/FastDFS

store_path0=/home/yuqing/FastDFS改為:store_path0=/home/FastDFS/fdfs_storage

#如果有多個掛載磁盤則定義多個store_path,如下

#store_path1=.....

#store_path2=......
tracker_server=192.168.101.3:22122 #配置tracker服務器:IP

#如果有多個則配置多個tracker

tracker_server=192.168.101.4:22122

3.3.5 啟動

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

啟動的日誌顯示先停止8931進程(實際環境不是8931)再啟動,如下圖:

技術分享圖片

註意:如果沒有顯示上圖要註意是否正常停止原有進程。

l 設置開機自動啟動。

[root@storage1 FastDFS]# vim /etc/rc.d/rc.local

將運行命令行添加進文件:/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart

3.4 上傳圖片測試

3.4.1 通過fdfs_test程序

FastDFS安裝成功可通過/usr/bin/fdfs_test測試上傳、下載等操作。

修改/etc/fdfs/client.conf

base_path=/home/fastdfs

tracker_server=192.168.101.3:22122

使用格式:

/usr/bin/fdfs_test 客戶端配置文件地址 upload 上傳文件

比如將/home下的圖片上傳到FastDFS中:

/usr/bin/fdfs_test /etc/fdfs/client.conf upload /home/tomcat.png

http://192.168.101.3/group1/M00/00/00/wKhlBVVY2M-AM_9DAAAT7-0xdqM485_big.png就是文件的下載路徑。

對應storage服務器上的

/home/fastdfs/fdfs_storage/data/00/00/wKhlBVVY2M-AM_9DAAAT7-0xdqM485_big.png文件。

由於現在還沒有和nginx整合無法使用http下載。

3.4.2 通過java Client API

完整的測試方法參考測試源代碼。

public class FastdfsClientTest {

//客戶端配置文件

public String conf_filename = "F:\\workspace_indigo\\fastdfsClient\\src\\cn\\itcast\\fastdfs\\cliennt\\fdfs_client.conf";

//本地文件,要上傳的文件

public String local_filename = "F:\\develop\\upload\\linshiyaopinxinxi_20140423193847.xlsx";

//上傳文件

@Test

public void testUpload() {

for(int i=0;i<100;i++){

try {

ClientGlobal.init(conf_filename);

TrackerClient tracker = new TrackerClient();

TrackerServer trackerServer = tracker.getConnection();

StorageServer storageServer = null;

StorageClient storageClient = new StorageClient(trackerServer,

storageServer);

NameValuePair nvp [] = new NameValuePair[]{

new NameValuePair("item_id", "100010"),

new NameValuePair("width", "80"),

new NameValuePair("height", "90")

};

String fileIds[] = storageClient.upload_file(local_filename, null,

nvp);

System.out.println(fileIds.length);

System.out.println("組名:" + fileIds[0]);

System.out.println("路徑: " + fileIds[1]);

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

3.5 FastDFS 和nginx整合

3.5.1 在tracker上安裝nginx

nginx的安裝細節參考nginx文檔。

在每個tracker上安裝nginx,的主要目的是做負載均衡及實現高可用。如果只有一臺tracker服務器可以不配置nginx。

3.5.2 在Storage上安裝nginx
3.5.2.1 FastDFS-nginx-module

將FastDFS-nginx-module_v1.16.tar.gz傳至/usr/local/下

cd /usr/local

tar -zxvf FastDFS-nginx-module_v1.16.tar.gz

cd FastDFS-nginx-module/src

修改config文件將/usr/local/路徑改為/usr/

技術分享圖片

將FastDFS-nginx-module/src下的mod_FastDFS.conf拷貝至/etc/fdfs/下

cp mod_FastDFS.conf /etc/fdfs/

並修改mod_FastDFS.conf的內容:

vi /etc/fdfs/mod_FastDFS.conf

base_path=/home/FastDFS

tracker_server=192.168.101.3:22122

#tracker_server=192.168.101.4:22122(多個tracker配置多行)

url_have_group_name=true #url中包含group名稱

store_path0=/home/FastDFS/fdfs_storage #指定文件存儲路徑

將libfdfsclient.so拷貝至/usr/lib下

cp /usr/lib64/libfdfsclient.so /usr/lib/

創建nginx/client目錄

mkdir -p /var/temp/nginx/client

3.5.2.2 nginx安裝

添加FastDFS-nginx-module模塊

./configure \

--prefix=/usr/local/nginx \

--pid-path=/var/run/nginx/nginx.pid \

--lock-path=/var/lock/nginx.lock \

--error-log-path=/var/log/nginx/error.log \

--http-log-path=/var/log/nginx/access.log \

--with-http_gzip_static_module \

--http-client-body-temp-path=/var/temp/nginx/client \

--http-proxy-temp-path=/var/temp/nginx/proxy \

--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \

--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \

--http-scgi-temp-path=/var/temp/nginx/scgi \

--add-module=/root/fastdfs-nginx-module/src

make

make install

3.5.2.3 nginx配置文件

新建一個nginx配置文件nginx-fdfs.conf.

添加server:

server {

listen 80;

server_name 192.168.101.3;

location /group1/M00/{

#root /home/FastDFS/fdfs_storage/data;

ngx_fastdfs_module;

}

}

說明:

server_name指定本機ip

location /group1/M00/:group1為nginx 服務FastDFS的分組名稱,M00是FastDFS自動生成編號,對應store_path0=/home/FastDFS/fdfs_storage,如果FastDFS定義store_path1,這裏就是M01

3.5.3 測試

通過java客戶端上傳文件,使用瀏覽器訪問,比如訪問上傳圖片測試的文件:

訪問storage:

http://192.168.101.3/group1/M00/00/00/wKhlBVVY2M-AM_9DAAAT7-0xdqM485_big.png

4 附錄

4.1 tracker.conf

1 基本配置

disable

#func:配置是否生效

#valu:true、false

disable=false

bind_addr

#func:綁定IP

#valu:IP地址

bind_addr=192.168.6.102

port

#func:服務端口

#valu:端口整數值

port=22122

connect_timeout

#func:連接超時

#valu:秒單位正整數值

connect_timeout=30

network_timeout

#func:網絡超時

#valu:秒單位正整數值

network_timeout=60

base_path

#func:Tracker數據/日誌目錄地址

#valu:路徑

base_path=/home/michael/fdfs/base4tracker

max_connections

#func:最大連接數

#valu:正整數值

max_connections=256

work_threads

#func:線程數,通常設置CPU數

#valu:正整數值

work_threads=4

store_lookup

#func:上傳文件的選組方式。

#valu:0、1或2。

# 0:表示輪詢

# 1:表示指定組

# 2:表示存儲負載均衡(選擇剩余空間最大的組)

store_lookup=2

store_group

#func:指定上傳的組,如果在應用層指定了具體的組,那麽這個參數將不會起效。另外如果store_lookup如果是0或2,則此參數無效。

#valu:group1等

store_group=group1

store_server

#func:上傳服務器的選擇方式。(一個文件被上傳後,這個storage server就相當於這個文件的storage server源,會對同組的storage server推送這個文件達到同步效果)

#valu:0、1或2

# 0: 輪詢方式(默認)

# 1: 根據ip 地址進行排序選擇第一個服務器(IP地址最小者)

# 2: 根據優先級進行排序(上傳優先級由storage server來設置,參數名為upload_priority),優先級值越小優先級越高。

store_server=0

store_path

#func:上傳路徑的選擇方式。storage server可以有多個存放文件的base path(可以理解為多個磁盤)。

#valu:

# 0: 輪流方式,多個目錄依次存放文件

# 2: 存儲負載均衡。選擇剩余空間最大的目錄存放文件(註意:剩余磁盤空間是動態的,因此存儲到的目錄或磁盤可能也是變化的)

store_path=0

download_server

#func:下載服務器的選擇方式。

#valu:

# 0:輪詢(默認)

# 1:IP最小者

# 2:優先級排序(值最小的,優先級最高。)

download_server=0

reserved_storage_space

#func:保留空間值。如果某個組中的某個服務器的剩余自由空間小於設定值,則文件不會被上傳到這個組。

#valu:

# G or g for gigabyte

# M or m for megabyte

# K or k for kilobyte

reserved_storage_space=1GB

log_level

#func:日誌級別

#valu:

# emerg for emergency

# alert

# crit for critical

# error

# warn for warning

# notice

# info for information

# debug for debugging

log_level=info

run_by_group / run_by_user

#func:指定運行該程序的用戶組

#valu:用戶組名或空

run_by_group=

#func:

#valu:

run_by_user=

allow_hosts

#func:可以連接到tracker server的ip範圍。可設定多個值。

#valu

allow_hosts=

check_active_interval

#func:檢測 storage server 存活的時間隔,單位為秒。

# storage server定期向tracker server 發心跳,

# 如果tracker server在一個check_active_interval內還沒有收到storage server的一次心跳,

# 那邊將認為該storage server已經下線。所以本參數值必須大於storage server配置的心跳時間間隔。

# 通常配置為storage server心跳時間間隔的2倍或3倍。

check_active_interval=120

thread_stack_size

#func:設定線程棧的大小。 線程棧越大,一個線程占用的系統資源就越多。

# 如果要啟動更多的線程(V1.x對應的參數為max_connections,V2.0為work_threads),可以適當降低本參數值。

#valu:如64KB,默認值為64,tracker server線程棧不應小於64KB

thread_stack_size=64KB

storage_ip_changed_auto_adjust

#func:這個參數控制當storage server IP地址改變時,集群是否自動調整。註:只有在storage server進程重啟時才完成自動調整。

#valu:true或false

storage_ip_changed_auto_adjust=true

2 同步

storage_sync_file_max_delay

#func:同組storage服務器之間同步的最大延遲時間。存儲服務器之間同步文件的最大延遲時間,根據實際情況進行調整

#valu:秒為單位,默認值為1天(24*3600)

#sinc:v2.0

storage_sync_file_max_delay=86400

storage_sync_file_max_time

#func:存儲服務器同步一個文件需要消耗的最大時間,缺省為300s,即5分鐘。

#sinc:v2.0

storage_sync_file_max_time=300

sync_log_buff_interval

#func:同步或刷新日誌信息到硬盤的時間間隔。註意:tracker server 的日誌不是時時寫硬盤的,而是先寫內存。

#valu:以秒為單位

sync_log_buff_interval=10

3 trunk 和 slot

#func:是否使用trunk文件來存儲幾個小文件

#valu:true或false

#sinc:v3.0

use_trunk_file=false

#func:最小slot大小

#valu:<= 4KB,默認為256字節

#sinc:v3.0

slot_min_size=256

#func:最大slot大小

#valu:>= slot_min_size,當小於這個值的時候就存儲到trunk file中。默認為16MB。

#sinc:v3.0

slot_max_size=16MB

#func:trunk file的size

#valu:>= 4MB,默認為64MB

#sinc:v3.0

trunk_file_size=64MB

4 HTTP 相關

是否啟用 HTTP

#func:HTTP是否生效

#valu:true或false

http.disabled=false

HTTP 服務器端口號

#func:tracker server上的http port

#valu:

#note:只有http.disabled=false時才生效

http.server_port=7271

檢查Storage存活狀態的間隔時間(心跳檢測)

#func:檢查storage http server存活的間隔時間

#valu:單位為秒

#note:只有http.disabled=false時才生效

http.check_alive_interval=30

心跳檢測使用的協議方式

#func:檢查storage http server存活的方式

#valu:

# tcp:連接到storage server的http端口,不進行request和response。

# http:storage check alive url must return http status 200.

#note:只有http.disabled=false時才生效

http.check_alive_type=tcp

檢查 Storage 狀態的 URI

#func:檢查storage http server是否alive的uri/url

#note:只有http.disabled=false時才生效

http.check_alive_uri=/status.html

FastDFS單機版安裝