FastDFS介紹及安裝教程

FastDFS

介紹

技術論壇: 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項目架構

[外鏈圖片轉存失敗(img-PNAJ6sNq-1563583358804)(C:\Users\Administrator\Desktop\tmp\fastdfs圖\install.png)]

誰在用?

有人在生產環境中使用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

上傳流程

[外鏈圖片轉存失敗(img-7r3hQfFz-1563583358807)(C:\Users\Administrator\Desktop\tmp\fastdfs圖\upload.png)]

  • 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、文件後綴名(由客戶端指定,主要用於區分文件類型)拼接而成。

下載流程

[外鏈圖片轉存失敗(img-Bbswjg1T-1563583358811)(C:\Users\Administrator\Desktop\tmp\fastdfs圖\download.png)]

  • client詢問tracker下載文件的storage,參數爲文件標識(組名和文件名);
  • tracker返回一臺可用的storage;
  • client直接和storage通訊完成文件下載。

[外鏈圖片轉存失敗(img-tiIw79nV-1563583358812)(C:\Users\Administrator\Desktop\tmp\fastdfs圖\find.jpg)]

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) 支持 不支持
相同內容文件只保存一份 支持 不支持
下載文件時支持文件偏移量 支持 不支持

單機安裝

準備linux服務器或虛擬機

Tracker 和 Storage 安裝在一臺機器上

版本

FastDFS 5.08版本

安裝FastDFS依賴

FastDFS是C語言開發的應用。安裝必須使用make、cmake和gcc編譯器。

yum install -y make cmake gcc gcc-c++

安裝FastDFS核心庫

libfastcommon是從FastDFS 和FastDHT 中提取出來的公共C函數庫

上傳文件後解壓縮

unzip libfastcommon-master.zip -d /usr/local/fastdfs

編譯安裝

libfastmon沒有提供make命令安裝文件。使用的是shell腳本執行編譯和安裝。

shell腳本爲make.sh

編譯

./make.sh

安裝

./make.sh install

有固定的默認安裝位置。在/usr/lib64和/usr/include/fastcommon兩個目錄中。

創建軟連接

因爲 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

FastDFS主程序安裝

上傳並解壓縮

tar -zxf FastDFS_v5.08.tar.gz -C /usr/local/fastdfs

編譯安裝

./make.sh
./make.sh install

安裝後,FastDFS主程序所在位置:

/usr/bin - 可執行文件所在位置。
/etc/fdfs - 配置文件所在位置。
/usr/lib64 - 主程序代碼所在位置
/usr/include/fastdfs - 包含的一些插件組所在位置

服務配置

程序腳本

在/etc/init.d/目錄中,腳本文件是 fdfs-storagedfdfs-trackerd

配置文件

配置文件在/etc/fdfs/目錄中

  • tracker.conf.sample - 跟蹤器服務配置文件模板

  • storage.conf.sample - 存儲服務器配置文件模板

  • client.conf.sample - FastDFS提供的命令行客戶端配置文件模板。可以通過命令行測試FastDFS有效性。

Tracker 服務

修改配置文件

複製一份模板配置文件

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=/var/data/fastdfs-tracker(自定義目錄)

配置中的路徑需要先創建好才能啓動服務

mkdir -p /var/data/fastdfs-tracker

啓動Tracker

/etc/init.d/fdfs_trackerd start

啓動成功後,配置文件中base_path指向的目錄中出現FastDFS服務相關數據目錄(data目錄、logs目錄)

查看服務狀態

ps -ef | grep fdfs

停止服務

/etc/init.d/fdfs_trackerd stop

重啓服務

/etc/init.d/fdfs_trackerd restart

啓動 Storage

配置文件

cd /etc/fdfs
cp storage.conf.sample storage.conf
mkdir -p /var/data/fastdfs-storage/base
mkdir -p /var/data/fastdfs-storage/store

base_path=/home/yuqing/fastdfs -> base_path=/var/data/fastdfs-storage/base(自定義目錄)

store_path0=/home/yuqing/fastdfs -> store_path0=/var/data/fastdfs-storage/store(自定義目錄)

