Fastdfs 相關問題彙總

定位問題首先要看日誌文件。出現問題時,先檢查返回的錯誤號和錯誤信息。而後查看服務器端日誌,相信能夠定位到問題所在。
1. FastDFS適用的場景以及不適用的場景?
 FastDFS是爲互聯網應用量身定作的一套分佈式文件存儲系統,很是適合用來存儲用戶圖片、視頻、文檔等文件。對於互聯網應用,和其餘分佈式文件系統相比,優點很是明顯。具體狀況你們能夠看相關的介紹文檔,包括FastDFS介紹PPT等等。
 出於簡潔考慮,FastDFS沒有對文件作分塊存儲,所以不太適合分佈式計算場景。
 
2. FastDFS須要的編譯和運行環境是怎樣的?
 FastDFS Server僅支持unix系統,在Linux和FreeBSD測試經過。在Solaris系統下網絡通訊方面有些問題。
 編譯須要的其餘庫文件有pthread和libevent。
 pthread使用系統自帶的便可。
 對libevent的版本要求爲1.4.x,建議使用最新的stable版本,如1.4.14b。
 注意,千萬不要使用libevent 2.0非stable版本。
 測試了一下,libevent 2.0.10是能夠正常工做的。
 在64位系統下,可能須要本身在/usr/lib64下建立libevent.so的符號連接。好比:
 ln -s /usr/lib/libevent.so /usr/lib64/libevent.so
 在ubuntu 11及後續版本,可能會出現找不到動態庫pthread庫,解決方法參見:http://bbs.chinaunix.net/thread-2324388-1-2.html
 
3. 有人在生產環境中使用FastDFS嗎?
 答案是確定的。據我所知,至少有20家公司在使用FastDFS,其中有好幾家是作網盤的公司。
 其中存儲量最大的一家,集羣中存儲group數有200個,存儲服務器超過200臺,存儲容量達到3PB,文件數近1億,Group持續增加中。。。html

 
4. 啓動storage server時,一直處於僵死狀態。
 A:啓動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一直處於僵死狀態。
 
5. 執行fdfs_test或fdfs_test1上傳文件時,服務器返回錯誤號2
 錯誤號表示沒有ACTIVE狀態的storage server。能夠執行fdfs_monitor查看服務器狀態。
 
6. 如何讓server進程退出運行?
 直接kill便可讓server進程正常退出,可使用killall命令,例如:
 killall fdfs_trackerd
 killall fdfs_storaged
 也可使用FastDFS自帶的stop.sh腳本,如:
 /usr/local/bin/stop.sh  /usr/local/bin/fdfs_storaged /etc/fdfs/storage.conf
 stop.sh只會中止命令行(包括參數)徹底相同的進程。
 千萬不要使用-9參數強殺,不然可能會致使binlog數據丟失的問題。
 
7. 如何重啓server進程?
 能夠kill掉server進程後,執行啓動命令行。如:
 killall fdfs_trackerd
 /usr/local/bin/fdfs_trackerd /etc/fdfs/tracker.conf
 或者直接使用FastDFS自帶的restart.sh腳本,如:
 /usr/local/bin/restart.sh  /usr/local/bin/fdfs_trackerd /etc/fdfs/tracker.conf
 
8. 跨運營商通訊異常問題
 好比電信和網通機房相互通訊,可能會存在異常,有兩種表現:
   1)不能創建鏈接,這個比較直接,確定是網絡鏈接的問題
   2)能夠正常創建鏈接,但接收和發送數據失敗,這個問題比較隱蔽,正常網絡環境下,不該該出現此類問題。
        還有人碰到過從一個方向創建鏈接能夠正常通訊,但從另一個方向就不能正常通訊的狀況。
 解決辦法:
   嘗試將服務端口改小,建議將端口修改成1024如下。好比將storage服務端口由23000修改成873等,也能夠試試修改成8080
   若是問題還不能解決,請聯繫你的網絡(機房)服務商。
 
9. fdfs_test和fdfs_test1是作什麼用的?
    這兩個是FastDFS自帶的測試程序,會對一個文件上傳兩次,分別做爲主文件和從文件。返回的文件ID也是兩個。
    而且會上傳文件附加屬性,storage server上會生成4個文件。
    這兩個程序僅用於測試目的,請不要用做實際用途。
    V2.05提供了比較正式的三個小工具:
       上傳文件:/usr/local/bin/fdfs_upload_file  <config_file> <local_filename>
       下載文件:/usr/local/bin/fdfs_download_file <config_file> <file_id> [local_filename]
        刪除文件:/usr/local/bin/fdfs_delete_file <config_file> <file_id>
 
