Fastdfs分佈式文件存儲系統架構剖析及分佈式集羣環境的配置

===============分佈式文件存儲系統Fastdfs架構解析========================node

FastDFS是一款類Google FS的開源分佈式文件系統,它用純C語言實現,支持Linux、FreeBSD、AIX等UNIX系統。它只能經過專有API對文件進行存取訪問,不支持POSIX接口方式,不能mount使用。準確地講,Google FS以及FastDFS、mogileFS、HDFS、TFS等類Google FS都不是系統級的分佈式文件系統,而是應用級的分佈式文件存儲服務。nginx

  FastDFS的設計理念git

  FastDFS是爲互聯網應用量身定作的分佈式文件系統,充分考慮了冗餘備份、負載均衡、線性擴容等機制,並注重高可用、高性能等指標。和現有的類Google FS分佈式文件系統相比,FastDFS的架構和設計理念有其獨到之處,主要體如今輕量級、分組方式和對等結構三個方面。github

  • 輕量級

  FastDFS只有兩個角色:Tracker server和Storage server。Tracker server做爲中心結點,其主要做用是負載均衡和調度。Tracker server在內存中記錄分組和Storage server的狀態等信息,不記錄文件索引信息,佔用的內存量不多。另外,客戶端(應用)和Storage server訪問Tracker server時,Tracker server掃描內存中的分組和Storage server信息,而後給出應答。由此能夠看出Tracker server很是輕量化,不會成爲系統瓶頸。web

  FastDFS中的Storage server在其餘文件系統中一般稱做Trunk server或Data server。Storage server直接利用OS的文件系統存儲文件。FastDFS不會對文件進行分塊存儲,客戶端上傳的文件和Storage server上的文件一一對應。數據庫

  衆所周知,大多數網站都須要存儲用戶上傳的文件,如圖片、視頻、電子文檔等。出於下降帶寬和存儲成本的考慮,網站一般都會限制用戶上傳的文件大小,例如圖片文件不能超過5MB、視頻文件不能超過100MB等。我認爲,對於互聯網應用,文件分塊存儲沒有多大的必要。它既沒有帶來多大的好處,又增長了系統的複雜性。FastDFS不對文件進行分塊存儲,與支持文件分塊存儲的DFS相比,更加簡潔高效,而且徹底能知足絕大多數互聯網應用的實際須要。apache

  在FastDFS中,客戶端上傳文件時,文件ID不是由客戶端指定,而是由Storage server生成後返回給客戶端的。文件ID中包含了組名、文件相對路徑和文件名,Storage server能夠根據文件ID直接定位到文件。所以FastDFS集羣中根本不須要存儲文件索引信息,這是FastDFS比較輕量級的一個例證。而其餘文件系統則須要存儲文件索引信息,這樣的角色一般稱做NameServer。其中mogileFS採用MySQL數據庫來存儲文件索引以及系統相關的信息,其侷限性顯而易見,MySQL將成爲整個系統的瓶頸。vim

  FastDFS輕量級的另一個體現是代碼量較小。最新的V2.0包括了C客戶端API、FastDHT客戶端API和PHP extension等,代碼行數不到5.2萬行。瀏覽器

  • 分組方式

  類Google FS都支持文件冗餘備份,例如Google FS、TFS的備份數是3。一個文件存儲到哪幾個存儲結點,一般採用動態分配的方式。採用這種方式,一個文件存儲到的結點是不肯定的。舉例說明,文件備份數是3,集羣中有A、B、C、D四個存儲結點。文件1可能存儲在A、B、C三個結點,文件2可能存儲在B、C、D三個結點,文件3可能存儲在A、B、D三個結點。緩存

  FastDFS採用了分組存儲方式。集羣由一個或多個組構成,集羣存儲總容量爲集羣中全部組的存儲容量之和。一個組由一臺或多臺存儲服務器組成,同組內的多臺Storage server之間是互備關係,同組存儲服務器上的文件是徹底一致的。文件上傳、下載、刪除等操做能夠在組內任意一臺Storage server上進行。相似木桶短板效應,一個組的存儲容量爲該組內存儲服務器容量最小的那個,因而可知組內存儲服務器的軟硬件配置最好是一致的。

  採用分組存儲方式的好處是靈活、可控性較強。好比上傳文件時,能夠由客戶端直接指定上傳到的組。一個分組的存儲服務器訪問壓力較大時,能夠在該組增長存儲服務器來擴充服務能力(縱向擴容)。當系統容量不足時,能夠增長組來擴充存儲容量(橫向擴容)。採用這樣的分組存儲方式,可使用FastDFS對文件進行管理,使用主流的Web server如Apache、nginx等進行文件下載。

  • 對等結構

  FastDFS集羣中的Tracker server也能夠有多臺,Tracker server和Storage server均不存在單點問題。Tracker server之間是對等關係,組內的Storage server之間也是對等關係。傳統的Master-Slave結構中的Master是單點,寫操做僅針對Master。若是Master失效,須要將Slave提高爲Master,實現邏輯會比較複雜。和Master-Slave結構相比,對等結構中全部結點的地位是相同的,每一個結點都是Master,不存在單點問題。

  FastDFS的架構

  圖1展現的是FastDFS的系統架構。

