FastDFS
介紹
FastDFS 是一個由 C 語言實現的開源輕量級分佈式文件系統,作者餘慶(happyfish100),支持 Linux、FreeBSD、AID 等 Unix 系統,解決了大數據存儲和讀寫負載均衡等問題,適合存儲 4KB~500MB 之間的小文件,如圖片網站、短視頻網站、文檔、app 下載站等,UC、京東、支付寶、迅雷、酷狗等都有使用。
該軟件作者是阿里巴巴大牛、chinaUnix版主餘慶個人獨立開發的。
技術論壇: http://bbs.chinaunix.net/forum-240-1.html
FAQ:http://bbs.chinaunix.net/thread-1920470-1-1.html
資源地址: https://sourceforge.net/projects/fastdfs/
源碼資源: https://github.com/happyfish100
FastDFS是一個開源的輕量級分佈式文件系統,它對文件進行管理,功能包括:文件存儲、文件同步、文件訪問(文件上傳、文件下載)等,解決了大容量存儲和負載均衡的問題。特別適合以文件爲載體的在線服務,如相冊網站、視頻網站等等。
FastDFS爲互聯網量身定製,充分考慮了冗餘備份、負載均衡、線性擴容等機制,並注重高可用、高性能等指標,使用FastDFS很容易搭建一套高性能的文件服務器集羣提供文件上傳、下載等服務。
FastDFS服務端有兩個角色:跟蹤器(tracker)和存儲節點(storage)。
跟蹤器主要做調度工作,在訪問上起負載均衡的作用。
存儲節點存儲文件,完成文件管理的所有功能:就是這樣的存儲、同步和提供存取接口,FastDFS同時對文件的metadata進行管理。
所謂文件的meta data就是文件的相關屬性,以鍵值對(key value)方式表示,如:width=1024,其中的key爲width,value爲1024。文件metadata是文件屬性列表,可以包含多個鍵值對。
跟蹤器和存儲節點都可以由一臺或多臺服務器構成。跟蹤器和存儲節點中的服務器均可以隨時增加或下線而不會影響線上服務。其中跟蹤器中的所有服務器都是對等的,可以根據服務器的壓力情況隨時增加或減少。
爲了支持大容量,存儲節點(服務器)採用了**分卷(或分組)**的組織方式。存儲系統由一個或多個卷組成,卷與卷之間的文件是相互獨立的,所有卷的文件容量累加就是整個存儲系統中的文件容量。一個卷可以由一臺或多臺存儲服務器組成,一個卷下的存儲服務器中的文件都是相同的,卷中的多臺存儲服務器起到了冗餘備份和負載均衡的作用。
在卷中增加服務器時,同步已有的文件由系統自動完成,同步完成後,系統自動將新增服務器切換到線上提供服務。
當存儲空間不足或即將耗盡時,可以動態添加捲。只需要增加一臺或多臺服務器,並將它們配置爲一個新的卷,這樣就擴大了存儲系統的容量。
FastDFS中的文件標識分爲兩個部分:卷名和文件名,二者缺一不可。
web項目架構
誰在用?
有人在生產環境中使用FastDFS嗎?
答案是肯定的。據我所知,截止2012年底至少有25家公司在使用FastDFS,其中有好幾家是做網盤的公司。
其中存儲量最大的一家,集羣中存儲group數有400個,存儲服務器超過800臺,存儲容量達到6PB,文件數超過1億,Group持續增長中。。。
以下是使用FastDFS的用戶列表:
某大型網盤(因對方要求對公司名保密,就不提供名字了。有400個group,存儲容量達到了6PB,文件數超過1億)
UC (http://www.uc.cn/,存儲容量超過10TB)
支付寶(http://www.alipay.com/)
京東商城(http://www.360buy.com/)
淘淘搜(http://www.taotaosou.com/)
飛信(http://feixin.1008**/)
趕集網(http://www.ganji.com/)
淘米網(http://www.61.com/)
迅雷(http://www.xunlei.com/)
螞蜂窩(http://www.mafengwo.cn/)
丫丫網(http://www.iyaya.com/)
虹網(http://3g.ahong.com)
5173(http://www.5173.com/)
華夏原創網(http://www.yuanchuang.com/)
華師京城教育雲平臺(http://www.hsjdy.com.cn/)
視友網(http://www.cuctv.com/)
搜道網(http://www.sodao.com/)
58同城(http://www.58.com/)
商務聯盟網(http://www.biz72.com/)
中青網(http://www.youth.cn/)
繽麗網 (http://www.binliy.com/)
飛視雲視頻(http://www.freeovp.com/)
夢芭莎(http://www.moonbasa.com/)
活動幫(www.eventsboom.com)
51CTO(http://www.51cto.com/)
搜房網(http://www.soufun.com/)
架構
-
tracker Server:
- 主節點,跟蹤服務器,主要做調度工作,在訪問上起負載均衡的作用。
- 記錄storage server的狀態,是連接Client和Storage server的樞紐。
- FastDFS集羣中的Tracker server可以有多臺,Trackerserver之間是相互平等關係同時提供服務
- Trackerserver不存在單點故障。客戶端請求Trackerserver採用輪詢方式,如果請求的tracker無法提供服務則換另一個tracker。
-
Storage Server:
- 存儲服務器,文件和meta data都保存到存儲服務器上
- storage集羣由一個或多個組構成,集羣存儲總容量爲集羣中所有組的存儲容量之和。
- 一個組由一臺或多臺存儲服務器組成,組內的Storage server之間是平等關係
- 不同組的Storageserver之間不會相互通信,同組內的Storageserver之間會相互連接進行文件同步,從而保證同組內每個storage上的文件完全一致的。
- 一個組的存儲容量爲該組內存儲服務器容量最小的那個,由此可見組內存儲服務器的軟硬件配置最好是一致的。
- Storage server會連接集羣中所有的Tracker server,定時向他們報告自己的狀態,包括磁盤剩餘空間、文件同步狀況、文件上傳下載次數等統計信息。
-
group:組,也稱爲卷。同組內服務器上的文件是完全相同的
-
文件標識:包括兩部分:組名和文件名(包含路徑)
-
meta data:文件相關屬性,鍵值對(Key Value Pair)方式,如:width=1024,heigth=768
上傳流程
- client詢問tracker上傳到的storage,不需要附加參數;
- tracker返回一臺可用的storage;
- client直接和storage通訊完成文件上傳
內部機制 流程如下:
1、選擇tracker server
當集羣中不止一個tracker server時,由於tracker之間是完全對等的關係,客戶端在upload文件時可以任意選擇一個trakcer。
選擇存儲的group
當tracker接收到upload file的請求時,會爲該文件分配一個可以存儲該文件的group,支持如下選擇group的規則:
- 1、Round robin,所有的group間輪詢
- 2、Specified group,指定某一個確定的group
- 3、Load balance,剩餘存儲空間多多group優先
2、選擇storage server
當選定group後,tracker會在group內選擇一個storage server給客戶端,支持如下選擇storage的規則:
- 1、Round robin,在group內的所有storage間輪詢
- 2、First server ordered by ip,按ip排序
- 3、First server ordered by priority,按優先級排序(優先級在storage上配置)
3、選擇storage path
當分配好storage server後,客戶端將向storage發送寫文件請求,storage將會爲文件分配一個數據存儲目錄,支持如下規則:
- 1、Round robin,多個存儲目錄間輪詢
- 2、剩餘存儲空間最多的優先
4、生成Fileid
選定存儲目錄之後,storage會爲文件生一個Fileid,由storage server ip、文件創建時間、文件大小、文件crc32和一個隨機數拼接而成,然後將這個二進制串進行base64編碼,轉換爲可打印的字符串。
選擇兩級目錄
當選定存儲目錄之後,storage會爲文件分配一個fileid,每個存儲目錄下有兩級256*256的子目錄,storage會按文件fileid進行兩次hash(猜測),路由到其中一個子目錄,然後將文件以fileid爲文件名存儲到該子目錄下。
5、生成文件名
當文件存儲到某個子目錄後,即認爲該文件存儲成功,接下來會爲該文件生成一個文件名,文件名由group、存儲目錄、兩級子目錄、fileid、文件後綴名(由客戶端指定,主要用於區分文件類型)拼接而成。
下載流程
- client詢問tracker下載文件的storage,參數爲文件標識(組名和文件名);
- tracker返回一臺可用的storage;
- client直接和storage通訊完成文件下載。
binlog
每個storage寫文件後,同時會寫一份binlog,binlog裏不包含文件數據,只包含文件名等元信息,這份binlog用於後臺同步,storage會記錄向group內其他storage同步的進度,以便重啓後能接上次的進度繼續同步;進度以時間戳的方式進行記錄,所以最好能保證集羣內所有server的時鐘保持同步。
FastDFS和其他文件存儲的簡單對比
指標 | FastDFS | NFS | 集中存儲設備 如NetApp、NAS |
---|---|---|---|
線性擴容性 | 高 | 差 | 差 |
文件高併發訪問性能 | 高 | 差 | 一般 |
文件訪問方式 | 專有API | POSIX | 支持POSIX |
硬件成本 | 較低 | 中等 | 高 |
相同內容文件只保存一份 | 支持 | 不支持 | 不支持 |
指標 | FastDFS | mogileFS |
---|---|---|
系統簡潔性 | 簡潔 只有兩個角色:tracker和storage | 一般 有三個角色:tracker、storage和存儲文件信息的mysql db |
系統性能 | 很高(沒有使用數據庫,文件同步直接點對點,不經過tracker中轉) | 高(使用mysql來存儲文件索引等信息,文件同步通過tracker調度和中轉) |
系統穩定性 | 高(C語言開發,可以支持高併發和高負載) | 一般(Perl語言開發,高併發和高負載支持一般) |
軟RAID方式 | 分組(組內冗餘),靈活性較大 | 動態冗餘,靈活性一般 |
通信協議 | 專有協議 下載文件支持HTTP | HTTP |
技術文檔 | 較詳細 | 較少 |
文件附加屬性(meta data) | 支持 | 不支持 |
相同內容文件只保存一份 | 支持 | 不支持 |
下載文件時支持文件偏移量 | 支持 | 不支持 |
安裝教程
Tracker 和 Storage 安裝在一臺機器上
需要的軟件,及其版本
FastDFS 5.05版本
1. 安裝FastDFS依賴
FastDFS是C語言開發,安裝必須使用make、cmake和gcc編譯器。建議在linux上運行,本教程使用Centos7.0作爲安裝環境。
安裝gcc 依賴環境 yum install gcc-c++ -y
如安裝redis的時候,可能需要 yum install gcc-c++ -y automake autoconf 這個兩個依賴。
如果沒有外網:則需要安裝本地yum源
yum install -y make cmake gcc gcc-c++
2. 安裝FastDFS核心庫
libfastcommon是從FastDFS 和FastDHT 中提取出來的公共C函數庫
上傳文件後解壓縮
tar -zxvf libfastcommonV1.0.7.tar.gz
編譯安裝
libfastmon沒有提供make命令安裝文件。使用的是shell腳本執行編譯和安裝。
shell腳本爲make.sh
編譯
./make.sh
安裝
./make.sh install
如果出現編譯perl 不識別 運行下面這段命令 – os7
yum -y install zlib zlib-devel pcre pcre-devel gcc gcc-c++ openssl openssl-devel libevent libevent-devel perl unzip net-tools wget
有固定的默認安裝位置。在/usr/lib64和/usr/include/fastcommon兩個目錄中。
注意:libfastcommon安裝好後會自動將庫文件拷貝至/usr/lib64下,由於FastDFS程序引用/usr/lib目錄,所以需要將/usr/lib64下的庫文件拷貝至/usr/lib下。
創建軟連接 超鏈接
因爲 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 -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so
ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so
3. FastDFS tracker安裝
快速說明: tracker編譯安裝
1、上傳資料FastDFS_v5.05.tar.gz到 /usr/local 目錄下
2、解壓編譯安裝
tar -zxvf FastDFS_v5.05.tar.gz
cd FastDFS
./make.sh
./make.sh install
3、安裝成功之後,將安裝目錄下的conf下的文件拷貝到/etc/fdfs/下。
cd conf
cp * /etc/fdfs/
4、修改配置文件
vim /etc/fdfs/tracker.conf
上傳並解壓縮
tar -zxf FastDFS_v5.05.tar.gz -C /usr/local/fastdfs
編譯安裝
./make.sh
./make.sh install
安裝後,FastDFS主程序所在位置:
/usr/bin - 可執行文件所在位置。
/etc/fdfs - 配置文件所在位置。
/usr/lib64 - 主程序代碼所在位置
/usr/include/fastdfs - 包含的一些插件組所在位置
4. 服務配置
fastdfs配置中的說明
目錄 | 說明 |
---|---|
/opt/fastdfs/ | 數據文件及日誌 |
/usr/bin/fdfs_trackerd 、 fdfs_storaged | 啓動執行程序 |
/usr/local/fdfs/stop.sh 、 restart.sh | 關閉、重啓腳本 |
/etc/init.d/fdfs_tracked 、fdfs_storaged | 服務啓動腳本 |
/etc/fdfs/ | 配置文件 |
程序腳本
在/etc/init.d/目錄中,腳本文件是 fdfs-storaged和fdfs-trackerd
配置文件
配置文件在/etc/fdfs/
目錄中
-
tracker.conf.sample - 跟蹤器服務配置文件模板
-
storage.conf.sample - 存儲服務器配置文件模板
-
client.conf.sample - FastDFS提供的命令行客戶端配置文件模板。可以通過命令行測試FastDFS有效性。
5.配置 Tracker 服務
5.1 修改配置文件tracker.conf
複製一份模板配置文件,在tracker.conf中去配置
cd /etc/fdfs
cp tracker.conf.sample tracker.conf
打開 tracker.conf
修改 base_path 路徑,base_path是FastDFSTracker啓動後使用的根目錄,用來存放Tracker data和logs。
base_path=/home/yuqing/fastdfs -> base_path=/opt/fastdfs(自定義目錄)
配置中的路徑需要先創建好才能啓動服務
mkdir -p /opt/fastdfs
5.2 配置啓動腳本fdfs_trackerd
下面以註冊服務的方式說明
mkdir /usr/local/fdfs
拷貝安裝目錄/usr/local/FastDFS下stop.sh 和restart.sh 到/usr/local/fdfs/
cp restart.sh /usr/local/fdfs/
cp stop.sh /usr/local/fdfs/
修改啓動腳本fdfs_trackerd
vim /etc/init.d/fdfs_trackerd
改完後如下:
註冊服務
cd /etc/init.d/
chkconfig --add fdfs_trackerd
可以使用 chkconfig --list 查看是否已經添加成功!
下面就可以通過service fdfs_tracker start啓動了
如果啓動失敗,或者報錯。請檢查上面的操作,重新配置!!!
6. 配置Storage服務
Storage是配置文件存放的地方
6.1 配置文件storage.conf
創建fdfs_storage文件夾
mkdir /opt/fastdfs/fdfs_storage
修改配置文件storage.conf
說明:
- base_path - 基礎路徑。用於保存storage server基礎數據內容和日誌內容的目錄。
- store_path0 - 存儲路徑。是用於保存FastDFS中存儲文件的目錄,就是要創建256*256個子目錄的位置。base_path和store_path0可以使用同一個目錄。
- tracker_server - 跟蹤服務器位置。就是跟蹤服務器的ip和端口。
vim /etc/fdfs/storage.conf
#行號:41,109,118
# 41行修改
base_path=/opt/fastdfs
# 109行修改 文件真實存放的位置
# 需要新建改目錄 mkdir fdfs_storage
store_path0=/opt/fastdfs/fdfs_storage
# 118行修改 tracker的服務地址
tracker_server=192.168.100.171:22122
6.2 配置啓動腳本fdfs_storaged
vim /etc/init.d/fdfs_storaged
這個修改和上面的一樣,主要是修改五個地方。說明修改原因:主要是把restart.sh和stop.sh這兩個文件複製到/usr/local/fdfs/
- 15行 PRG=/usr/bin/fdfs_storaged
- 23行 if [ ! -f /usr/local/fdfs/stop.sh ]; then echo也可對應修改
- 28行 if [ ! -f /usr/local/fdfs/stop.sh ]; then echo也可對應修改
- 49行 /usr/local/fdfs/stop.sh $CMD
- 57行 /usr/local/fdfs/restart.sh $CMD &
chkconfig - -add fdfs_storaged
chkconfig --list
啓動服務
service fdfs_storaged start
cd /etc/fdfs
cp storage.conf.sample storage.conf
mkdir -p /var/data/fastdfs-storage/base
mkdir -p /var/data/fastdfs-storage/store
7. 啓動fdfs_tracker、fdfs_storage服務
要求tracker服務必須已啓動
service fdfs_storage start
啓動成功後,配置文件中base_path指向的目錄中出現FastDFS服務相關數據目錄(data目錄、logs目錄)
配置文件中的store_path0指向的目錄中同樣出現FastDFS存儲相關數據錄(data目錄)
其中$store_path0/data/目錄中默認創建若干子孫目錄(兩級目錄層級總計256256個目錄),是用於存儲具體文件數據的。
Storage服務器啓動比較慢,因爲第一次啓動的時候,需要創建256256個目錄。
8. 配置Client,測試文件上傳
FastDFS安裝成功可通過/usr/bin/fdfs_test測試上傳、下載等操作。
修改配置文件client.conf
client.conf配置文件中主要描述客戶端的行爲,需要進行下述修改:
vim /etc/fdfs/client.conf
# 修改base_path
# base_path - 就是客戶端命令行執行過程時臨時數據存儲位置。
base_path=/home/yuqing/fastdfs -> base_path=/opt/fastdfs/client (自定義目錄)
# 修改tracker_server
tracker_server=192.168.150.11:22122 -> tracker_server= tracker服務IP:22122
測試上傳文件
通過/usr/bin/fdfs_test測試上傳、下載等操作
/usr/bin/fdfs_test /etc/fdfs/client.conf upload /root/2020.jpg
上傳結束後,返回group1/M00/00/00/xxxxxxxxxx.xxx,檢查storage服務結點中的store_path0/data/00/00/目錄中,不能完全保證)。
上傳文件結果:group1/M00/00/00/wKhkq17oeeSAIPGoAAC6XqVqo6A044_big.jpg
- 組名:group1文件上傳後所在的storage組名稱,在文件上傳成功後有storage服務器返回,需要客戶端自行保存。
- 虛擬磁盤路徑:M00 storage配置的虛擬路徑,與磁盤選項store_path*對應。如果配置了store_path0則是M00,如果配置了store_path1則是M01,以此類推。
- 數據兩級目錄:/00/00 storage服務器在每個虛擬磁盤路徑下創建的兩級目錄,用於存儲數據文件。
- 文件名:**wKhkq17oeeSAIPGoAAC6XqVqo6A044_big.jpg
**
刪除文件
/usr/bin/fdfs_delete_file 刪除文件
/usr/bin/fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKiWDV0xfqWAFe1OAAAib-i5DLU637.log
9. FastDFS整合Nginx
如果FastDFS中保存的是圖片信息。希望在WEB應用中可以直接訪問FastDFS中的圖片進行顯示。如果操作?
安裝Nginx是爲了WEB應用中可以使用HTTP協議直接訪問Storage服務中存儲的文件。在storage結點所在服務器安裝Nginx組件。
需要安裝兩部分內容。
Nginx應用,在安裝nginx應用的時候,同時要在nginx中增加一個FastDFS的組件。
安裝前配置fastdfs-nginx-module
fastdfs-nginx-module模塊
上傳fastdfs-nginx-module_v1.16.tar.gz上傳到 /usr/local,並解壓
tar -zxvf fastdfs-nginx-module_v1.16.tar.gz
編輯配置文件:修改config文件將/usr/local/路徑改爲/usr/ 3處
vim fastdfs-nginx-module/src/config
上傳並解壓
tar -zxf fastdfs-nginx-module_v1.16.tar.gz
修改配置fastdfs-nginx-module/src/config
vim /usr/local/fastdfs/fastdfs-nginx-module/src/config
將fastdfs-nginx-module/src下的mod_fastdfs.conf拷貝至/etc/fdfs/下(配置文件都放在/etc/fdfs/下面)
cp mod_fastdfs.conf /etc/fdfs/
# 並修改mod_fastdfs.conf的內容:
vim /etc/fdfs/mod_fastdfs.conf
修改行號 10,40 ,53,62
修改 url中包含group名稱
修改指定文件存儲路徑
最後,將libfdfsclient.so拷貝至/usr/lib下
cp /usr/lib64/libfdfsclient.so /usr/lib/
編譯安裝Nginx
安裝nginx 需要先配置nginx 的運行環境
-
Nginx服務器搭建
第一步:安裝C語言編譯環境
gcc:
yum -y install gcc-c++
第二步:安裝第三方的開發包。pcre 、 zlib 、OpenSSL
PCRE
PCRE(Perl Compatible Regular Expressions)是一個Perl庫,包括 Perl 兼容的正則表達式庫。Nginx的HTTP模塊使用PCRE來解析正則表達式,所以需要在Linux上安裝PCRE庫。
yum install -y pcre pcre-devel
注:pcre-devel是使用PCRE開發的一個二次開發庫。Nginx也需要這個庫。
zlib
zlib庫提供了很多種壓縮和解壓縮的方式,Nginx使用zlib對HTTP包的內容進行gzip,所以需要在Linux上安裝zlib庫。
yum install -y zlib zlib-devel
OpenSSL
OpenSSL是一個強大的安全套接字層密碼庫,囊括主要的密碼算法、常用的密鑰和證書封裝管理功能及SSL協議,並提供豐富的應用程序供測試或其它目的使用。
nginx不僅支持http協議,還支持https(即在ssl協議上傳輸http),所以需要在linux安裝openssl庫。
yum install -y openssl openssl-devel -
Nginx安裝
上傳文件
nginx-1.12.2.tar.gz
創建nginx/client目錄
解壓:nginx-1.12.2.tar.gz
cd nginx-1.12.2
mkdir -p /var/temp/nginx/client
cd /usr/local/nginx-1.12.2的原始程序目錄 [/usr/local/nginx-1.12.2]
configure: 表示自動配置nginx 的相關目錄!
複製運行下面初始化配置
./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=/usr/local/fastdfs-nginx-module/src
配置成功
編譯
make
安裝
make install
編輯nginx.conf 配置代理!
編輯 nginx 的安裝路徑的nginx.conf
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name 192.168.67.204;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
location /group1/M00/ {
ngx_fastdfs_module;
}
#啓動nginx
/usr/local/nginx/sbin/nginx
#重啓:
/usr/local/nginx/sbin/nginx -s reload
啓動成功,訪問之前上傳返回的url
http://192.168.100.171/group1/M00/00/00/wKhkq17oeeSAIPGoAAC6XqVqo6A044_big.jpg
配置fastdfs-nginx-module
拷貝配置文件
cp /root/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
修改配置文件 mod_fastdfs.conf
tracker_server=192.168.2.109:22122
url_have_group_name = true
store_path0=/var/data/fastdfs-storage/store
拷貝http服務需要的配置
複製FastDFS安裝包中的兩個配置文件(http.conf和mime.types)到/etc/fdfs目錄中
創建網絡訪問存儲服務的軟連接
在上傳文件到FastDFS後,FastDFS會返回group1/M00/00/00/xxxxxxxxxx.xxx。其中group1是卷名,在mod_fastdfs.conf配置文件中已配置了url_have_group_name,以保證URL解析正確。
而其中的M00是FastDFS保存數據時使用的虛擬目錄,需要將這個虛擬目錄定位到真實數據目錄上。
ln -s /var/data/fastdfs-storage/store/data/ /var/data/fastdfs-storage/store/data/M00
修改nginx配置文件
location ~ /group([0-9])/M00 {
ngx_fastdfs_module;
}
http://192.168.150.11/group1/M00/00/00/wKiWC10xxc6AfHCKAAAib-i5DLU543_big.log
文件名
add_header Content-Disposition "attachment;filename=$arg_attname";
JavaApi
https://github.com/tobato/FastDFS_Client
RAID
配置
fdfs:
so-timeout: 1500
connect-timeout: 600
tracker-list:
- 192.168.150.13:22122
上傳文件
// 元數據
Set<MetaData> metaDataSet = new HashSet<MetaData>();
metaDataSet.add(new MetaData("Author", "yimingge"));
metaDataSet.add(new MetaData("CreateDate", "2016-01-05"));
try {
StorePath uploadFile = null;
uploadFile = fc.uploadFile(filename.getInputStream(), filename.getSize(), getFileExtName(filename.getOriginalFilename()), metaDataSet);
account.setPassword(password);
account.setLocation(uploadFile.getPath());
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
獲取文件後綴
private String getFileExtName(String name) {
// TODO Auto-generated method stub
return (name.substring(name.lastIndexOf(".")+1));
}
或
FilenameUtils.getExtension
返回結果帶group
uploadFile.getFullPath() : group1/M00/00/00/wKiWDV0u7ZKALKtNAAADP9sEx2w432.sql
不帶group
uploadFile.getPath() : M00/00/00/wKiWDV0u7ZKALKtNAAADP9sEx2w432.sql
縮略圖
配置
thumb-image:
width: 150
height: 150
uploadFile = fc.uploadImageAndCrtThumbImage(filename.getInputStream(), filename.getSize(), FilenameUtils.getExtension(filename.getOriginalFilename()), metaDataSet);
下載文件
@RequestMapping("/down")
@ResponseBody
public ResponseEntity<byte[]> down(HttpServletResponse resp) {
DownloadByteArray cb = new DownloadByteArray();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentDispositionFormData("attachment", "aaa.xx");
byte[] bs = fc.downloadFile("group1", "M00/00/00/wKiWDV0vAb-AcOaYABf1Yhcsfws9181.xx", cb);
return new ResponseEntity<>(bs,headers,HttpStatus.OK);
}