淺析FastDFS及所遇問題集錦
一、FastDFS簡介
FastDFS(最新版本v3.04)是一個開源的輕量級分布式文件系統,它用純C語言實現,支持Linux、FreeBSD、AIX等UNIX系統。它只能通過專有API對文件進行存取訪問,不支持POSIX接口方式,不能mount使用,不是系統級的分布式文件系統,而是應用級的分布式文件存儲服務。
二、FastDFS用途
1)FastDFS主要解決了大容量的文件存儲和高并發訪問的問題,文件存取時實現了負載均衡。
2)FastDFS實現了軟件方式的RAID,可以使用廉價的IDE硬盤進行存儲 ,支持存儲服務器在線擴容。
3)FastDFS特別適合大中型網站使用,用來存儲資源文件(如:圖片、文檔、音頻、視頻等等。
三、FastDFS原理
存儲節點采用了分組(group)的方式。存儲系統由一個或多個group組成,group與group之間的文件是相互獨立的,所有group的文件容量累加就是整個存儲系統中的文件容量。一個group可以由一臺或多臺存儲服務器組成,一個group下的存儲服務器中的文件都是相同的,group中的多臺存儲服務器起到了冗余備份和負載均衡的作用(一個組的存儲容量為該組內存儲服務器容量最小的那個,不同組的Storage server之間不會相互通信,同組內的Storage server之間會相互連接進行文件同步)。
在group中增加服務器時,同步已有的文件由系統自動完成,同步完成后,系統自動將新增服務器切換到線上提供服務。
當存儲空間不足或即將耗盡時,可以動態添加group。只需要增加一臺或多臺服務器,并將它們配置為一個新的group,這樣就擴大了存儲系統的容量。
FastDFS只有兩個角色:Tracker server和Storage server。Tracker server作為中心結點,其主要作用是負載均衡和調度。Tracker server在內存中記錄分組和Storage server的狀態等信息,不記錄文件索引信息,占用的內存量很少。另外,客戶端(應用)和Storage server訪問Tracker server時,Tracker server掃描內存中的分組和Storage server信息,然后給出應答。由此可以看出Tracker server非常輕量化,不會成為系統瓶頸。
FastDFS中的Storage server在其他文件系統中通常稱作Trunk server或Data server。Storage server直接利用OS的文件系統存儲文件。FastDFS不會對文件進行分塊存儲,客戶端上傳的文件和Storage server上的文件一一對應(FastDFS中的文件標識分為兩個部分:組名和文件名,二者缺一不可)。
四、Nginx環境調用FastDFS要求
1)編譯安裝 nginx時附帶 fastdfs-nginx-module 模塊 –add-module=/root/fastdfs-nginx-module/src
2)修改 nginx 配置文件增加 ngx_fastdfs_module;
3)編譯fastdfs_client.so php擴展模塊
4)修改 php.ini 讓 php-fpm 支持fastdfs_client 擴展模塊 extension = fastdfs_client.so
注意:如果要使fastdfs支持web和開機自動腳本(默認是不支持的),需要修改make.sh文件
#WITH_HTTPD=1
#WITH_LINUX_SERVICE=1
(因為是給nginx添加fastdfs模塊,所以不需要fastdfs支持 http 所以就不需要去掉 #WITH_HTTPD=1 前的注釋了)。
五、所遇問題
1. FastDFS適用的場景以及不適用的場景?
FastDFS是為互聯網應用量身定做的一套分布式文件存儲系統,非常適合用來存儲用戶圖片、視頻、文檔等文件。對于互聯網應用,和其他分布式文件系統相比,優勢非常明顯。FastDFS沒有對文件做分塊存儲,因此不太適合分布式計算場景。
2. FastDFS需要的編譯和運行環境是怎樣的?
FastDFS Server僅支持unix系統,在Linux和FreeBSD測試通過。在Solaris系統下網絡通信方面有些問題。編譯需要的其他庫文件有pthread和libevent。pthread使用系統自帶的即可。對libevent的版本要求為1.4.x,建議使用最新的stable版本,如1.4.14b。注意,千萬不要使用libevent 2.0 stable以前的版本。
3. 啟動storage server時,一直處于僵死狀態。
啟動storage server,storage將連接tracker server,如果連不上,將一直重試。直到連接成功,啟動才算真正完成。
出現這樣情況,請檢查連接不上tracker server的原因。
友情提示:從V2.03以后,多tracker server在啟動時會做時間上的檢測,判斷是否需要從別的tracker server同步4個系統文件。
觸發時機是第一個storage server連接上tracker server后,并發起join請求。
如果集群中有2臺tracker server,而其中一臺tracker沒有啟動,可能會導致storage server一直處于僵死狀態。
4. 執行fdfs_test或fdfs_test1上傳文件時,服務器返回錯誤號2
錯誤號2表示沒有ACTIVE狀態的storage server。可以執行fdfs_monitor查看服務器狀態。
5. 如何刪除無效的storage server?
可以使用fdfs_monitor來刪除。命令行如下:
/usr/local/bin/fdfs_monitor delete
例如:
/usr/local/bin/fdfs_monitor /etc/fdfs/client.conf delete group1 192.168.0.100
注意:如果被刪除的storage server的狀態是ACTIVE,也就是該storage server還在線上服務的情況下,是無法刪除掉的。
6. nginx和apache擴展模塊與FastDFS server版本對應關系
擴展模塊1.05: 針對FastDFs server v2.x,要求server版本大于等于v2.09
擴展模塊1.07及以上版本: 針對FastDFs server v3.x
7. 上傳文件失敗,返回錯誤碼28,這是怎么回事?
返回錯誤碼28,表示磁盤空間不足。注意FastDFS中有預留空間的概念,在tracker.conf中設置,配置項為:reserved_storage_space,缺省值為4GB,即預留4GB的空間。請酌情設置reserved_storage_space這個參數,比如可以設置為磁盤總空間的20%左右。
8. nginx擴展模塊,不能正常顯示圖片的問題
在配置文件/etc/fdfs/mod_fastdfs.conf中,缺省的設置是這樣的:http.need_find_content_type=false這個參數在nginx中需要設置為true,apache中應該設置為false