10. 什麼是主從文件?
 主從文件是指文件ID有關聯的文件,一個主文件能夠對應多個從文件。
     主文件ID = 主文件名 + 主文件擴展名
     從文件ID = 主文件名 + 從文件後綴名 + 從文件擴展名
 使用主從文件的一個典型例子:以圖片爲例,主文件爲原始圖片,從文件爲該圖片的一張或多張縮略圖。
 FastDFS中的主從文件只是在文件ID上有聯繫。FastDFS server端沒有記錄主從文件對應關係,所以刪除主文件,FastDFS不會自動刪除從文件。
 刪除主文件後,從文件的級聯刪除,須要由應用端來實現。
 主文件及其從文件均存放到同一個group中。
 主從文件的生成順序:
   1)先上傳主文件(如原文件),獲得主文件ID
   2)而後上傳從文件(如縮略圖),指定主文件ID和從文件後綴名(固然還能夠同時指定從文件擴展名),獲得從文件ID。
 java

11. 如何刪除無效的storage server?
 可使用fdfs_monitor來刪除。命令行以下:
 /usr/local/bin/fdfs_monitor <config_filename> delete <group_name> <storage_ip>
 例如:
 /usr/local/bin/fdfs_monitor /etc/fdfs/client.conf delete group1 192.168.0.100
 注意:若是被刪除的storage server的狀態是ACTIVE,也就是該storage server還在線上服務的狀況下,是沒法刪除掉的。
 
12. FastDFS擴展模塊升級到V1.06及以上版本的注意事項
 apache和nginx擴展模塊版本v1.06及以上版本,須要在配置文件/etc/fdfs/fastdfs_mod.conf中設置storage server的存儲路徑信息。
 一個示例以下所示:
 store_path_count=1
 store_path0=/home/yuqing/fastdfs
 store_path_count和store_path#均須要正確設置,必須和storage.conf中的相應配置徹底一致,不然將致使文件不能正確下載!
 
13. nginx和apache擴展模塊與FastDFS server版本對應關係
     擴展模塊1.05:  針對FastDFs server v2.x,要求server版本大於等於v2.09
     擴展模塊1.07及以上版本:  針對FastDFs server v3.x
 
14. FastDFS有QQ技術交流羣嗎?
    有的。羣號:164684842,歡迎你們加入交流。
 
15. 上傳文件失敗,返回錯誤碼28,這是怎麼回事?
   返回錯誤碼28,表示磁盤空間不足。注意FastDFS中有預留空間的概念,在tracker.conf中設置,配置項爲:reserved_storage_space,缺省值爲4GB,即預留4GB的空間。
   請酌情設置reserved_storage_space這個參數,好比能夠設置爲磁盤總空間的20%左右。
 
16. fdfs_trackerd或者fdfs_storaged的日誌中出現:malloc task buff failed字樣的錯誤,這是怎麼回事?
   出現此類信息表示已經達到最大鏈接數。server端支持的最大鏈接數能夠經過max_connections這個參數來設置。
   出現這樣的問題,須要排查一下是否客戶端使用不當致使的,好比客戶端沒有及時關閉無用的鏈接。
 
17. FastDFS的文件ID中能夠反解出哪些字段?
 文件ID中除了包含group name和存儲路徑外,文件名中能夠反解出以下幾個字段:
   1)文件建立時間(unix時間戳,32位整數)
   2)文件大小
   3)上傳到的源storage server IP地址(32位整數)
   4)文件crc32校驗碼
   5)隨機數(這個字段用來避免文件重名)
 
18. 爲何生成的token驗證沒法經過?
   出現這樣的問題,請進行以下兩項檢查:
   1)確認調用token生成函數,傳遞的文件ID中沒有包含group name。傳遞的文件ID格式形如:M00/00/1B/wKgnVE84utyOG9hEAAATz5-S0SI99.java
   2)確認服務器時間基本是一致的,注意服務器時間不能相差太多,不要相差到分鐘級別。
 nginx


1九、能跨機房部署fastdfs嗎?
 須要注意什麼問題啊?