圖1 FastDFS的系統架構

  從圖1能夠看出,Tracker server之間相互獨立,不存在直接聯繫。

  客戶端和Storage server主動鏈接Tracker server。Storage server主動向Tracker server報告其狀態信息,包括磁盤剩餘空間、文件同步情況、文件上傳下載次數等統計信息。Storage server會鏈接集羣中全部的Tracker server,向他們報告本身的狀態。Storage server啓動一個單獨的線程來完成對一臺Tracker server的鏈接和定時報告。須要說明的是,一個組包含的Storage server不是經過配置文件設定的,而是經過Tracker server獲取到的。

  不一樣組的Storage server之間不會相互通訊,同組內的Storage server之間會相互鏈接進行文件同步。

  Storage server採用binlog文件記錄文件上傳、刪除等更新操做。binlog中只記錄文件名,不記錄文件內容。

  文件同步只在同組內的Storage server之間進行,採用push方式,即源頭服務器同步給目標服務器。只有源頭數據才須要同步,備份數據並不須要再次同步,不然就構成環路了。有個例外,就是新增長一臺Storage server時,由已有的一臺Storage server將已有的全部數據(包括源頭數據和備份數據)同步給該新增服務器。

  Storage server中由專門的線程根據binlog進行文件同步。爲了最大程度地避免相互影響以及出於系統簡潔性考慮,Storage server對組內除本身之外的每臺服務器都會啓動一個線程來進行文件同步。

  文件同步採用增量同步方式,系統記錄已同步的位置(binlog文件偏移量)到標識文件中。標識文件名格式:{dest storage IP}_{port}.mark,例如:192.168.1.14_23000.mark。

  文件上傳和下載的交互過程

  接下來咱們一塊兒看一下文件上傳和下載的交互過程。文件上傳和下載流程分別如圖二、圖3所示。文件上傳流程的步驟以下:

圖2 文件上傳流程

圖3 文件下載流程

  1. Client詢問Tracker server上傳到的Storage server;

  2. Tracker server返回一臺可用的Storage server,返回的數據爲該Storage server的IP地址和端口;

  3. Client直接和該Storage server創建鏈接,進行文件上傳,Storage server返回新生成的文件ID,文件上傳結束。

  文件下載流程的步驟以下:

  1. Client詢問Tracker server能夠下載指定文件的Storage server,參數爲文件ID(包含組名和文件名);

  2. Tracker server返回一臺可用的Storage server;

  3. Client直接和該Storage server創建鏈接,完成文件下載。

  文件同步延遲問題的提出

  客戶端將一個文件上傳到一臺Storage server後,文件上傳工做就結束了。由該Storage server根據binlog中的上傳記錄將這個文件同步到同組的其餘Storage server。這樣的文件同步方式是異步方式,異步方式帶來了文件同步延遲的問題。新上傳文件後,在還沒有被同步過去的Storage server上訪問該文件,會出現找不到文件的現象。FastDFS是如何解決文件同步延遲這個問題的呢?

  文件的訪問分爲兩種狀況:文件更新和文件下載。文件更新包括設置文件附加屬性和刪除文件。文件的附加屬性包括文件大小、圖片寬度、圖片高度等。FastDFS中,文件更新操做都會優先選擇源Storage server,也就是該文件被上傳到的那臺Storage server。這樣的作法不只避免了文件同步延遲的問題,並且有效地避免了在多臺Storage server上更新同一文件可能引發的時序錯亂的問題。

  那麼文件下載是如何解決文件同步延遲這個問題的呢?

  要回答這個問題,須要先了解文件名中包含了什麼樣的信息。Storage server生成的文件名中,包含了源Storage server的IP地址和文件建立時間等字段。文件建立時間爲UNIX時間戳,後面稱爲文件時間戳。從文件名或文件ID中,能夠反解出這兩個字段。

  而後咱們再來看一下,Tracker server是如何準確地知道一個文件已被同步到一臺Storage server上的。前面已經講過,文件同步採用主動推送的方式。另外,每臺storage server都會定時向tracker server報告它向同組的其餘storage server同步到的文件時間戳。當tracker server收到一臺storage server的文件同步報告後,它會依次找出該組內各個storage server(後稱做爲S)被同步到的文件時間戳最小值,做爲S的一個屬性記錄到內存中。

  FastDFS對文件同步延遲問題的解決方案

  下面咱們來看一下FastDFS採起的解決方法。

  一個最簡單的解決辦法,和文件更新同樣,優先選擇源Storage server下載文件便可。這能夠在Tracker server的配置文件中設置,對應的參數名爲download_server。

  另一種選擇Storage server的方法是輪流選擇(round-robin)。當Client詢問Tracker server有哪些Storage server能夠下載指定文件時,Tracker server返回知足以下四個條件之一的Storage server:

  • 該文件上傳到的源Storage server,文件直接上傳到該服務器上的;
  • 文件建立時間戳 < Storage server被同步到的文件時間戳,這意味着當前文件已經被同步過來了;
  • 文件建立時間戳=Storage server被同步到的文件時間戳,且(當前時間—文件建立時間戳) > 一個文件同步完成須要的最大時間(如5分鐘);
  • (當前時間—文件建立時間戳) > 文件同步延遲閾值,好比咱們把閾值設置爲1天,表示文件同步在一天內確定能夠完成。

 

