FastDFS是一款開源的輕量級分佈式文件系統,使用C實現,支持Linux、BSD等unix-like操做系統。值得注意的是,fastdfs並非通用的文件系統,只能經過專用的API訪問。
fastdfs爲互聯網應用量身定作,解決了大容量文件存儲的問題,fastdfs追求高性能和高擴展性。fastdfs的主要概念:html
tracker-server:跟蹤服務器。用於跟蹤文件,主要起調度做用。在內存中記錄了全部存儲組和存儲服務器的狀態信息,是客戶端和數據存儲的主要樞紐。相比GFS更爲精簡,由於不記錄文件索引。java
storage-server: 存儲服務器。用於存儲文件。直接使用操做系統的文件系統來管理和組織文件。nginx
group: 組,卷。多個服務器存在一個組中,在一個組中的服務器存儲的文件是徹底相同的,而且同一個組的服務器地位是對等的。對於文件的操做能夠在任意一個組中的服務器上進行。c++
話說沒有對比就沒有傷害,fastdfs也不是萬能的,須要根據業務來選擇適合的存儲系統。git
存儲系統 | 適合存儲的文件類型 | 文件分佈狀況 | 系統性能 | 複雜度 | FUSE(用戶文件系統) | POSIX() | 備份機制 | 通信協議接口 | 社區狀況 | 實現語言 |
---|---|---|---|---|---|---|---|---|---|---|
FastDFS | 4KB至500MB | 將小文件合併存儲 | 很高 | 簡單 | 不支持 | 不支持 | 組內冗餘備份 | HTTP API | 國內用戶 | C |
TFS | 全部文件 | 小文件合併以塊組織分片 | - | 複雜 | 不支持 | 不支持 | 塊存儲多份,主輔災備 | HTTP API | 少 | C++ |
MFS | 大於64K | 分片存儲 | Master節點佔用內存較高 | - | 支持 | 支持 | 多點備份,動態冗餘 | 使用FUSE掛載 | 較多 | Perl |
HDFS | 大文件 | 大文件分片塊存儲 | - | 簡單 | 支持 | 支持 | 多副本 | 原生API | 較多 | Java |
Ceph | 對象大文件 | OSD一主多從 | - | 複雜 | 支持 | 支持 | 多副本 | 原生API | 較少 | C++ |
MogileFS | 海量小圖片 | - | 高 | 複雜 | 支持 | 不支持 | 動態冗餘 | 原生API | 文檔少 | Perl |
ClusterFS | 大文件 | - | - | 簡單 | 支持 | 支持 | - | - | 多 | C |
mkdir /source
cd /source
yum install -y gcc gcc-c++ make cmake wget libevent
wget https://github.com/happyfish100/libfastcommon/archive/V1.0.35.tar.gz
wget https://github.com/happyfish100/fastdfs/archive/V5.10.tar.gz
tar -zxvf V1.0.35.tar.gz
tar -zxvf V5.10.tar.gz
cd libfastcommon-1.0.35
./make.sh
./make.sh install
ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so
cd ../
cd fastdfs-5.10/
./make.sh
./make.sh install
cd ../
rm -rf libfastcommon-1.0.35
rm -rf fastdfs-5.10
cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
mkdir -p /data/fdfs/tracker
mkdir -p /data/fdfs/storage
ln -s /usr/bin/stop.sh /usr/local/bin/stop.sh
ln -s /usr/bin/restart.sh /usr/local/bin/restart.sh複製代碼
修改跟蹤器配置文件:github
base_path=/data/fdfs/tracker複製代碼
修改存儲器配置文件:web
base_path=/data/fdfs/storage
store_path0=/data/fdfs/storage
tracker_server=192.168.80.3:22122複製代碼
修改客戶端配置文件:正則表達式
base_path=/data/fdfs/client
tracker_server=192.168.80.3:22122複製代碼
/etc/init.d/fdfs_trackerd start
/etc/init.d/fdfs_storaged start複製代碼
netstat -tunlap | grep :22122
tcp 0 0 0.0.0.0:22122 0.0.0.0:* LISTEN 7247/fdfs_trackerd
tcp 0 0 192.168.80.3:22122 192.168.80.3:39318 ESTABLISHED 7247/fdfs_trackerd
tcp 0 0 192.168.80.3:39318 192.168.80.3:22122 ESTABLISHED 7444/fdfs_storaged 複製代碼
啓動後要查看狀態, 出現 active (exited)
字樣能夠嘗試重啓服務。算法
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /source/FastDFS_v5.05.tar.gz
group1/M00/00/00/wKhQA1ysjSGAPjXbAAVFOL7FJU4.tar.gz複製代碼
文件存儲在:spring
ll /data/fdfs/storage/data/00/00/wKhQA1ysjSGAPjXbAAVFOL7FJU4.tar.gz複製代碼
# 安裝Nginx須要的pcre(Perl兼容正則表達式)庫,容許Nginx使用rewrite模塊提供URL重寫功能。
yum install pcre pcre-devel perl-ExtUtils-Embed -y
# 安裝openssl-devel,容許Nginx提供HTTPS服務。
yum install openssl-devel -y
# 下載軟件包
cd /source
wget http://59.80.44.46/nginx.org/download/nginx-1.14.2.tar.gz
wget http://nchc.dl.sourceforge.net/project/fastdfs/FastDFS%20Nginx%20Module%20Source%20Code/fastdfs-nginx-module_v1.16.tar.gz
# 解壓軟件包
tar xvf nginx-1.14.2.tar.gz
tar xvf fastdfs-nginx-module_v1.16.tar.gz
# 建立必要的軟鏈接
ln -s /usr/include/fastdfs/ /usr/local/include/fastdfs
ln -s /usr/include/fastcommon/ /usr/local/include/fastcommon
cp FastDFS/conf/http.conf /etc/fdfs/
cp FastDFS/conf/mime.types /etc/fdfs/
cp fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
mkdir -p /data/fdfs/fastdfs-nginx-module複製代碼
修改配置文件 /etc/fdfs/mod_fastdfs.conf
:
connect_timeout=10
base_path=/data/fdfs/fastdfs-nginx-module
# 配置服務器的地址
tracker_server=192.168.80.3:22122
url_have_group_name = true
store_path0=/data/fdfs/storage複製代碼
mkdir /applications
mkdir /tmp/nginx
useradd nginx -s /sbin/nologin -M
cd nginx-1.14.2
./configure \
--user=nginx \
--group=nginx \
--prefix=/applications/nginx-1.14.2 \
--with-http_ssl_module \
--with-http_gzip_static_module \
--http-client-body-temp-path=/tmp/nginx/client \
--http-proxy-temp-path=/tmp/nginx/proxy \
--http-fastcgi-temp-path=/tmp/nginx/cgi \
--with-poll_module \
--with-file-aio \
--with-http_realip_module \
--with-http_addition_module \
--with-http_random_index_module \
--with-pcre \
--with-http_stub_status_module \
--with-stream \
--add-module=/source/fastdfs-nginx-module/src
make
make install
ln -s /applications/nginx-1.14.2/ /applications/nginx
chown -R nginx.nginx /applications/nginx
chown -R nginx.nginx /applications/nginx-1.14.2/
chown -R nginx.nginx /tmp/nginx/複製代碼
修改配置文件 /applications/nginx/conf/nginx.conf
, 在http區塊添加:
server {
listen 8000;
server_name media;
location / {
root html;
index index.html index.htm;
}
# 攔截文件請求,轉發到下面的模塊
location ~/group[0-9] {
ngx_fastdfs_module;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}複製代碼
測試配置文件正確性並啓動:
/applications/nginx/sbin/nginx -t
/applications/nginx/sbin/nginx複製代碼
刪除臨時文件:
rm -rf FastDFS
rm -rf fastdfs-nginx-module
rm -rf libfastcommon-1.0.35
rm -rf nginx-1.14.2複製代碼
測試Nginx文件下載功能, 在瀏覽器輸入: http://192.168.80.3:8000/group1/M00/00/00/wKhQA1ysjSGAPjXbAAVFOL7FJU4.tar.gz
一個nginx只能訪問一個storage服務器的數據,因此多個storage服務器要配置多個nginx,而後將nginx按照請求路徑中的組id(groupid)進行路由。
簡單的啓動中止服務的腳本:
# start-service
# usage: ./start-service
echo "============================================Sync datetime==========================================="
ntpdate time7.aliyun.com
echo "===========================================Getting status==========================================="
/etc/init.d/fdfs_trackerd status
/etc/init.d/fdfs_storaged status
echo "==========================================Starting service=========================================="
/etc/init.d/fdfs_storaged start
/etc/init.d/fdfs_trackerd start
echo "===========================================Getting status==========================================="
/etc/init.d/fdfs_trackerd status
/etc/init.d/fdfs_storaged status
echo "=========================================Testing config file========================================"
/applications/nginx/sbin/nginx -t
echo "=========================================Starting web server========================================"
/applications/nginx/sbin/nginx
echo "=======================================Getting network status======================================="
sleep 5s
netstat -tunlap | grep :22122
netstat -tunlap | grep :8000複製代碼
# stop-service
# usage: ./stop-service
echo "===========================================Getting status==========================================="
/etc/init.d/fdfs_trackerd status
/etc/init.d/fdfs_storaged status
echo "==========================================Stopping service=========================================="
/etc/init.d/fdfs_storaged stop
/etc/init.d/fdfs_trackerd stop
echo "========================================Stopping web server========================================="
kill `cat /applications/nginx/logs/nginx.pid`
echo "===========================================Getting status==========================================="
/etc/init.d/fdfs_trackerd status
/etc/init.d/fdfs_storaged status
echo "=======================================Getting network status======================================="
sleep 5s
netstat -tunlap | grep :22122
netstat -tunlap | grep :8000複製代碼
FastDFS內置使用Token的方式實現防盜鏈,Token是帶有時效性的,Token中包含了文件id、時間戳ts和token。在FastDFS中使用URL帶上ts和token的方式請求資源。在FastDFS中提供了生成Token的算法,擴展模塊會對Token進行驗證。因爲Token的生成和校驗都在服務器端,所以不會存在安全性問題。連接示例:
http://192.168.1.15:8080/group1/M01/01/01/wKgBD01c15nvKU1cAABAOeCdFS466570.c?token=b32cd06a53dea4376e43d71cc882f9cb&ts=1297930137複製代碼
在 /etc/fdfs/http.conf
中修改:
# 開啓Token校驗
http.anti_steal.check_token=true
# Token的聲明週期爲240秒
http.anti_steal.token_ttl=240
# 加密字符串,可使用 openssl rand -base64 64 生成
http.anti_steal.secret_key=2scPwMPctXhbLVOYB0jyuyQzytOofmFCBIYe65n56PPYVWrntxzLIDbPdvDDLJM8QHhKxSGWTcr+9VdG3yptkw
# Token校驗失敗的時候返回的圖片
http.anti_steal.token_check_fail=/data/fdfs/error.svg複製代碼
將客戶端安裝到本地倉庫:
git clone https://github.com/happyfish100/fastdfs-client-java.git
cd fastdfs-client-java
mvn clean install複製代碼
使用Maven建立一個普通的項目,在POM文件中添加依賴:
<dependencies>
<dependency>
<groupId>org.csource</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27-SNAPSHOT</version>
</dependency>
</dependencies>複製代碼
在resources目錄下建立FastDFS配置文件 fastdfs-client.properties
:
fastdfs.connect_timeout_in_seconds = 5
fastdfs.network_timeout_in_seconds = 30
fastdfs.charset = UTF-8
fastdfs.http_anti_steal_token = true
fastdfs.http_secret_key = 2scPwMPctXhbLVOYB0jyuyQzytOofmFCBIYe65n56PPYVWrntxzLIDbPdvDDLJM8QHhKxSGWTcr+9VdG3yptkw
fastdfs.http_tracker_http_port = 8080
fastdfs.tracker_servers = 192.168.80.3:22122複製代碼
建立 com.bluemiaomiao.Demo.java
類文件:
package com.bluemiaomiao;
import org.csource.common.MyException;
import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.ProtoCommon;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.util.Properties;
public class Demo {
public static void main(String[] args) throws IOException, MyException, NoSuchAlgorithmException {
// 加載配置文件
Properties prop = new Properties();
prop.load(Demo.class.getResourceAsStream("/fastdfs-client.properties"));
ClientGlobal.initByProperties(prop);
// 顯示初始化配置信息
System.out.println(ClientGlobal.configInfo());
// 使用文件上傳工具返回的地址,通常狀況下保存在數據庫中
String remoteFileName = "group1/M00/00/00/wKhQA1ysjSGAPjXbAAVFOL7FJU4.tar.gz";
// 獲取當前時間戳
int ts = (int)(System.currentTimeMillis()/1000);
// 獲取Token, 傳入的文件ID不要含有分組信息
String token = ProtoCommon.getToken("M00/00/00/wKhQA1ysjSGAPjXbAAVFOL7FJU4.tar.gz", ts, prop.getProperty("fastdfs.http_secret_key"));
// 使用瀏覽器訪問返回的URL
System.out.println("http://192.168.80.3:8000/" + remoteFileName + "?token=" + token + "&ts=" + ts);
}
}複製代碼
若是訪問時顯示防盜鏈圖片,多是測試客戶端與服務器之間的之間有必定差距,兩個主機之間不能有分鐘級別的差距,可使用以下方法同步服務器:
# 安裝同步時間服務器的客戶端, Windows系統也須要與該服務器同步
# 控制面板->時鐘和區域->設置日期和時間->Internet時間->更改設置
yum install ntpdate
ntpdate time7.aliyun.com複製代碼
FastDHT是分佈式哈希系統(DHT),使用BerkeleyDB作數據存儲,使用libevent作網絡IO處理。依賴於libfastcommon組件。
去Oracle官方網站下載 Berkeley DB 數據庫,去Fastdfs的GitHub主頁下載FastDHT的源碼包。因爲以前已經安裝過linevent和libfastcommon,所以只須要安裝數據庫和FastDHT便可。
tar -xvf db-6.2.23.tar.gz
cd db-6.2.23/build_unix/
../dist/configure --prefix=/applications/db-6.2.23
cd ../../
rm -rf db-6.2.23
unzip fastdht-master.zip
cd fastdht-master
vim make.sh複製代碼
修改第27行代碼:
CFLAGS='-Wall -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -I /applications/db-6.2.23/include/ -L /applications/db-6.2.23/lib/'複製代碼
-I
: 指定數據庫提供的頭文件目錄
-L
: 指定數據庫提供的庫文件目錄
./make.sh
./make.sh install
cd ../
rm -rf fastdht-master複製代碼
mkdir /data/fdht複製代碼
修改 /etc/fdht/fdht_client.conf
內容:
base_path=/data/fdht
#include /etc/fdht/fdht_servers.conf複製代碼
修改 /etc/fdht/fdht_servers.conf
內容:
group0 = 192.168.80.3:11411複製代碼
修改 /etc/fdht/fdhtd.conf
內容:
base_path=/data/fdht
#include /etc/fdht/fdht_servers.conf複製代碼
修改 /etc/fdfs/storage.conf
內容:
check_file_duplicate=1
key_namespace=FastDFS
keep_alive=1
#include /etc/fdht/fdht_servers.conf複製代碼
主要須要包含服務器端配置文件。
ln -s /applications/db-6.2.23/lib/libdb-6.2.so /usr/lib/libdb-6.2.so
ln -s /applications/db-6.2.23/lib/libdb-6.2.so /usr/lib64/libdb-6.2.so複製代碼
fdhtd /etc/fdht/fdhtd.conf複製代碼
重啓使用:
fdhtd /etc/fdht/fdhtd.conf restart複製代碼
查看結果:
netstat -tunlap | grep :11411
tcp 0 0 0.0.0.0:11411 0.0.0.0:* LISTEN 20605/fdhtd複製代碼
./start-service複製代碼
修改以前的 start-service
腳本, 在啓動tracker和storage服務以前添加:
fdhtd /etc/fdht/fdhtd.conf複製代碼
在查看tracker和ngixn網絡狀態以前添加:
netstat -tunlap | grep :11411複製代碼
測試:
fdfs_upload_file /etc/fdfs/client.conf /source/db-6.2.23.tar.gz
group1/M00/00/00/wKhQA1yu2L6APTk-AqQOLABfhaQ.tar.gz
fdfs_upload_file /etc/fdfs/client.conf /source/db-6.2.23.tar.gz
group1/M00/00/00/wKhQA1yu2MKAOmIiAqQOLHUWXfw.tar.gz
ll /data/fdfs/storage/data/00/00/
total 45268
-rw-r--r-- 1 root root 44305964 Apr 11 14:03 wKhQA1yu2L6AM0aiAqQOLKFBFuc.tar.gz
lrwxrwxrwx 1 root root 64 Apr 11 14:03 wKhQA1yu2L6APTk-AqQOLABfhaQ.tar.gz -> /data/fdfs/storage/data/00/00/wKhQA1yu2L6AM0aiAqQOLKFBFuc.tar.gz
lrwxrwxrwx 1 root root 64 Apr 11 14:03 wKhQA1yu2MKAOmIiAqQOLHUWXfw.tar.gz -> /data/fdfs/storage/data/00/00/wKhQA1yu2L6AM0aiAqQOLKFBFuc.tar.gz複製代碼
爲了快速構建SpringBoot項目,咱們能夠自定義一個場景啓動器來解決。詳細信息:github.com/bluemiaomia… .
下面使用SpringBoot構建一個示例項目:
<dependency>
<groupId>com.bluemiaomiao</groupId>
<artifactId>fastdfs-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>複製代碼
在主配置類中添加註解:
@EnableFastdfsClient
@SpringBootApplication
public class DemoApplication {
@Autowired
private FastdfsClientService fastdfsClientService;
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}複製代碼
此時將會自動初始化好全局客戶端。
對文章有興趣的朋友能夠關注小編掘金好,之後會有更多的優質文章輸出。