跨運營商通訊異常問題
 好比電信和網通機房相互通訊,可能會存在異常,有兩種表現:
   1)不能創建鏈接,這個比較直接,確定是網絡鏈接的問題
   2)能夠正常創建鏈接,但接收和發送數據失敗,這個問題比較隱蔽,正常網絡環境下,不該該出現此類問題。
        還有人碰到過從一個方向創建鏈接能夠正常通訊,但從另一個方向就不能正常通訊的狀況。
 解決辦法:
   嘗試將服務端口改小,建議將端口修改成1024如下。好比將storage服務端口由23000修改成873等,也能夠試試修改成8080
   若是問題還不能解決,請聯繫你的網絡(機房)服務商。
 web

假若有A、B兩機房,一組5個存儲節點(A一、A2部署在A機房,B一、B二、B3部署在B機房),
 那麼對A機房的客戶端來講,有什麼辦法能優先訪問A一、A2節點,不行再訪問B一、B二、B3節點嗎?數據庫

上傳文件時,tracker能夠返回上傳文件的storage server列表。
 下載一個文件時,tracker有返回全部能下載該文件的storage server列表的接口。
 相應地,client API中有對應的函數。
 
tracker提供有效的storage server列表,路由規則由應用方決定。
 即由應用方決定上傳到哪一個storage server,或者從哪臺storage server下載文件。apache


20、我如今已經有不少不少文件了,將近500W的文件數,該怎麼使用FastDFS來管事呢,難道須要再從新使用fdfs_upload_file重傳一遍嗎?重傳事後的文件名怎麼辦?由於這些文件名都是在數據庫裏有的,重傳的話,文件名就變掉了。
答案:可使用my-fastfds-client,這個client library支持應用端指定文件ID。ubuntu


2一、在FastDFS的服務器端配置文件中,bind_addr 這個參數用於須要綁定本機IP地址的場合。只有這個參數和主機特徵相關,其他參數都是能夠統一配置的。在不須要綁定本機的狀況下,爲了便於管理和維護,建 議全部tracker server的配置文件相同,同組內的全部storage server的配置文件相同。api

tracker server的配置文件中沒有出現storage server,而storage server的配置文件中會列舉出全部的tracker server。這就決定了storage server和tracker server之間的鏈接由storage server主動發起,storage server爲每一個tracker server啓動一個線程進行鏈接和通信,這部分的通訊協議請參閱《FastDFS HOWTO -- Protocol》中的「2. storage server to tracker server command」。服務器

tracker server會在內存中 保存storage分組及各個組下的storage server,並將鏈接過本身的storage server及其分組保存到文件中,以便下次重啓服務時能直接從本地磁盤中得到storage相關信息。storage server會在內存中記錄本組的全部服務器,並將服務器信息記錄到文件中。tracker server和storage server之間相互同步storage server列表:
  1. 若是一個組內增長了新的storage server或者storage server的狀態發生了改變,tracker server都會將storage server列表同步給該組內的全部storage server。以新增storage server爲例,由於新加入的storage server主動鏈接tracker server,tracker server發現有新的storage server加入,就會將該組內全部的storage server返回給新加入的storage server,並從新將該組的storage server列表返回給該組內的其餘storage server;
  2. 若是新增長一臺tracker server,storage server鏈接該tracker server,發現該tracker server返回的本組storage server列表比本機記錄的要少,就會將該tracker server上沒有的storage server同步給該tracker server。網絡

同一組內的storage server之間是對等的,文件上傳、刪除等操做能夠在任意一臺storage server上進行。文件同步只在同組內的storage server之間進行,採用push方式,即源服務器同步給目標服務器。以文件上傳爲例,假設一個組內有3臺storage server A、B和C,文件F上傳到服務器B,由B將文件F同步到其他的兩臺服務器A和C。咱們不妨把文件F上傳到服務器B的操做爲源頭操做,在服務器B上的F文件 爲源頭數據;文件F被同步到服務器A和C的操做爲備份操做,在A和C上的F文件爲備份數據。同步規則總結以下:
  1. 只在本組內的storage server之間進行同步;
  2. 源頭數據才須要同步,備份數據不須要再次同步,不然就構成環路了;
  3. 上述第二條規則有個例外,就是新增長一臺storage server時,由已有的一臺storage server將已有的全部數據(包括源頭數據和備份數據)同步給該新增服務器。