======================================================================

  • FastDFS安裝
        FastDFS是一個國產開源的輕量級分佈式文件系統,它對文件進行管理,功能包括:文件存儲、文件同步、文件訪問(文件上傳、文件下載)等,解決了大容量存儲和負載均衡的問題.特別適合以文件爲載體的在線服務,如相冊網站、視頻網站等等.FastDFS服務端有兩個角色:跟蹤器(tracker)和存儲節點(storage).跟蹤器主要作調度工做,在訪問上起負載均衡的做用.
     
  • 下載地址
    http://sourceforge.net/projects/fastdfs/files/
    http://code.google.com/p/fastdfs/
     

     


    實現多服務器fastdfs 
     

     

  • 總體網絡配置
    Tracker  Server    192.168.55.222         /home/tracker  端口:22122
    Tracker  Server    192.168.55.226         /home/tracker  端口:22122
    Storage1 Server    192.168.55.223  group1 /home/storage  端口:23000
    Storage4 Server    192.168.55.227  group1 /home/storage  端口:23000
    Storage2 Server    192.168.55.224  group2 /home/storage  端口:23000
    Storage3 Server    192.168.55.225  group2 /home/storage  端口:23000
    #Storage2爲group2的源服務器
    注意:
    1.group2同組的Storage2和Storage3 FastDFS服務端口必須一致: port=23000。
    2.一臺服務器能夠裝多個組(group)但不能裝同組的多個Storage,日誌會報錯誤,日誌報錯緣由是"注意1"
    3.Version 4.05以前fastdfs內部綁定了libevent做爲http服務器.Version 4.05以後的版本刪除了內置的web http服務,內置的web http服務是個累贅,不用也罷!
    4.啓動storage server時,一直處於僵死狀態.啓動storage server,storage將鏈接tracker server,若是連不上,將一直重試。直到鏈接成功,啓動纔算真正完成!若是集羣中有2臺tracker server,而其中一臺tracker沒有啓動,可能會致使storage server一直處於僵死狀態
  • 系統操做環境的設置
    #軟件安裝包存儲:
      /usr/local/src
      /usr/local/fastdfs  fastdfs安裝目錄
    
    #基本目錄列表:
    #建立fastdfs用戶
      /usr/sbin/groupadd fastdfs
      /usr/sbin/useradd -g fastdfs fastdfs
    #建立存儲數據目錄
      mkdir -p /home/fastdfs/tracker;#建立tracker目錄保存運行日誌
      mkdir -p /home/fastdfs/storage;#建立Storage目錄保存運行日誌及其data數據 
    # source .bashrc
  • 爲方便查找目錄,設置變量
    ################Tracker################
    # vi .bashrc
      alias  worksrc='cd /usr/local/src;ls'
      alias  workfastdfs='cd /usr/local/fastdfs;ls'
      alias  worktracker='cd /home/fastdfs/tracker;ls'
    #track啓動 重啓 中止
      alias  sertracker='service fdfs_trackerd'
    配置生效
    # source .bashrc
  • 爲方便查找目錄,設置變量
    ################Storage################
    # vi .bashrc
      alias  worksrc='cd /usr/local/src;ls'
      alias  workfastdfs='cd /usr/local/fastdfs;ls'
      alias  workstorage='cd /home/fastdfs/storage;ls'
      alias  workfastdfs='cd /usr/local/nginx;ls'
    #storage啓動 重啓 中止
      alias  serstorage='service fdfs_storaged'
    #nginx 啓動 重啓 中止
      alias  sernginx='service nginxd'
    配置生效
    # source .bashrc