tracker_server=192.168.150.11:22122 -> tracker_server=tracker服務IP:22122

  • base_path - 基礎路徑。用於保存storage server基礎數據內容和日誌內容的目錄。
  • store_path0 - 存儲路徑。是用於保存FastDFS中存儲文件的目錄,就是要創建256*256個子目錄的位置。base_path和store_path0可以使用同一個目錄。
  • tracker_server - 跟蹤服務器位置。就是跟蹤服務器的ip和端口。

啓動服務

要求tracker服務必須已啓動

/etc/init.d/fdfs_storaged start

啓動成功後,配置文件中base_path指向的目錄中出現FastDFS服務相關數據目錄(data目錄、logs目錄)

配置文件中的store_path0指向的目錄中同樣出現FastDFS存儲相關數據錄(data目錄)

其中$store_path0/data/目錄中默認創建若干子孫目錄(兩級目錄層級總計256*256個目錄),是用於存儲具體文件數據的。

Storage服務器啓動比較慢,因爲第一次啓動的時候,需要創建256*256個目錄。

查看服務狀態

/etc/init.d/fdfs_storaged status

停止服務

/etc/init.d/fdfs_storaged stop

重啓服務

/etc/init.d/fdfs_storaged restart

Client

修改配置文件

cd /etc/fdfs
cp client.conf.sample client.conf

client.conf配置文件中主要描述客戶端的行爲,需要進行下述修改:

vi /etc/fdfs/client.conf

base_path=/home/yuqing/fastdfs -> base_path=/fastdfs/client (自定義目錄)

tracker_server=192.168.150.11:22122 -> tracker_server=tracker服務IP:22122

base_path - 就是客戶端命令行執行過程時臨時數據存儲位置。

創建自定義目錄

mkdir -p /fastdfs/client

上傳文件

/usr/local/bin/fdfs_upload_file /etc/fdfs/client.conf /要上傳的文件

[root@node03 data]# /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /root/install.log
group1/M00/00/00/wKiWDV0xfqWAFe1OAAAib-i5DLU637.log

上傳結束後,返回group1/M00/00/00/xxxxxxxxxx.xxx,檢查storage服務結點中的storepath0/data/00/00/store_path0/data/00/00/目錄中是否有上傳的文件(一般情況上傳的文件按順序保存在store_path0/data/00/00/目錄中,不能完全保證)。

上傳文件結果:group1/M00/00/00/wKiWDV0xfqWAFe1OAAAib-i5DLU637.log

  • 組名:group1文件上傳後所在的storage組名稱,在文件上傳成功後有storage服務器返回,需要客戶端自行保存。
  • 虛擬磁盤路徑:M00 storage配置的虛擬路徑,與磁盤選項store_path*對應。如果配置了store_path0則是M00,如果配置了store_path1則是M01,以此類推。
  • 數據兩級目錄:/00/00 storage服務器在每個虛擬磁盤路徑下創建的兩級目錄,用於存儲數據文件。
  • 文件名:wKiWDV0xfqWAFe1OAAAib-i5DLU637.log

刪除文件

/usr/bin/fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKiWDV0xfqWAFe1OAAAi
b-i5DLU637.log

Nginx組件

如果FastDFS中保存的是圖片信息。希望在WEB應用中可以直接訪問FastDFS中的圖片進行顯示。如果操作?

安裝Nginx是爲了WEB應用中可以使用HTTP協議直接訪問Storage服務中存儲的文件。在storage結點所在服務器安裝Nginx組件。

需要安裝兩部分內容。

Nginx應用,在安裝nginx應用的時候,同時要在nginx中增加一個FastDFS的組件。

fastdfs-nginx-module模塊

上傳並解壓

tar -zxf fastdfs-nginx-module_v1.16.tar.gz

修改配置

vi /usr/local/fastdfs/fastdfs-nginx-module/src/config
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"

編譯安裝Nginx

./configure --prefix=/usr/local/tengine
--add-module=/root/fastdfs-nginx-module/src/
make && make install

配置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);
		

[外鏈圖片轉存失敗(img-xtcSQvi3-1563583358817)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1563360427239.png)]

下載文件

@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);
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章