storage server有7個狀態,以下:
  # FDFS_STORAGE_STATUS_INIT      :初始化,還沒有獲得同步已有數據的源服務器
  # FDFS_STORAGE_STATUS_WAIT_SYNC :等待同步,已獲得同步已有數據的源服務器
  # FDFS_STORAGE_STATUS_SYNCING   :同步中
  # FDFS_STORAGE_STATUS_DELETED   :已刪除,該服務器從本組中摘除(注:本狀態的功能還沒有實現)
  # FDFS_STORAGE_STATUS_OFFLINE   :離線
  # FDFS_STORAGE_STATUS_ONLINE    :在線,尚不能提供服務
  # FDFS_STORAGE_STATUS_ACTIVE    :在線,能夠提供服務

當storage server的狀態爲FDFS_STORAGE_STATUS_ONLINE時,當該storage server向tracker server發起一次heart beat時,tracker server將其狀態更改成FDFS_STORAGE_STATUS_ACTIVE。

組內新增長一臺storage server A時,由系統自動完成已有數據同步,處理邏輯以下:
  1. storage server A鏈接tracker server,tracker server將storage server A的狀態設置爲FDFS_STORAGE_STATUS_INIT。storage server A詢問追加同步的源服務器和追加同步截至時間點,若是該組內只有storage server A或該組內已成功上傳的文件數爲0,則沒有數據須要同步,storage server A就能夠提供在線服務,此時tracker將其狀態設置爲FDFS_STORAGE_STATUS_ONLINE,不然tracker server將其狀態設置爲FDFS_STORAGE_STATUS_WAIT_SYNC,進入第二步的處理;
  2. 假設tracker server分配向storage server A同步已有數據的源storage server爲B。同組的storage server和tracker server通信得知新增了storage server A,將啓動同步線程,並向tracker server詢問向storage server A追加同步的源服務器和截至時間點。storage server B將把截至時間點以前的全部數據同步給storage server A;而其他的storage server從截至時間點以後進行正常同步,只把源頭數據同步給storage server A。到了截至時間點以後,storage server B對storage server A的同步將由追加同步切換爲正常同步,只同步源頭數據;
  3. storage server B向storage server A同步完全部數據,暫時沒有數據要同步時,storage server B請求tracker server將storage server A的狀態設置爲FDFS_STORAGE_STATUS_ONLINE;
  4 當storage server A向tracker server發起heart beat時,tracker server將其狀態更改成FDFS_STORAGE_STATUS_ACTIVE。
 

 FastDFS注意事項
>>1.除了在storage.conf裏的tracker_server增長tracker的ip和端口,其餘地方要注意什麼?
恩,tracker server ip和端口,確定是要正確設置的。支持多tracker server,每行設置一個tracker。
另外,base_path也要正確設置。
其他參數,一般採用缺省配置便可。你能夠看一下配置說明那個帖子。

>>每臺tracker和storage的啓動有沒有前後關係?
正常狀況下,應該先啓動tracker。
FastDFS不會有這樣的要求,你要啓動storage也是沒有任何問題的。

>>2.想要把fastDFS產生的記錄清空,再從新搭建一次,應該刪除哪些文件?
中止storage server和tracker server,刪除base_path下的data子目錄便可。
注意:storage 的data目錄下保存了上傳文件,刪除時請慎重。

>>>>[2010-12-15 15:51:35] ERROR - file: ../common/pthread_func.c, line: 163, create thread failed, startup threads: 2173, errno: 11, error info: Resource temporarily unavailable
最後這一行已經說明問題了,建立的線程太多,使用的資源已經達到系統上限。
解決方法:繼續使用現有版本,調小max_connections這個參數,好比調整爲1024。
另一個方法,升級到2.x,好比2.05。2.x採用異步IO模型,可使用有限的幾個線程,支持大量的併發鏈接。
好比,線程數能夠配置爲4,支持的最大鏈接數能夠配置爲1024或者更高。
昨天看了代碼發現程序會在啓動服務的時候,會建立設置的鏈接數,用來檢驗服務器是否可以支持使用者設置的最大鏈接。
 
>>>>程序中要訪問,好比上傳文件,可使用FastDFS提供的java API。
客戶端經過HTTP下載文件時,能夠走web server,如apache、nginx等。
 
>>>>請問經過http下載文件時,可否讓下載的文件名稱自動變成原文件名稱?
可使用文件附加屬性來存儲該文件的原文件名。在apache或nginx擴展模塊中,能夠在HTTP Header中輸出原文件名。
 
