0、docker安裝fastdfs
1、搜索鏡像
docker search fastdfs
2、拉取合適鏡像
選擇合適tag:https://hub.docker.com/
docker pull delron/fastdfs
這個鏡像包含了fastdfs以及nginx,降低自我安裝學習時間
docker images
3、使用鏡像
3.1、使用docker鏡像構建tracker容器(跟蹤服務器,起到調度的作用):
docker run -d -p 22122:22122 --name tracker -v /Users/lihongxu6/docker/myfastdfs/tracker:/var/fdfs delron/fastdfs tracker
使用docker鏡像構建storage容器(存儲服務器,提供容量和備份服務):
docker run -d -p 8888:8888 -p 23000:23000 --name storage -e TRACKER_SERVER=ip:22122 -v /Users/lihongxu6/docker/myfastdfs/storage:/var/fdfs -e GROUP_NAME=group1 delron/fastdfs storage
上面需要填寫你的tracker服務的ip地址,端口默認是22122
3.2、進行服務的配置。
進入storage容器,到storage的配置文件中配置http訪問的端口,配置文件在/etc/fdfs目錄下的storage.conf
docker exec -it storage /bin/bash cd /etc/fdfs/ ls vi storage.conf
查看默認端口: http.server_port=8888 ,也可以不用哪個修改
配置nginx,在/usr/local/nginx目錄下,修改nginx.conf文件
cd /usr/local/nginx/conf
vi nginx.conf
修改http配置
server { listen 8888; server_name localhost; location ~/group[0-9]/ { ngx_fastdfs_module; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
或者針對性修改
location /group1/M00 { alias /var/fdfs; }
此時文件系統以搭建完畢,使用web模塊進行文件的上傳,將文件上傳至FastDFS文件系統
4、測試
監控狀態 fdfs_monitor /etc/fdfs/storage.conf 上傳 fdfs_test /etc/fdfs/client.conf upload /etc/fdfs/tracker.conf.sample /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /etc/fdfs/tracker.conf.sample
url訪問http://ip:8888/group1/M00/00/00/rBEAA14wRpCAcZfHAAAc3T8QekU.sample,即可
5、服務重啟
pkill -9 fdfs /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf /usr/bin/fdfs_storaged /etc/fdfs/storage.conf
一、概述
FastDFS是一個開源的輕量級分布式文件系統,它對文件進行管理,功能包括:文件存儲、文件同步、文件訪問(文件上傳、文件下載)等,解決了大容量存儲和負載均衡的問題。特別適合以文件為載體的在線服務,如相冊網站、視頻網站等等。
FastDFS為互聯網量身定制,充分考慮了冗余備份、負載均衡、線性擴容等機制,並注重高可用、高性能等指標,使用FastDFS很容易搭建一套高性能的文件服務器集群提供文件上傳、下載等服務。
1.1、簡介
FastDFS服務端有兩個角色:跟蹤器(tracker)和存儲節點(storage)。跟蹤器主要做調度工作,在訪問上起負載均衡的作用。
存儲節點存儲文件,完成文件管理的所有功能:就是這樣的存儲、同步和提供存取接口,FastDFS同時對文件的metadata進行管理。所謂文件的meta data就是文件的相關屬性,以鍵值對(key valuepair)方式表示,如:width=1024,其中的key為width,value為1024。文件metadata是文件屬性列表,可以包含多個鍵值對。
tracker:跟蹤服務器, 主要做調度工作, 起負載均衡的作用。 在內存中記錄集群中所有存儲組和存儲服務器的狀態信息, 是客戶端和數據服務器交互的樞紐。 相比GFS中的master更為精簡, 不記錄文件索引信息, 占用的內存量很少。
1.2、存儲策略
為了支持大容量,存儲節點(服務器)采用了分卷(或分組)的組織方式。存儲系統由一個或多個卷組成,卷與卷之間的文件是相互獨立的,所有卷的文件容量累加就是整個存儲系統中的文件容量。一個卷可以由一台或多台存儲服務器組成,一個卷下的存儲服務器中的文件都是相同的,卷中的多台存儲服務器起到了冗余備份和負載均衡的作用。
在卷中增加服務器時,同步已有的文件由系統自動完成,同步完成后,系統自動將新增服務器切換到線上提供服務。當存儲空間不足或即將耗盡時,可以動態添加卷。只需要增加一台或多台服務器,並將它們配置為一個新的卷,這樣就擴大了存儲系統的容量。
1.2.1、上傳交互過程
FastDFS向使用者提供基本文件訪問接口,比如upload、download、append、delete等,以客戶端庫的方式提供給用戶使用。
Storage Server會定期的向Tracker Server發送自己的存儲信息。當Tracker Server Cluster中的Tracker Server不止一個時,各個Tracker之間的關系是對等的,所以客戶端上傳時可以選擇任意一個Tracker。
當Tracker收到客戶端上傳文件的請求時,會為該文件分配一個可以存儲文件的group,當選定了group后就要決定給客戶端分配group中的哪一個storage server。當分配好storage server后,客戶端向storage發送寫文件請求,storage將會為文件分配一個數據存儲目錄。然后為文件分配一個fileid,最后根據以上的信息生成文件名存儲文件。
1.2.2、下載交互過程
客戶端uploadfile成功后,會拿到一個storage生成的文件名,接下來客戶端根據這個文件名即可訪問到該文件。
跟upload file一樣,在downloadfile時客戶端可以選擇任意tracker server。tracker發送download請求給某個tracker,必須帶上文件名信息,tracke從文件名中解析出文件的group、大小、創建時間等信息,然后為該請求選擇一個storage用來服務讀請求。
1.3、文件同步
寫文件時,客戶端將文件寫至group內一個storage server即認為寫文件成功,storage server寫完文件后,會由后台線程將文件同步至同group內其他的storage server。
每個storage寫文件后,同時會寫一份binlog,binlog里不包含文件數據,只包含文件名等元信息,這份binlog用於后台同步,storage會記錄向group內其他storage同步的進度,以便重啟后能接上次的進度繼續同步;進度以時間戳的方式進行記錄,所以最好能保證集群內所有server的時鍾保持同步。
storage的同步進度會作為元數據的一部分匯報到tracker上,tracke在選擇讀storage的時候會以同步進度作為參考。
1.4、結合nginx
在使用 FastDFS 部署一個分布式文件系統的時候,通過 FastDFS 的客戶端 API 來進行文件的上傳、下載、刪除等操作。同時通過 FastDFS 的 HTTP 服務器來提供 HTTP 服務。但是 FastDFS 的 HTTP 服務較為簡單,無法提供負載均衡等高性能的服務,我們使用 FastDFS 的 Nginx 模塊來彌補這一缺陷。
FastDFS 通過 Tracker 服務器,將文件放在 Storage 服務器存儲,但是同組之間的服務器需要復制文件,有延遲的問題.假設 Tracker 服務器將文件上傳到了 192.168.1.80,文件ID已經返回客戶端,這時,后台會將這個文件復制到 192.168.1.30,如果復制沒有完成,客戶端就用這個 ID 在 192.168.1.30 取文件,肯定會出現錯誤。這個 fastdfs-nginx-module 可以重定向連接到源服務器取文件,避免客戶端由於復制延遲的問題,出現錯誤。
主要解決的問題及場景
1 解決海量存儲,同時存儲容量擴展方便。
2 解決文件內容重復,如果用戶上傳的文件重復(文件指紋一樣),那么系統只有存儲一份數據,值得一提的是,這項技術目前被廣泛應用在網盤中。
3 結合Nginx提高網站讀取圖片的效率。
特別適合以中小文件( 建議范圍: 4KB 到 500MB ) 為載體的在線服務, 如相冊網站、 視頻網站等等。
1.5、其他資源
- 源碼地址:https://github.com/happyfish100
- 下載地址:http://sourceforge.net/projects/fastdfs/files/
- 官方論壇:http://bbs.chinaunix.net/forum-240-1.html
- java客戶端:https://github.com/happyfish100/fastdfs-client-java
1.6、對比
指標 | 適合類型 | 文件分布 | 系統性能 | 復雜度 | FUSE | POSIX | 備份機制 | 通訊協議接口 | 社區支持 | 開發語言 |
---|---|---|---|---|---|---|---|---|---|---|
FastDFS | 4KB~500MB | 小文件合並存儲不分片處理 | 很高 | 簡單 | 不支持 | 不支持 | 組內冗余備份 | Api HTTP | 國內用戶群 | C語言 |
TFS | 所有文件 | 小文件合並,以block組織分片 | 復雜 | 不支持 | Block存儲多份,主輔災備 | API http | 少 | C++ | ||
MFS | 大於64K | 分片存儲 | Master占內存多 | 支持 | 支持 | 多點備份動態冗余 | 使用fuse掛在 | 較多 | Perl | |
HDFS | 大文件 | 大文件分片分塊存儲 | 簡單 | 支持 | 支持 | 多副本 | 原生api | 較多 | Java | |
Ceph | 對象文件塊 | OSD一主多從 | 復雜 | 支持 | 支持 | 多副本 | 原生api | 較少 | C++ | |
MogileFS | 海量小圖片 | 高 | 復雜 | 可以支持 | 不支持 | 動態冗余 | 原生api | 文檔少 | Perl | |
ClusterFS | 大文件 | 簡單 | 支持 | 支持 | 多 | C |
1.7、部署結構

二、springboot結合