1.安裝libevent 和 fastdfs

  • 首先安裝libevent. fastdfs在編譯源程序時fastdfs內部調用libevent的處理機制,,須要用到libevent一些依賴文件,不然編譯fastdfs會出錯
    #卸載系統自帶libevent,自帶版本太低,安裝fastdfs會出錯
      rpm -qa|grep libevent
    #  或者
      yum remove libevent*
    #下載安裝libevent
    #worksrc;
      wget http://cloud.github.com/downloads/libevent/libevent/libevent-2.0.19-stable.tar.gz;
      tar -zxvf libevent-2.0.19-stable.tar.gz;
      cd libevent-2.0.19-stable;
    #make clean;
      ./configure --prefix=/usr/local/libevent
      make && make install;
    #爲libevent建立軟連接到/lib庫下,64位系統對應/lib64
      ln -s /usr/local/libevent/lib/libevent-2.0.so.5 /usr/lib/libevent-2.0.so.5
      ln -s /usr/local/libevent/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5
    #命令彙總:
      worksrc;wget http://cloud.github.com/downloads/libevent/libevent/libevent-2.0.19-stable.tar.gz;tar -zxvf libevent-2.0.19-stable.tar.gz;cd libevent-2.0.19-stable;make clean;./configure --prefix=/usr/local/libevent;make && make install;cd ../
  • 安裝fastdfs的步驟
     
    worksrc;
    # 自行下載 4.07  http://sourceforge.net/projects/fastdfs/files/ 
    # wget http://fastdfs.googlecode.com/files/FastDFS_v4.06.tar.gz
      tar -zxvf FastDFS_v4.07.tar.gz
      cd FastDFS
    
    #因爲定義/usr/local/fastdfs爲fastdfs安裝目錄,因此須要修改make.sh
      vim make.sh
    #/etc/fdfs 所有替換爲 /usr/local/fastdfs/conf
      %s/\/etc\/fdfs/\/usr\/local\/fastdfs\/conf/g
    
    # TARGET_PREFIX=/usr/local 修改成 /usr/local/fastdfs
      sed -i 's:TARGET_PREFIX=.*:TARGET_PREFIX=/usr/local/fastdfs:g' make.sh
    
    # TARGET_CONF_PATH=/etc/fdfs 修改成 /usr/local/fastdfs/conf
      sed -i 's:TARGET_CONF_PATH=.*:TARGET_CONF_PATH=/usr/local/fastdfs/conf:g' make.sh
    
    #安裝
      ./make.sh C_INCLUDE_PATH=/usr/local/libevent/include LIBRARY_PATH=/usr/local/libevent/lib
      ./make.sh install
    修改 fastdfs 啓動文件
    # 修改 fdfs_trackerd 配置文件
      vim /etc/init.d/fdfs_trackerd
    #替換
      %s/usr\/local/usr\/local\/fastdfs/g
      %s/etc\/fdfs/usr\/local\/fastdfs\/conf/g
    #增長x權限
      chmod a+x /etc/init.d/fdfs_trackerd
    
    # 修改 fdfs_storaged 配置文件
      vim /etc/init.d/fdfs_storaged
    #替換
      %s/usr\/local/usr\/local\/fastdfs/g
      %s/etc\/fdfs/usr\/local\/fastdfs\/conf/g
    #增長x權限
      chmod a+x /etc/init.d/fdfs_storaged


2.安裝Tracker Server - 192.168.55.222

  • 引用上例中安裝libevent 和 fastdfs步驟
  • 配置及啓動Tracker Server,端口:22122
     
    #修改tracker.conf配置
      vim /usr/local/fastdfs/conf/tracker.conf
    # the tracker server port
      port=22122
    # the base path to store data and log files
      base_path=/home/yuqing/fastdfs -> base_path=/home/fastdfs/tracker #日誌目錄
    # sed -i 's:base_path=.*:base_path=/home/fastdfs/tracker:g' tracker.conf
      reserved_storage_space = 4GB -> reserved_storage_space = 1GB
    # sed -i 's:reserved_storage_space=.*:reserved_storage_space = 1GB:g' tracker.conf
    #unix group name to run this program,
    #not set (empty) means run by the group of current user
      run_by_group= -> fastdfs
    #unix username to run this program,
    #not set (empty) means run by current user
      run_by_user= -> fastdfs
    #開啓自定義server ID取代ip形式,方便內部網絡服務器更換ip#**此方式要重點理解,4.0之後新特性
      use_storage_id = true #使用server ID做爲storage server標識
      storage_ids_filename = storage_ids.conf #<id> <group_name> <ip_or_hostname>
      id_type_in_filename = id #文件名反解析中包含server ID,之前是ip
    複製storage_ids.conf文件
    cp -r /usr/local/src/FastDFS/conf/storage_ids.conf /usr/local/fastdfs/conf/
    #編輯storage服務器ID與IP地址的對應關係
      vim /usr/local/fastdfs/conf/storage_ids.conf
    #<id> <group_name> <ip_or_hostname>
    # 100001          group1           192.168.55.223
  • 設置 Tracker Server 用戶及組
     
    chown -R fastdfs:fastdfs /home/fastdfs
    增長x權限
    chmod a+x /etc/init.d/fdfs_trackerd
    啓動 Tracker
     
    service fdfs_trackerd start
    #啓動過程當中出現的錯誤
      ./fdfs_trackerd: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory
    #解決辦法
      ln -s /usr/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5
    #查看日誌
      vim /home/fastdfs/tracker/logs/trackerd.log
    #啓動後成功的日誌
    #[2013-10-03 20:50:08] INFO - FastDFS v4.07, base_path=/home/fastdfs/tracker, run_by_group=fastdfs, run_by_user=fastdfs, connect_timeout=30s, network_timeout=60s, port=22122, bind_addr=, max_connections=256, accept_threads=1, work_threads=4, store#_lookup=2, store_group=, store_server=0, store_path=0, reserved_storage_space=10.00%, download_server=0, allow_ip_count=-1, sync_log_buff_interval=10s, check_active_interval=120s, thread_stack_size=64 KB, storage_ip_changed_auto_adjust=1, storage_sy#nc_file_max_delay=86400s, storage_sync_file_max_time=300s, use_trunk_file=0, slot_min_size=256, slot_max_size=16 MB, trunk_file_size=64 MB, trunk_create_file_advance=0, trunk_create_file_time_base=02:00, trunk_create_file_interval=86400, trunk_create_file_sp#ace_threshold=20 GB, trunk_init_check_occupying=0, trunk_init_reload_from_binlog=0, use_storage_id=1, id_type_in_filename=id, storage_id_count=1, rotate_error_log=0, error_log_rotate_time=00:00, rotate_error_log_size=0, store_slave_file_use_link=0, use_con#nection_pool=0, g_connection_pool_max_idle_time=3600s
    設置開機啓動 Tracker
    vim /etc/rc.d/rc.local
      service fdfs_trackerd start
    附目錄說明
    #  tracker server目錄及文件結構:
    #  ${base_path}
    #    |__data
    #    |     |__storage_groups.dat:存儲分組信息
    #    |     |__storage_servers.dat:存儲服務器列表
    #    |__logs
    #          |__trackerd.log:tracker server日誌文件