>>一、簡單看了下Java client的代碼,看到能夠經過client api獲取上傳文件的group name and filename,請問可否直接經過API獲取http訪問地址?
A: 生成http訪問地址,沒有提供現成的方法,但提供了示例代碼,在TestClient1.java和TestClient.java中均有。摘錄一下TestClient.java中的代碼以下:
                          int ts;
                          String token;
                          String file_url;
                          InetSocketAddress inetSockAddr;
                         
                          System.err.println("file_id: " + file_id);
                         
                          inetSockAddr = trackerServer.getInetSocketAddress();
                          file_url = "http://" + inetSockAddr.getAddress().getHostAddress();
                          if (ClientGlobal.g_tracker_http_port != 80)
                          {
                                   file_url += ":" + ClientGlobal.g_tracker_http_port;
                          }
                          file_url += "/" + file_id;
                          if (ClientGlobal.g_anti_steal_token)
                          {
                                  ts = (int)(System.currentTimeMillis() / 1000);
                                  token = ProtoCommon.getToken(file_id, ts, ClientGlobal.g_secret_key);
                                  file_url += "?token=" + token + "&ts=" + ts;
                          }
                          System.err.println("file url: " + file_url);


>>二、還有一個問題,每個group是否存儲了全部的上傳文件;仍是說group A存儲一部分,group B存儲一部分,同一個group中的storage server存儲的文件都相同。
A: 答案爲後者。即:group A存儲一部分,group B存儲一部分,同一個group中的storage server存儲的文件都相同。
 
FastDFS存儲服務器的硬盤能夠作RAID,好比RAID5等等,這樣系統中的mount point只有一個。
也能夠單個硬盤直接mount使用,這樣系統中的mount point就是多個(多個硬盤的狀況下)。
RAID5並不能充分發揮各個磁盤的最大吞吐量,出於磁盤IO效率考慮,建議採用第二種作法,這樣磁盤總體IO吞吐量最理想的狀況下,爲各個硬盤IO吞吐量之和。
採用多個mount point的狀況下,若是有一塊硬盤損壞,能夠有兩種修復方法:
1. 更換掉壞掉的硬盤,在服務中止的狀況下,手工複製已有服務器上該路徑的文件到該mount point,而後啓動FastDFS服務程序fdfs_storaged;
2. 更換一臺一樣配置的新服務器,或者更換掉壞的硬盤後,重作系統,而後啓動FastDFS服務fdfs_storaged便可。
只要${base_path}這個路徑所在硬盤沒有壞,也就是系統數據文件(如${base_path}/data/sync/*)都在的狀況下,文件自動同步是沒有任何問題的。
 
從新啓動: root@ubuntu:/# /usr/local/bin/restart.sh /usr/local/bin/fdfs_trackerd /etc/fdfs/tracker.conf
 
FastDFS系統中的文件ID與用戶存儲進去的邏輯文件是不一樣的,因爲沒有索引服務器,那麼這種文件名映射關係不是要須要由用戶本身來保存?
的確如此,目前的確須要由應用端來保存。
FastDFS系統中的文件ID與用戶存儲進去的邏輯文件是不一樣的,我有一個客戶端,想經過文件名進行操做,不知該怎樣實現?也就是說,文件名到ID的轉換,我本身寫的客戶端該怎麼轉換呢?
像你這樣的應用場合,再加一層好了,實現文件名到文件ID的轉換。好比能夠基於數據庫來作,或者經過分佈式kv系統,如TT、FastDHT等等來作。
 
 
>>這些Track Server的內容是對等的,仍是分組,每一個Track Server負責一部分Storage Server?
對等的。

>>Client是綁定一個Track Server,仍是能夠綁定多個或所有?
在一個集羣中,應該綁定所有。

>>Storage Server也是一樣的問題,是綁定一個Track Server,仍是能夠多個或者所有?
在一個集羣中,應該綁定所有。

>>若是沒有綁定所有Tracker Sever,那麼Tracker Sever之間可能會出現不一致的狀況。我看到文檔說Tracker Sever之間不進行數據同步,這種問題如何解決呢? 應該綁定全部Tracker server啊。 萬一有個別storage server沒有綁定全部tracker server,也不會出現問題。 正確的作法是綁定全部tracker server。  

相關文章
相關標籤/搜索