您好,登錄后才能下訂單哦!
FastDFS簡介
FastDFS是一款開源的輕量級(jí)分布式文件系統(tǒng),使用C實(shí)現(xiàn),支持Linux、BSD等unix-like操作系統(tǒng)。值得注意的是,fastdfs并不是通用的文件系統(tǒng),只能通過專用的API訪問。
fastdfs為互聯(lián)網(wǎng)應(yīng)用量身定做,解決了大容量文件存儲(chǔ)的問題,fastdfs追求高性能和高擴(kuò)展性。fastdfs的主要概念:
tracker-server:跟蹤服務(wù)器。用于跟蹤文件,主要起調(diào)度作用。在內(nèi)存中記錄了所有存儲(chǔ)組和存儲(chǔ)服務(wù)器的狀態(tài)信息,是客戶端和數(shù)據(jù)存儲(chǔ)的主要樞紐。相比GFS更為精簡,因?yàn)椴挥涗浳募饕?/p>
storage-server: 存儲(chǔ)服務(wù)器。用于存儲(chǔ)文件。直接使用操作系統(tǒng)的文件系統(tǒng)來管理和組織文件。
group: 組,卷。多個(gè)服務(wù)器存在一個(gè)組中,在一個(gè)組中的服務(wù)器存儲(chǔ)的文件是完全相同的,并且同一個(gè)組的服務(wù)器地位是對(duì)等的。對(duì)于文件的操作可以在任意一個(gè)組中的服務(wù)器上進(jìn)行。
metadata: 元數(shù)據(jù)。以鍵值對(duì)的方式存儲(chǔ),用于存儲(chǔ)文件的相關(guān)信息。
各大存儲(chǔ)系統(tǒng)的對(duì)比
話說沒有對(duì)比就沒有傷害,fastdfs也不是萬能的,需要根據(jù)業(yè)務(wù)來選擇適合的存儲(chǔ)系統(tǒng)。
存儲(chǔ)系統(tǒng) | 適合存儲(chǔ)的文件類型 | 文件分布情況 | 系統(tǒng)性能 | 復(fù)雜度 | FUSE(用戶文件系統(tǒng)) | POSIX() | 備份機(jī)制 | 通訊協(xié)議接口 | 社區(qū)情況 | 實(shí)現(xiàn)語言 |
---|---|---|---|---|---|---|---|---|---|---|
FastDFS | 4KB至500MB | 將小文件合并存儲(chǔ) | 很高 | 簡單 | 不支持 | 不支持 | 組內(nèi)冗余備份 | HTTP API | 國內(nèi)用戶 | C |
TFS | 所有文件 | 小文件合并以塊組織分片 | - | 復(fù)雜 | 不支持 | 不支持 | 塊存儲(chǔ)多份,主輔災(zāi)備 | HTTP API | 少 | C++ |
MFS | 大于64K | 分片存儲(chǔ) | Master節(jié)點(diǎn)占用內(nèi)存較高 | - | 支持 | 支持 | 多點(diǎn)備份,動(dòng)態(tài)冗余 | 使用FUSE掛載 | 較多 | Perl |
HDFS | 大文件 | 大文件分片塊存儲(chǔ) | - | 簡單 | 支持 | 支持 | 多副本 | 原生API | 較多 | Java |
Ceph | 對(duì)象大文件 | OSD一主多從 | - | 復(fù)雜 | 支持 | 支持 | 多副本 | 原生API | 較少 | C++ |
MogileFS | 海量小圖片 | - | 高 | 復(fù)雜 | 支持 | 不支持 | 動(dòng)態(tài)冗余 | 原生API | 文檔少 | Perl |
ClusterFS | 大文件 | - | - | 簡單 | 支持 | 支持 | - | - | 多 | C |
GitHub項(xiàng)目主頁: https://github.com/happyfish200/fastdfs
FastDFS客戶端與服務(wù)器端交互原理
FastDFS+Nginx整合
架構(gòu)圖
安裝FastDFS
mkdir /source cd /source yum install -y gcc gcc-c++ make cmake wget libevent wget https://github.com/happyfish200/libfastcommon/archive/V1.0.35.tar.gz wget https://github.com/happyfish200/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
修改配置文件
修改跟蹤器配置文件:
base_path=/data/fdfs/tracker
修改存儲(chǔ)器配置文件:
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
啟動(dòng)
/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
啟動(dòng)后要查看狀態(tài), 出現(xiàn) active (exited)
字樣可以嘗試重啟服務(wù)。
測試
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /source/FastDFS_v5.05.tar.gz group1/M00/00/00/wKhQA1ysjSGAPjXbAAVFOL7FJU4.tar.gz
文件存儲(chǔ)在:
ll /data/fdfs/storage/data/00/00/wKhQA1ysjSGAPjXbAAVFOL7FJU4.tar.gz
安裝Nginx并配置模塊
# 安裝Nginx需要的pcre(Perl兼容正則表達(dá)式)庫,允許Nginx使用rewrite模塊提供URL重寫功能。 yum install pcre pcre-devel perl-ExtUtils-Embed -y # 安裝openssl-devel,允許Nginx提供HTTPS服務(wù)。 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 # 創(chuàng)建必要的軟連接 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 # 配置服務(wù)器的地址 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區(qū)塊添加:
server { listen 8000; server_name media; location / { root html; index index.html index.htm; } # 攔截文件請(qǐng)求,轉(zhuǎn)發(fā)到下面的模塊 location ~/group[0-9] { ngx_fastdfs_module; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
測試配置文件正確性并啟動(dòng):
/applications/nginx/sbin/nginx -t /applications/nginx/sbin/nginx
刪除臨時(shí)文件:
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
一個(gè)nginx只能訪問一個(gè)storage服務(wù)器的數(shù)據(jù),所以多個(gè)storage服務(wù)器要配置多個(gè)nginx,然后將nginx按照請(qǐng)求路徑中的組id(groupid)進(jìn)行路由。
簡單的啟動(dòng)停止服務(wù)的腳本:
# 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
基于Token的防盜鏈實(shí)現(xiàn)
FastDFS內(nèi)置使用Token的方式實(shí)現(xiàn)防盜鏈,Token是帶有時(shí)效性的,Token中包含了文件id、時(shí)間戳ts和token。在FastDFS中使用URL帶上ts和token的方式請(qǐng)求資源。在FastDFS中提供了生成Token的算法,擴(kuò)展模塊會(huì)對(duì)Token進(jìn)行驗(yàn)證。由于Token的生成和校驗(yàn)都在服務(wù)器端,因此不會(huì)存在安全性問題。鏈接示例:
http://192.168.1.15:8080/group1/M01/01/01/wKgBD01c15nvKU1cAABAOeCdFS466570.c?token=b32cd06a53dea4376e43d71cc882f9cb&ts=1297930137
在 /etc/fdfs/http.conf
中修改:
# 開啟Token校驗(yàn) 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校驗(yàn)失敗的時(shí)候返回的圖片 http.anti_steal.token_check_fail=/data/fdfs/error.svg
使用Java客戶端驗(yàn)證:
將客戶端安裝到本地倉庫:
git clone https://github.com/happyfish200/fastdfs-client-java.git cd fastdfs-client-java mvn clean install
使用Maven創(chuàng)建一個(gè)普通的項(xiàng)目,在POM文件中添加依賴:
<dependencies> <dependency> <groupId>org.csource</groupId> <artifactId>fastdfs-client-java</artifactId> <version>1.27-SNAPSHOT</version> </dependency> </dependencies>
在resources目錄下創(chuàng)建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
創(chuàng)建 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()); // 使用文件上傳工具返回的地址,一般情況下保存在數(shù)據(jù)庫中 String remoteFileName = "group1/M00/00/00/wKhQA1ysjSGAPjXbAAVFOL7FJU4.tar.gz"; // 獲取當(dāng)前時(shí)間戳 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); } }
如果訪問時(shí)顯示防盜鏈圖片,可能是測試客戶端與服務(wù)器之間的之間有一定差距,兩個(gè)主機(jī)之間不能有分鐘級(jí)別的差距,可以使用如下方法同步服務(wù)器:
# 安裝同步時(shí)間服務(wù)器的客戶端, Windows系統(tǒng)也需要與該服務(wù)器同步 # 控制面板->時(shí)鐘和區(qū)域->設(shè)置日期和時(shí)間->Internet時(shí)間->更改設(shè)置 yum install ntpdate ntpdate time7.aliyun.com
整合FastDHT實(shí)現(xiàn)數(shù)據(jù)去重
FastDHT是分布式哈希系統(tǒng)(DHT),使用BerkeleyDB做數(shù)據(jù)存儲(chǔ),使用libevent做網(wǎng)絡(luò)IO處理。依賴于libfastcommon組件。
下載
去Oracle官方網(wǎng)站下載 Berkeley DB 數(shù)據(jù)庫,去Fastdfs的GitHub主頁下載FastDHT的源碼包。由于之前已經(jīng)安裝過linevent和libfastcommon,因此只需要安裝數(shù)據(jù)庫和FastDHT即可。
安裝配置數(shù)據(jù)庫與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
: 指定數(shù)據(jù)庫提供的頭文件目錄
-L
: 指定數(shù)據(jù)庫提供的庫文件目錄
./make.sh ./make.sh install cd ../ rm -rf fastdht-master
配置
mkdir /data/fdht
修改 /etc/fdht/fdht_client.conf
內(nèi)容:
base_path=/data/fdht #include /etc/fdht/fdht_servers.conf
修改 /etc/fdht/fdht_servers.conf
內(nèi)容:
group0 = 192.168.80.3:11411
修改 /etc/fdht/fdhtd.conf
內(nèi)容:
base_path=/data/fdht #include /etc/fdht/fdht_servers.conf
修改 /etc/fdfs/storage.conf
內(nèi)容:
check_file_duplicate=1 key_namespace=FastDFS keep_alive=1 #include /etc/fdht/fdht_servers.conf
主要需要包含服務(wù)器端配置文件。
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
啟動(dòng)并測試
fdhtd /etc/fdht/fdhtd.conf
重啟使用:
fdhtd /etc/fdht/fdhtd.conf restart
查看結(jié)果:
netstat -tunlap | grep :11411 tcp 0 0 0.0.0.0:11411 0.0.0.0:* LISTEN 20605/fdhtd
由于安裝FastDHT的時(shí)候關(guān)閉了FastDFS,因此需要啟動(dòng)FastDFS
./start-service
修改之前的 start-service
腳本, 在啟動(dòng)tracker和storage服務(wù)之前添加:
fdhtd /etc/fdht/fdhtd.conf
在查看tracker和ngixn網(wǎng)絡(luò)狀態(tài)之前添加:
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
自定義 fastdfs-spring-boot-starter
為了快速構(gòu)建SpringBoot項(xiàng)目,我們可以自定義一個(gè)場景啟動(dòng)器來解決。詳細(xì)信息: https://github.com/bluemiaomiao/fastdfs-spring-boot-starter .
下面使用SpringBoot構(gòu)建一個(gè)示例項(xiàng)目:
添加依賴:
<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); } }
此時(shí)將會(huì)自動(dòng)初始化好全局客戶端。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。