3.安裝Storage Server -192.168.55.223

  • 引用上例中安裝libevent 和 fastdfs步驟
  • 修改storage.conf配置
     
    vim /usr/local/fastdfs/conf/storage.conf
    # the name of the group this storage server belongs to
      group_name=group1
    # the name of the group this storage server belongs to
    # the storage server port #the storage server port
      port=23000
    # the base path to store data and log files #日誌目錄
      base_path=/home/yuqing/fastdfs -> /home/fastdfs/storage
    # store_path#, based 0, if store_path0 not exists, it's value is base_path #data數據存儲目錄
    # the paths must be exist
      store_path0=/home/fastdfs/storage
    # tracker_server can ocur more than once, and tracker_server format is
    #  "host:port", host can be hostname or ip address
      tracker_server=192.168.209.121:22122 ->192.168.55.222:22122
    #unix group name to run this program,
    #not set (empty) means run by the group of current user
      run_by_group= -> fastdfs   #這兒必定填寫執行的用戶名,否則會啓動報錯,測試環境填寫的 root
    #unix username to run this program,
    #not set (empty) means run by current user
      run_by_user= -> fastdfs   #這兒必定填寫執行的用戶名,否則會啓動報錯,測試環境填寫的 root
    設置 Storage Server 用戶及組
     
    chown -R fastdfs:fastdfs /home/fastdfs
    增長x權限
    chmod a+x /etc/init.d/fdfs_storaged
    啓動 Storage
    service fdfs_storaged start
    #接下來會出現不少mkdir data path,這是系統在建立數據目錄
    #data path: /home/fastdfs/storage/data, mkdir sub dir...
    #mkdir data path: 00 ...
    #mkdir data path: 01 ...
    #mkdir data path: 02 ...
    #mkdir data path: 03 ...
    #.......................
    #data path: /home/fastdfs/storage/data, mkdir sub dir done.
    設置開機啓動 Storage 
    vim /etc/rc.d/rc.local
      service fdfs_storaged start
    附目錄說明
    #  storage server目錄及文件結構:
    #  ${base_path}
    #    |__data
    #    |     |__storage_stat.dat:本地存儲信息
    #    |     |__sync
    #    |           |__ binlog.000
    #    |           |__ binlog.index
    #    |__logs
    #          |__storaged.log:storage server日誌文件
  • 安裝fastdfs-nginx-module模塊
     
    #建立相關用戶和目錄建立www用戶和組
      /usr/sbin/groupadd www
      /usr/sbin/useradd -g www www
    #建立nginx日誌目錄
      mkdir -p /home/www/logs
      chmod a+w /home/www/logs
      chown -R www:www /home/www/logs
    安裝nginx
     
    cd /usr/local/src
    #下載 nginx
    #wget http://nginx.org/download/nginx-1.5.4.tar.gz
      tar -zxvf nginx-1.5.4.tar.gz
      cd nginx-1.5.4/
      ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module
      make && make install
    #--with-http_stub_status_module 用來監控nginx的當前狀態
    安裝fastdfs-nginx-module插件
     
    #worksrc;
      cd /usr/local/src
    # wget http://fastdfs.googlecode.com/files/fastdfs-nginx-module_v1.15.tar.gz
      tar -zxvf fastdfs-nginx-module_v1.15.tar.gz
    #修改插件配置文件
      vim /usr/local/src/fastdfs-nginx-module/src/config
    ngx_addon_name=ngx_http_fastdfs_module
    HTTP_MODULES="$HTTP_MODULES ngx_http_fastdfs_module"
    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_fastdfs_module.c"
    CORE_INCS="$CORE_INCS /usr/local/fastdfs/include/fastdfs /usr/local/fastdfs/include/fastcommon/"
    CORE_LIBS="$CORE_LIBS -L/usr/local/fastdfs/lib -lfastcommon -lfdfsclient"
    CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64 -DFDFS_OUTPUT_CHUNK_SIZE='256*1024' -DFDFS_MOD_CONF_FILENAME='\"/usr/local/fastdfs/conf/mod_fastdfs.conf\"'"
    #複製mod_fastdfs.conf到/usr/local/fastdfs/conf/目錄下
      cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /usr/local/fastdfs/conf/
    上面編譯時使用的動態連接庫
     
    #啓動nginx報錯
    #./nginx: error while loading shared libraries: libfastcommon.so: cannot open shared object file: No such file or directory
    #解決辦法 ---> 將/usr/local/fastdfs/lib 加入系統文件/etc/ld.so.conf中
      vim /etc/ld.so.conf
      /usr/local/fastdfs/lib
    #更新庫文件緩存ld.so.cache
      /sbin/ldconfig -v
    編譯fastdfs-nginx-module模塊
     
    # 從新編譯nginx  
      cd /usr/local/src/nginx-1.5.4
      ./configure --add-module=/usr/local/src/fastdfs-nginx-module/src
      make; make install
    修改mod_fastdfs.conf配置
     
    vim /usr/local/fastdfs/conf/mod_fastdfs.conf
    # the base path to store log files
      base_path=/tmp
    # if load FastDFS parameters from tracker server
    # since V1.12
    # default value is false
      load_fdfs_parameters_from_tracker=true
    # FastDFS tracker_server can ocur more than once, and tracker_server format is
    #  "host:port", host can be hostname or ip address
    # valid only when load_fdfs_parameters_from_tracker is true
      tracker_server=192.168.55.222:22122
    # the port of the local storage server
    # the default value is 23000
      storage_server_port=23000
    # the group name of the local storage server
      group_name=group1
    # if the url / uri including the group name
    # set to false when uri like /M00/00/00/xxx
    # set to true when uri like ${group_name}/M00/00/00/xxx, such as group1/M00/xxx
    # default value is false
      url_have_group_name = true
    # path(disk or mount point) count, default value is 1
    # must same as storage.conf
      store_path_count=1
    # store_path#, based 0, if store_path0 not exists, it's value is base_path
    # the paths must be exist
    # must same as storage.conf
      store_path0=/home/fastdfs/storage
    # set the log filename, such as /usr/local/apache2/logs/mod_fastdfs.log
    # empty for output to stderr (apache and nginx error_log file)
      log_filename=/home/www/logs/mod_fastdfs.log
    nginx配置簡潔版本
    #vim /usr/local/nginx/conf/nginx.conf
    user  www www;
    worker_processes  2;
    error_log  /home/www/logs/error.log  notice;
    pid        /home/www/logs/nginx.pid;
    
    worker_rlimit_nofile 5120;
    events {
        use epoll;
        worker_connections  5120;
    }
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        sendfile        on;
        tcp_nopush     on;
        keepalive_timeout  60;
        tcp_nodelay on;
    
        server {
            listen       80;
            server_name  localhost;
            location /group1/M00 {
                alias /home/fastdfs/storage/data;
                ngx_fastdfs_module;
            }
        }
    }
    
    #啓動nginx
      /usr/local/nginx/sbin/nginx


