FastDFS是一個開源的分佈式文件系統,它對文件進行管理。功能包括:文件存儲、文件同步、文件訪問(文件上傳、文件下載)等,解決了大容量存儲和負載均衡的問題。特別適合以文件爲載體的在線服務,如相冊網站、視頻網站等。php
FastDFS服務端有兩個角色:跟蹤器(tracker)和存儲節點(storage)。跟蹤器主要作調度工做,在訪問上起負載均衡的做用。存儲節點存儲文件,完成文件管理的功能:存儲、同步和提供存取接口,FastDFS同時對文件的meta data進行管理。所謂文件的meta data就是文件的相關屬性,以鍵值對(key value pair)方式表示,如:width=1024,其中的key爲width,value爲1024.文件的metadata是文件屬性列表,能夠包含多個鍵值對。FastDFS系統結構以下圖所示:nginx
跟蹤器和存儲節點均可以由一臺或多臺服務器構成。跟蹤器和存儲節點中的服務器都可以隨時增長或下線而不會影響線上服務。其中跟蹤器中的全部服務器都是對等的,能夠根據服務器的壓力狀況隨時增長或減小。c++
爲了支持大容量,存儲節點(服務器)採用了分卷(或分組)的組織方式。存儲系統由一個或多個卷組成,卷與卷之間的文件是相互獨立的,全部卷的文件容量累加就是整個存儲系統中的文件容量。一個卷能夠由一臺或多臺存儲服務器組成,一個卷下的存儲服務器中的文件都是相同的,卷中的多臺存儲服務器起到了冗餘備份和負載均衡的做用。在卷中增長服務器時,同步已有的文件由系統自動完成,同步完成後,系統自動將新增服務器切換到線上提供服務。當存儲空間不足或即將耗盡時,能夠動態添加捲。只須要增長一臺或多臺服務器,並將它們配置爲一個新的卷,這樣就擴大了存儲系統的容量。FastDFS中的文件標識分爲兩部分:卷名和文件名,兩者缺一不可。vim
1. Client詢問tracker上傳到storage,不須要附加參數。服務器
2. tracker返回一臺可用的storage。網絡
3. client直接和storage通宵完成文件上傳app
客戶端client發起對FastDFS的文件傳輸動做,是經過鏈接到某一臺Tracker Server的指定端口來實現的,Tracker Server根據目前已掌握的信息,來決定選擇那一臺Storage Service,而後將這個Storage Server的地址等信息返回給client,而後client再經過這些信息鏈接到這臺Storage Server,將要上傳的文件傳送到Storage Server上。負載均衡
1. client詢問tracker下載文件的storage,參數爲文件標識(卷名和文件名)。dom
2. tracker返回一臺可用的storage。tcp
3. client直接和storage通信完成文件下載。
跟蹤服務器1 : 192.168.2.222 master
跟蹤服務器2 : 192.168.2.223 slave
存儲服務器1 : 192.168.2.222 master
存儲服務器2 : 192.168.2.223 slave
環境:CentOS 6.8
用戶:root
所需文件:見附件
fastdfs-5.05.tar.gz : FastDFS安裝主文件包
libfastcommon-master.zip: FastDFS文件系統依賴包
nginx-1.8.1.tar.gz:nginx安裝包
fastdfs-nginx-module_v1.16.tar.gz: nginx下fastdfs模塊包
建立用戶並指定家目錄
# useradd -m -d /home/fastdfs/ -s /sbin/nologin fastdfs
# cd /home/
設置家目錄權限,改目錄爲nginx訪問目錄
# chown -R fastdfs:fastdfs fastdfs
# ll
drwx------. 11 fastdfs fastdfs 40968月 1 14:36 fastdfs
# pwd
/home/fastdfs
# tree
.
├── fastdfs-5.05.tar.gz
├──fastdfs-nginx-module_v1.16.tar.gz
├── libfastcommon-master.zip
└── nginx-1.8.1.tar.gz
0 directories, 4 files
[root@masterfastdfs]#
# cd /home/fastdfs/
建立nginx安裝文件夾
# mkdir /usr/local/nginx
建立tracker相關文件夾
# mkdir /home/fastdfs/tracker
建立storage相關文件夾
# mkdir /home/fastdfs/storage
建立storage數據存儲文件夾
# mkdir /home/fastdfs/storage_data
須要配置網絡yum源
[root@masterfastdfs]# yum -y install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
解壓
# unzip libfastcommon-master.zip
# cd libfastcommon-master
# ls
HISTORY INSTALL libfastcommon.spec make.sh php-fastcommon README src
編譯
# ./make.sh
安裝
默然安裝到了
/usr/lib64/libfastcommon.so
# ./make.sh install
配置軟鏈接
由於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: 建立符號連接 "/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
解壓
# tar zxvf fastdfs-5.05.tar.gz
# cd fastdfs-5.05
編譯(編譯前確保已經安裝了libfastcommon-master)
# ./make.sh
安裝
# ./make.sh install
採用默然安裝的方式安裝,安裝後的相應文件和目錄:
A、安裝後的配置文件(樣例配置文件)
# ls /etc/fdfs/
client.conf.sample # 客戶端配置文件
storage.conf.sample # 存儲節點配置文件
tracker.conf.sample #跟蹤節點配置文件
B、安裝後的腳本
# ll /etc/init.d/fdfs*
/etc/init.d/fdfs_storaged # 存儲節點腳本文件
/etc/init.d/fdfs_trackerd # 跟蹤節點腳本文件
C、命令工具在/usr/bin/目錄下的:
/usr/bin/fdfs_appender_test
/usr/bin/fdfs_delete_file
/usr/bin/fdfs_storaged # storage啓動命令
/usr/bin/fdfs_upload_appender
/usr/bin/fdfs_appender_test1
/usr/bin/fdfs_download_file
/usr/in/fdfs_test
/usr/bin/fdfs_upload_file # 客戶端上傳文件命令
/usr/bin/fdfs_append_file
/usr/bin/fdfs_file_info
/usr/in/fdfs_test1
/usr/bin/fdfs_crc32
/usr/bin/fdfs_monitor # fdfs集羣監控命令
/usr/bin/fdfs_trackerd # tracker啓動命令
修改腳本
由於FastDFS服務腳本設置的bin目錄是/usr/local/bin,但實際命令安裝在/usr/bin。所以須要修改FastDFS服務腳本中相應的命令路徑,也就是把/etc/init.d/fdfs_storaged和/etc/init.d/fdfs_trackerd兩個腳本中的/usr/local/bin修改爲/usr/bin
# vim /etc/init.d/fdfs_trackerd
使用查找替換命令統一修改 :%s+/usr/local/bin+/usr/bin
# vim /etc/init.d/fdfs_storaged
使用查找替換命令統一修改 :%s+/usr/local/bin+/usr/bin
# cd /etc/fdfs/
# cp tracker.conf.sample tracker.conf
# vim tracker.conf
修改如下內容
disabled=false #啓動配置文件
port=22122 #tracker的端口號,通常採用22122這個默認的端口
base_path=/home/fastdfs/tracker #tracker的數據文件和日誌目錄
啓動tracker
# /etc/init.d/fdfs_trackerd start
查看tracker是否啓動成功
(1)查看22122端口監聽狀況
# netstat -antpu |grep fdfs
tcp 0 0 0.0.0.0:22122 0.0.0.0:* LISTEN 51641/fdfs_trackerd
(2)經過查看tracker啓動日誌
# tail -100f /home/fastdfs/tracker/logs/trackerd.log
防火牆中打開跟蹤器Tracker端口
# iptables -I INPUT -p tcp --dport 22122 -j ACCEPT
# /etc/init.d/iptables save
關閉tracker
# /etc/init.d/fdfs_trackerd stop
設置FastDFS跟蹤器開機啓動
# echo '/etc/init.d/fdfs_trackerd start' >>/etc/rc.d/rc.local
# cd /etc/fdfs/
# cp storage.conf.sample storage.conf
# vim storage.conf
修改如下內容
disabled=false # 啓動配置文件
group_name=group1 # 組名
port=23000 # storage的端口號
base_path=/home/fastdfs/storage # 設置storage的日誌路徑
store_path0=/home/fastdfs/storage_data # 存儲路徑
store_path_count=1 #存儲路徑的個數,須要和storage_path個數相同
tracker_server=192.168.2.222:22122 # tracker服務器的IP地址和端口
tracker_server=192.168.2.223:22122 # 多個tracker直接添加多條配置
啓動storage
# /etc/init.d/fdfs_storaged start
查看storage是否啓動成功
(1) 查看監聽端口
# netstat -antpu | grepfdfs
tcp 0 00.0.0.0:22122 0.0.0.0:* LISTEN 51641/fdfs_trackerd
tcp 0 00.0.0.0:23000 0.0.0.0:* LISTEN 51798/fdfs_storaged
tcp 0 0192.168.2.222:22122 192.168.2.222:54181 ESTABLISHED 51641/fdfs_trackerd
tcp 0 0 192.168.2.222:54181 192.168.2.222:22122 ESTABLISHED 51798/fdfs_storaged
(2)查看日誌,初次啓動成功會在/home/fastdfs/storage /下建立data和log目錄
# tail-100f /home/fastdfs/storage/logs/storaged.log
防火牆中打開存儲節點端口
# iptables -I INPUT -p tcp --dport 23000 -j ACCEPT
保存防火牆規則
# /etc/init.d/iptables save
關閉storage
# /etc/init.d/fdfs_storaged stop
設置FastDFS存儲節點開機啓動
# echo '/etc/init.d/fdfs_storaged start' >>/etc/rc.d/rc.local
查看FastDFS監控集羣信息
# /usr/bin/fdfs_monitor /etc/fdfs/storage.conf
[2016-08-01 12:49:39] DEBUG -base_path=/home/fastdfs/storage, connect_timeout=30, network_timeout=60,tracker_server_count=2, anti_steal_token=0, anti_steal_secret_key length=0,use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0,storage server id count: 0
server_count=2, server_index=1
tracker server is192.168.2.223:22122
group count: 1
Group 1: group name = group1 disk total space = 9951 MB disk free space = 4890 MB trunk free space = 0 MB storage server count = 2 active server count = 0 storage server port = 23000 storage HTTP port = 8888 store path count = 1 subdir count per path = 256 current write server index = 0 current trunk file id = 0
Storage 1: id = 192.168.2.222 ip_addr = 192.168.2.222 WAIT_SYNC http domain = version = 5.05 join time = 2016-08-01 12:11:49 up time = 2016-08-01 12:11:49 total storage = 9951 MB free storage = 4890 MB upload priority = 10 store_path_count = 1 subdir_count_per_path = 256 storage_port = 23000 storage_http_port = 8888 current_write_path = 0 source storage id =192.168.2.223 if_trunk_server = 0 connection.alloc_count = 256 connection.current_count = 0 connection.max_count = 0 total_upload_count = 0 success_upload_count = 0 total_append_count = 0 success_append_count = 0 total_modify_count = 0 success_modify_count = 0 total_truncate_count = 0 success_truncate_count = 0 total_set_meta_count = 0 success_set_meta_count = 0 total_delete_count = 0 success_delete_count = 0 total_download_count = 0 success_download_count = 0 total_get_meta_count = 0 success_get_meta_count = 0 total_create_link_count = 0 success_create_link_count = 0 total_delete_link_count = 0 success_delete_link_count = 0 total_upload_bytes = 0 success_upload_bytes = 0 total_append_bytes = 0 success_append_bytes = 0 total_modify_bytes = 0 success_modify_bytes = 0 stotal_download_bytes = 0 success_download_bytes = 0 total_sync_in_bytes = 0 success_sync_in_bytes = 0 total_sync_out_bytes = 0 success_sync_out_bytes = 0 total_file_open_count = 0 success_file_open_count = 0 total_file_read_count = 0 success_file_read_count = 0 total_file_write_count = 0 success_file_write_count = 0 last_heart_beat_time =2016-08-01 12:49:28 last_source_update = 1970-01-0108:00:00 last_sync_update = 1970-01-0108:00:00 last_synced_timestamp = 1970-01-0108:00:00 Storage 2: id = 192.168.2.223 ip_addr = 192.168.2.223 OFFLINE http domain = version = 5.05 join time = 2016-08-01 12:12:06 up time = total storage = 9951 MB free storage = 4889 MB upload priority = 10 store_path_count = 1 subdir_count_per_path = 256 storage_port = 23000 storage_http_port = 8888 current_write_path = 0 source storage id = if_trunk_server = 0 connection.alloc_count = 0 connection.current_count = 0 connection.max_count = 0 total_upload_count = 0 success_upload_count = 0 total_append_count = 0 success_append_count = 0 total_modify_count = 0 success_modify_count = 0 total_truncate_count = 0 success_truncate_count = 0 total_set_meta_count = 0 success_set_meta_count = 0 total_delete_count = 0 success_delete_count = 0 total_download_count = 0 success_download_count = 0 total_get_meta_count = 0 success_get_meta_count = 0 total_create_link_count = 0 success_create_link_count = 0 total_delete_link_count = 0 success_delete_link_count = 0 total_upload_bytes = 0 success_upload_bytes = 0 total_append_bytes = 0 success_append_bytes = 0 total_modify_bytes = 0 success_modify_bytes = 0 stotal_download_bytes = 0 success_download_bytes = 0 total_sync_in_bytes = 0 success_sync_in_bytes = 0 total_sync_out_bytes = 0 success_sync_out_bytes = 0 total_file_open_count = 0 success_file_open_count = 0 total_file_read_count = 0 success_file_read_count = 0 total_file_write_count = 0 success_file_write_count = 0 last_heart_beat_time =2016-08-01 12:49:18 last_source_update = 1970-01-0108:00:00 last_sync_update = 1970-01-0108:00:00 last_synced_timestamp = 1970-01-01 08:00:00 |
修改Tracker服務器中的客戶端配置文件
# cd /etc/fdfs/
# cp client.conf.sample client.conf
# vim /etc/fdfs/client.conf
修改如下內容
base_path=/home/fastdfs/tracker #tracker日誌存儲路徑
tracker_server=192.168.2.222:22122 #tracker服務器的IP地址和端口
tracker_server=192.168.2.223:22122 # 多個tracker直接添加多條配置
測試文件上傳,返回下班文件ID,說明文件上傳成功
# /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /home/fastdfs/fastdfs-5.05.tar.gz
group1/M00/00/00/wKgC3lee2O6AYhpdAAUggSnIHZU.tar.gz
解壓
# tar zxvf fastdfs-nginx-module_v1.16.tar.gz
修改配置文件
# vim /home/fastdfs/fastdfs-nginx-module/src/config
修改內容(這個路徑修改很重要,否則在nginx編譯時會報錯)
CORE_INCS="$CORE_INCS/usr/local/include/fastdfs /usr/local/include/fastcommon/" 修改成:
CORE_INCS="$CORE_INCS /usr/include/fastdfs/usr/include/fastcommon/"
解壓
# tar zxvf nginx-1.8.1.tar.gz
# cd nginx-1.8.1
配置安裝信息
# ./configure --prefix=/usr/local/nginx/ --add-module=/home/fastdfs/fastdfs-nginx-module/src/
編譯安裝
# make && make install
複製配置文件
複製fastdfs-nginx-module源碼中的配置文件到/etc/fdfs目錄
# cp /home/fastdfs/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
複製FastDFS的部分配置文件到/etc/fdfs目錄
# cp /home/fastdfs/fastdfs-5.05/conf/mime.types /etc/fdfs/
# cp /home/fastdfs/fastdfs-5.05/conf/http.conf /etc/fdfs/
修改mod_fastdfs.conf
# vim /etc/fdfs/mod_fastdfs.conf
修改內容
connect_timeout=10
base_path=/home/fastdfs/storage
tracker_server=192.168.2.222:22122
tracker_server=192.168.2.223:22122
storage_server_port=23000
group_name=group1
url_have_group_name = true
store_path_count=1
store_path0=/home/fastdfs/storage_data
group_count = 1
[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/home/fastdfs/storage_data
修改nginx配置文件
# vim /usr/local/nginx/conf/nginx.conf
修改內容
user fastdfs; # nginx訪問用戶
listen 80; # nginx監聽端口
location ~/group([0-9])/M00 {
alias /home/fastdfs/storage_data/data;
ngx_fastdfs_module;
}
防火牆放開80端口
# iptables -I INPUT -p tcp --dport 80 -j ACCEPT
保存防火牆規則鏈,重啓電腦後設置的規則繼續生效
# /etc/init.d/iptables save
啓動nginx
# /usr/local/nginx/sbin/nginx
nginx 重啓命令
# /usr/local/nginx/sbin/nginx -s reload
設置nginx開機啓動
# echo /usr/local/nginx/sbin/nginx >> /etc/rc.d/rc.local