4.安裝Storage Server -192.168.55.224

  • 引用上例中安裝libevent 和 fastdfs步驟
  • 修改storage.conf配置 
    vim /usr/local/fastdfs/conf/storage.conf
    # the name of the group this storage server belongs to
      group_name=group2
    # the name of the group this storage server belongs to
    # the storage server port #the storage server port
      port=23000
    # the base path to store data and log files #日誌目錄
      base_path=/home/yuqing/fastdfs -> /home/fastdfs/storage
    # store_path#, based 0, if store_path0 not exists, it's value is base_path #data數據存儲目錄
    # the paths must be exist
      store_path0=/home/fastdfs/storage
    #unix group name to run this program,
    #not set (empty) means run by the group of current user
      run_by_group= -> fastdfs    #這兒必定填寫執行的用戶名,否則會啓動報錯,測試環境填寫的 root
    #unix username to run this program,
    #not set (empty) means run by current user
      run_by_user= -> fastdfs   #這兒必定填寫執行的用戶名,否則會啓動報錯,測試環境填寫的 root
    # tracker_server can ocur more than once, and tracker_server format is
    #  "host:port", host can be hostname or ip address
      tracker_server=192.168.xxx.xxxx:22122 -> tracker_server=192.168.55.222:22122
  • 引用上例中 "編輯啓動腳本" 步驟
    #啓動 Storage  
      service fdfs_storaged restart
    #接下來會出現不少mkdir data path,這是系統在建立數據目錄
    #data path: /home/fastdfs/storage/data, mkdir sub dir...
    #mkdir data path: 00 ...
    #mkdir data path: 01 ...
    #mkdir data path: 02 ...
    #mkdir data path: 03 ...
    #.......................
    #data path: /home/fastdfs/storage/data, mkdir sub dir done.
  • 安裝fastdfs-nginx-module插件
     
    #worksrc;
      cd /usr/local/src
    # wget http://fastdfs.googlecode.com/files/fastdfs-nginx-module_v1.15.tar.gz
      tar -zxvf fastdfs-nginx-module_v1.15.tar.gz
    #修改插件配置文件
      vim /usr/local/src/fastdfs-nginx-module/src/config
    ngx_addon_name=ngx_http_fastdfs_module
    HTTP_MODULES="$HTTP_MODULES ngx_http_fastdfs_module"
    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_fastdfs_module.c"
    CORE_INCS="$CORE_INCS /usr/local/fastdfs/include/fastdfs /usr/local/fastdfs/include/fastcommon/"
    CORE_LIBS="$CORE_LIBS -L/usr/local/fastdfs/lib -lfastcommon -lfdfsclient"
    CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64 -DFDFS_OUTPUT_CHUNK_SIZE='256*1024' -DFDFS_MOD_CONF_FILENAME='\"/usr/local/fastdfs/conf/mod_fastdfs.conf\"'"
    #複製mod_fastdfs.conf到/usr/local/fastdfs/conf/目錄下
      cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /usr/local/fastdfs/conf/
    上面編譯時使用的動態連接庫
     
    #將/usr/local/fastdfs/lib 加入系統文件/etc/ld.so.conf中
      vim /etc/ld.so.conf
      /usr/local/fastdfs/lib
    #更新庫文件緩存ld.so.cache
      /sbin/ldconfig
    編譯fastdfs-nginx-module模塊
     
    # 從新編譯nginx  
      cd /usr/local/src/nginx-1.5.4
      ./configure --add-module=/usr/local/src/fastdfs-nginx-module/src
      make; make install
    修改mod_fastdfs.conf配置
     
    vim /usr/local/fastdfs/conf/mod_fastdfs.conf
    # the base path to store log files
      base_path=/tmp
    # if load FastDFS parameters from tracker server
    # since V1.12
    # default value is false
      load_fdfs_parameters_from_tracker=true
    # FastDFS tracker_server can ocur more than once, and tracker_server format is
    #  "host:port", host can be hostname or ip address
    # valid only when load_fdfs_parameters_from_tracker is true
      tracker_server=192.168.25.11:22122
    # the port of the local storage server
    # the default value is 23000
      storage_server_port=23000
    # the group name of the local storage server
      group_name=group2
    # if the url / uri including the group name
    # set to false when uri like /M00/00/00/xxx
    # set to true when uri like ${group_name}/M00/00/00/xxx, such as group1/M00/xxx
    # default value is false
      url_have_group_name = true
    # path(disk or mount point) count, default value is 1
    # must same as storage.conf
      store_path_count=1
    # store_path#, based 0, if store_path0 not exists, it's value is base_path
    # the paths must be exist
    # must same as storage.conf
      store_path0=/home/fastdfs/storage
    # set the log filename, such as /usr/local/apache2/logs/mod_fastdfs.log
    # empty for output to stderr (apache and nginx error_log file)
      log_filename=/home/www/logs/mod_fastdfs.log
    nginx配置簡潔版本
    #vim /usr/local/nginx/conf/nginx.conf
    user  www www;
    worker_processes  2;
    error_log  /home/www/logs/error.log  notice;
    pid        /home/www/logs/nginx.pid;
    
    worker_rlimit_nofile 5120;
    events {
        use epoll;
        worker_connections  5120;
    }
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        sendfile        on;
        tcp_nopush     on;
        keepalive_timeout  60;
        tcp_nodelay on;
    
        server {
            listen       80;
            server_name  localhost;
            location /group2/M00 {
                alias /home/fastdfs/storage/data;
                ngx_fastdfs_module;
            }
        }
    }
    
    #啓動nginx
      /usr/local/nginx/sbin/nginx

5.安裝Storage Server - 192.168.55.225

  • 參考 192.168.55.224 安裝,不一樣點就是192.168.55.224是group2的源服務,storage.conf配置不一樣,須要注意。

6.測試及使用fastdfs-192.168.55.222

  • fastdfs之配置client
     
    #修改 client.conf
      vim /usr/local/fastdfs/conf/client.conf
      base_path=/home/yuqing/fastdfs-> base_path=/home/fastdfs/tracker
      tracker_server=192.168.209.121:22122 -> tracker_server=192.168.55.222:22122
    #或
      sed -i 's:base_path=.*:base_path=/home/fastdfs/tracker:g' /usr/local/fastdfs/conf/client.conf
      sed -i 's:tracker_server=.*:tracker_server=192.168.55.222\:22122:g' /usr/local/fastdfs/conf/client.conf
    #upload
      cd /usr/local/fastdfs/bin
      ./fdfs_upload_file /usr/local/fastdfs/conf/client.conf /tmp/t1.jpg 
    #-——————————————————————————————————————
    #group1/M00/00/00/oYYBAFJNRnGASWekAAAXkpktHxI423.jpg
    查看文件信息
     
    ./fdfs_file_info /usr/local/fastdfs/conf/client.conf group1/M00/00/00/oYYBAFJNQiiAYIXzAAAXkpktHxI095.jpg
    #————————————————————————————————————————
    source storage id: 100001
    source ip address: 192.168.55.223
    file create timestamp: 2013-10-03 18:26:57
    file size: 6034
    file crc32: 2569871122 (0x992D1F12)
    測試上傳
     
    ./fdfs_test /usr/local/fastdfs/conf/client.conf upload /tmp/t1.jpg 
    #————————————————————————————————————————
    This is FastDFS client test program v4.07
    
    Copyright (C) 2008, Happy Fish / YuQing
    
    FastDFS may be copied only under the terms of the GNU General
    Public License V3, which may be found in the FastDFS source kit.
    Please visit the FastDFS Home Page http://www.csource.org/ 
    for more detail.
    
    [2013-10-04 02:20:19] DEBUG - base_path=/home/fastdfs/tracker, connect_timeout=30, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0
    
    tracker_query_storage_store_list_without_group: 
            server 1. group_name=, ip_addr=192.168.55.223, port=23000
    
    group_name=group1, ip_addr=192.168.55.223, port=23000
    storage_upload_by_filename
    group_name=group1, remote_filename=M00/00/00/oYYBAFJNRWeAHhGuAAAXkpktHxI578.jpg
    source ip address: 192.168.55.223
    file timestamp=2013-10-03 18:22:31
    file size=6034
    file crc32=2569871122
    example file url: http://192.168.55.223/group1/M00/00/00/oYYBAFJNRWeAHhGuAAAXkpktHxI578.jpg
    storage_upload_slave_by_filename
    group_name=group1, remote_filename=M00/00/00/oYYBAFJNRWeAHhGuAAAXkpktHxI578_big.jpg
    source ip address: 192.168.55.223
    file timestamp=2013-10-03 18:22:31
    file size=6034
    file crc32=2569871122
    example file url: http://192.168.55.223/group1/M00/00/00/oYYBAFJNRWeAHhGuAAAXkpktHxI578_big.jpg

    在瀏覽器中-->http://192.168.55.222/group1/M00/00/00/oYYBAFJNQiiAYIXzAAAXkpktHxI095.jpg
    輸入上圖中的url地址, tracker server 會自動重定向到存儲文件的 storage server,文件下載成功。至此,已經成功搭建了fastdfs。弄了兩天,終於好了 - 0-:

     
  • 常規命令範例:
    #監控storage
    /usr/local/fastdfs/bin/fdfs_monitor /usr/local/fastdfs/conf/storage.conf
    #若是存在多個多個組,只須要監控其中一個組,就能調出全部組的狀態
    
    #刪除組內服務器storage和查看各個組內服務器狀態
    /usr/local/fastdfs/bin/fdfs_monitor /usr/local/fastdfs/conf/client.conf delete group2 192.168.55.223
    /usr/local/fastdfs/bin/fdfs_monitor /usr/local/fastdfs/conf/client.conf
    storage server有7個狀態,以下(數值從1~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    :在線,能夠提供服務
  • 經常使用操做命令
    #調整防火牆的規則,開放端口:22122
      iptables -I INPUT 5 -p tcp -m state --state NEW -m tcp --dport 22122 -j ACCEPT
      /etc/init.d/iptables save
    
    #調整防火牆的規則,開放端口:23000
      iptables -I INPUT 5 -p tcp -m state --state NEW -m tcp --dport 23000 -j ACCEPT
      /etc/init.d/iptables save
     
    #啓動tracker進程:
      /etc/init.d/fdfs_trackerd start
    
    #查看trackerd狀態:
      /etc/init.d/fdfs_trackerd status
    
    #查看trackerd監聽的端口:
      netstat -plantu | grep tracker
    
    #啓動Storage進程:
      /etc/init.d/fdfs_storaged start
    
    #查看Storage進程:
      ps -ef | grep storaged | grep -v grep

 

參考:http://my.oschina.net/shking/blog/165326

http://baike.sogou.com/h60583131.htm?sp=l60583132

相關文章
相關標籤/搜索