Linux下FastDFS系統的搭建

FastDFS是由淘寶的餘慶先生所開發,是一個輕量級、高性能的開源分佈式文件系統,用純C語言開發,包括文件存儲、文件同步、文件訪問(上傳、下載)、存取負載均衡、在線擴容、相同內容只存儲一份等功能,適合有大容量存儲需求的應用或系統。做分佈式系統開發時,其中要解決的一個問題就是圖片、音視頻、文件共享的問題,分佈式文件系統正好可以解決這個需求。同類的分佈式文件系統有谷歌的GFS、HDFS(Hadoop)、TFS(淘寶)等。

源碼開放下載地址:https://github.com/happyfish100
早期源碼開放下載地址:https://sourceforge.net/projects/fastdfs/files/
官網論壇:http://bbs.chinaunix.net/forum-240-1.html

術語

  • Tracker Server:跟蹤服務器,主要做調度工作,在訪問上起負載均衡的作用。記錄storage server的狀態,是連接Client和Storage server的樞紐。
  • Storage Server:存儲服務器,文件和meta data都保存到存儲服務器上
  • group:組,也可稱爲卷。同組內服務器上的文件是完全相同的
    文件標識:包括兩部分:組名和文件名(包含路徑)
  • meta data:文件相關屬性,鍵值對(Key Value Pair)方式,如:width=1024,heigth=768

FastDFS結構

系統架構圖


部署結構

文件上傳下載

上傳流程

下載流程

系統的部署

環境介紹

操作系統:centerOS 7.3 需要有gcc,安裝命令
yum -y install gcc gcc+ gcc-c++ openssl openssl-devel pcre pcre-devel
FastDFS :5.11

安裝libfastcommon(公共代碼)

下載zip包

 wget https://github.com/happyfish100/libfastcommon/archive/master.zip

解壓,如果解壓出現-bash: unzip: command not found,說明系統沒有安裝unzip和zip,使用yum install -y unzip zip安裝即可

unzip master.zip 

編譯安裝

 ./make.sh

 ./make.sh install

查看此庫文件是否存在,存在則表示安裝成功
ls -l /usr/lib64/libfastcommon.so

安裝FastDFS

同樣需要下載解壓和編譯安裝

wget https://github.com/happyfish100/fastdfs/archive/V5.11.zip

unzip V5.11.zip

./make.sh 

./make.sh install

查看fdfs的相關命令,fastDFS命令目錄:/usr/bin

配置文件介紹

FastDFS的配置文件在/etc/fdfs下面,默認都是以.sample爲後綴的,這個後綴要去掉,最好就是先複製一份出來。配置文件大部分是保持默認的,要修改的地方不多。

tracker.conf配置介紹

# ===========================基本配置====================================
    disabled=false
    #配置tracker.conf這個配置文件是否生效,因爲在啓動fastdfs服務端進程時需要指定配置文件,所以需要使次配置文件生效。false是生效,true是讓此文件不生效。
    bind_addr=
    #程序的監聽地址,如果不設定則監聽所有地址
    port=22122
    #tracker監聽的端口
    connect_timeout=30
    #連接超時時間,針對socket套接字函數connect,默認爲30秒
    network_timeout=60
    #網絡通訊超時(秒)
    base_path=/home/yuqing/fastdfs
    #Tracker數據/日誌目錄地址,這裏一般要修改的,如:/opt/fdfs
    max_connections=256
    #允許的最大連接數,這裏要根據需求調整.如設置成2048.
    accept_threads=1
    #接收數據的線程數
    work_threads=4
    #工作線程數,一般爲cpu個數,當然CPU核數太多的話可以稍小一點。如我們是12CCPU,這裏設置爲8.
    min_buff_size = 8KB
    #接收/發送數據的buff大小,必須大於8KB
    max_buff_size = 128KB
    #接收/發送數據的buff大小必須小於128KB
    store_lookup=2
    #在存儲文件時選擇group的策略也就是文件上傳選取group的規則,0:輪訓策略 1:指定某一個組 2:負載均衡,選擇空閒空間最大的group。
    store_group=group2
    #如果上面store_lookup=1,這裏就起作用了,這裏就要指定某一個組來存儲上傳的文件了。(一般store_lookup=1是由於舊的組已經沒有空間了,因爲下面有規則設置,所以就要新添加的機器就要放到新組裏面,所以再上傳就要傳到新組裏面。)
    store_server=0
    # 選擇哪個storage server 進行上傳操作一個文件被上傳後,這個storage server就相當於這個文件的storage server源,會對同組的storage server推送這個文件達到同步效果
    # 0: 輪詢方式(默認)
    # 1: 根據ip 地址進行排序選擇第一個服務器(IP地址最小者)
    # 2: 根據優先級進行排序(上傳優先級由storage server來設置,參數名爲upload_priority),優先級值越小優先級越高。
    store_path=0
    #選擇文件上傳到storage中的哪個(目錄/掛載點),storage可以有多個存放文件的base path 0:輪訓策略 2:負載均衡,選擇空閒空間最大的。我們線上選擇的是2,讓其選擇空閒空間最大的去存放。
    download_server=0
    # 選擇哪個 storage server 作爲下載服務器。
    # 0: 輪詢方式,可以下載當前文件的任一storage server
    # 1: 哪個爲源storage server就用哪一個,就是之前上傳到哪個storage server服務器就是哪個了
    reserved_storage_space = 10%
    #系統預留空間,當一個group中的任何storage的剩餘空間小於定義的值,整個group就不能上傳文件了(V4開始支持百分比方式),如:10G(字節數可以是GB,MB,KB,B)或者10%。
    log_level=info
    #日誌信息級別
    run_by_group=
    #進程以那個用戶組運行,不指定默認是當前用戶組
    run_by_user=
    #進程以那個用戶運行,不指定默認是當前用戶
    allow_hosts=*
    # 可以連接到此 tracker server 的ip範圍,默認是允許所有(對所有類型的連接都有影響,包括客戶端,storage server)
    # for example:
    # allow_hosts=10.0.1.[1-15,20]
    # allow_hosts=host[01-08,20-25].domain.com
    # allow_hosts=192.168.5.64/26
    sync_log_buff_interval = 10
    #同步或刷新日誌信息到硬盤的時間間隔,單位爲秒。注意:tracker server的日誌不是時時寫硬盤的,而是先寫內存。
    check_active_interval = 120
    #檢測storage服務器的間隔時間,storage定期主動向tracker發送心跳,如果在指定的時間沒收到信號,tracker認爲storage故障,默認120s
    thread_stack_size = 64KB
    #線程棧的大小。FastDFS server端採用了線程方式。線程棧越大,一個線程佔用的系統資源就越多。如果要啓動更多的線程可以適當降低本參數值。
    storage_ip_changed_auto_adjust = true
    #這個參數控制當storage server IP地址改變時,集羣是否自動調整。注:只有在storage server進程重啓時才完成自動調整。
    # ===========================同步======================================
    storage_sync_file_max_delay = 86400
    # V2.0引入的參數。存儲服務器之間同步文件的最大延遲時間,缺省爲1天。根據實際情況進行調整。
    storage_sync_file_max_time = 300
    # V2.0引入的參數。存儲服務器同步一個文件需要消耗的最大時間,缺省爲300s,即5分鐘。
    # 注:本參數並不影響文件同步過程。本參數僅在下載文件時,作爲判斷當前文件是否被同步完成的一個閥值。
    # ===========================trunk 和 slot============================
    use_trunk_file = false 
    # V3.0引入的參數。是否使用小文件合併存儲特性,缺省是關閉的。
    slot_min_size = 256
    #V3.0引入的參數。trunk file分配的最小字節數。比如文件只有16個字節,系統也會分配slot_min_size個字節。
    slot_max_size = 16MB
    #V3.0引入的參數。只有文件大小<=這個參數值的文件,纔會合併存儲。如果一個文件的大小大於這個參數值,將直接保存到一個文件中(即不採用合併存儲方式)。
    trunk_file_size = 64MB
    #V3.0引入的參數。合併存儲的trunk file大小,至少4MB,缺省值是64MB。不建議設置得過大。
    trunk_create_file_advance = false
    #是否開啓創建trunk file。只有當這個參數爲true,下面3個以trunk_create_file_打頭的參數纔有效。默認我們開啓trunk合併。
    trunk_create_file_time_base = 02:00
    # 提前創建trunk file的起始時間點(基準時間),02:00表示第一次創建的時間點是凌晨2點  
    trunk_create_file_interval = 86400
    #創建trunk file的時間間隔,單位爲秒。如果每天只提前創建一次,則設置爲86400  
    trunk_create_file_space_threshold = 20G
    # 提前創建trunk file時,需要達到的空閒trunk大小,比如本參數爲20G,而當前空閒trunk爲4GB,那麼只需要創建16GB的trunk file即可。  
    trunk_init_check_occupying = false
    #trunk初始化時,是否檢查可用空間是否被佔用
    trunk_init_reload_from_binlog = false
    #是否無條件從trunk binlog中加載trunk可用空間信息,FastDFS缺省是從快照文件storage_trunk.dat中加載trunk可用空間,該文件的第一行記錄的是trunk binlog的offset,然後從binlog的offset開始加載
    trunk_compress_binlog_min_interval = 0
    #壓縮trunk binlog 的最小時間間隔,單位:秒。默認值爲0,0代表不壓縮。FastDFS會在trunk初始化或者被銷燬的時候壓縮trunk binlog文件,如果設置的話建議設置成86400,一天設置一次。
    # ===========================其他設置============================
    use_storage_id = false
    #是否使用storage id替換ip作爲storage server標識,默認爲false
    storage_ids_filename = storage_ids.conf
    #在文件中設置組名、server ID和對應的IP地址,參見源碼目錄下的配置示例:storage_ids.conf
    id_type_in_filename = ip
    #存儲服務器的文件名中的id類型,取值如下
    # IP:存儲服務器的IP地址
    # id:被存儲服務器的服務器標識
    # 只有當use_storage_id設置爲true時此參數是有效的,默認值是IP
    store_slave_file_use_link = false
    #存儲從文件是否採用symbol link(符號鏈接)方式。如果設置爲true,一個從文件將佔用兩個文件:原始文件及指向它的符號鏈接。
    rotate_error_log = false
    #是否定期輪轉error log,目前僅支持一天輪轉一次
    error_log_rotate_time=00:00
    #error log定期輪轉的時間點,只有當rotate_error_log設置爲true時有效
    rotate_error_log_size = 0
    #error log按大小輪轉,設置爲0表示不按文件大小輪轉,否則當error log達到該大小,就會輪轉到新文件中
    log_file_keep_days = 0
    #保留日誌文件0表示不刪除舊日誌文件,默認值爲0
    use_connection_pool = false
    #是否使用連接池
    connection_pool_max_idle_time = 3600
    #連接的空閒時間超過這個時間將被關閉,單位:秒
    # ===========================HTTP 相關=================================
    http.server_port=8080
    #tracker server上的HTTP服務器端口號
    http.check_alive_interval=30
    # 檢查storage http server存活的間隔時間,單位爲秒
    http.check_alive_type=tcp
    #檢查存儲HTTP服務器的活動類型,值爲:tcp:僅連接到具有HTTP端口的存儲服務器,不要求和獲取響應http:storage check alive url必須返回http狀態200默認值爲tcp
    http.check_alive_uri=/status.html
    #檢查storage http server是否alive的uri/url

上面有很大一部分提到了trunk合併,一般我們是默認不合並的,小文件就是存儲到目錄裏面。下面兩篇鏈接講的比較詳細和專業:
http://blog.csdn.net/hfty290/article/details/42026215
http://blog.csdn.net/liuaigui/article/details/9981135

storage.conf配置文件介紹

    disabled=false
    #是否啓用禁用配置文件,false是不啓用禁用,true是啓動禁用。
    group_name=group1
    #本storage server所屬組名
    bind_addr=
    #綁定IP,默認就是監聽在0.0.0.0上面
    client_bind=true
    #bind_addr通常是針對server的。當指定bind_addr時,本參數纔有效。本storage server作爲client連接其他服務器(如tracker server、其他storage server),是否綁定bind_addr。true:綁定bind_addr所指定的IP。false:綁定本機的任意IP
    port=23000
    #storage server服務端口
    connect_timeout=30
    #連接超時(秒),默認值 30s
    network_timeout=60
    #網絡超時(秒),默認值 60s
    heart_beat_interval=30
    #心跳間隔時間,單位爲秒 (這裏是指主動向tracker server 發送心跳)
    stat_report_interval=60
    #storage server向tracker server報告磁盤剩餘空間的時間間隔,單位爲秒。
    base_path=/home/yuqing/fastdfs
    # base_path目錄地址,根目錄必須存在子目錄會自動生成。注 :這裏不是上傳的文件存放的地址,之前是的,在某個版本後更改了
    max_connections=256
    #最大連接數,根據需求可以調大,如設置成2048.
    buff_size = 256KB
    #接收/發送數據的buff大小,必須大於8KB,如這裏可以設置成2048KB,設置的大一點。
    accept_threads=1
    #接收數據的線程數
    work_threads=4
    #接收數據的線程數,可以是CPU的核數或者比CPU核數小。
    disk_rw_separated = true
    #磁盤IO讀寫是否分離,缺省是分離的。磁盤讀/寫分離爲false則爲混合讀寫,如果爲true則爲分離讀寫的。默認值爲V2.00以後爲true。
    disk_reader_threads = 1
    # 針對單個存儲路徑的讀線程數,缺省值爲1。我們這裏設置爲4.
    # 讀寫分離時,系統中的讀線程數 = disk_reader_threads * store_path_count
    # 讀寫混合時,系統中的讀寫線程數 = (disk_reader_threads + disk_writer_threads) * store_path_count
    disk_writer_threads = 1
    # 針對單個存儲路徑的寫線程數,缺省值爲1。我們這裏設置爲4.
    # 讀寫分離時,系統中的寫線程數 = disk_writer_threads * store_path_count
    # 讀寫混合時,系統中的讀寫線程數 = (disk_reader_threads + disk_writer_threads) * store_path_count
    sync_wait_msec=50
    # 同步文件時,如果從binlog中沒有讀到要同步的文件,休眠N毫秒後重新讀取。0表示不休眠,立即再次嘗試讀取。如果沒特別需求,默認值50毫秒就可以了。
    # 出於CPU消耗考慮,不建議設置爲0。如何希望同步儘可能快一些,可以將本參數設置得小一些,比如設置爲10ms
    sync_interval=0
    #同步完一個文件後間隔多少毫秒同步下一個文件,0表示不休息直接同步
    sync_start_time=00:00
    sync_end_time=23:59
    #上面兩段表示這段時間內同步文件,也就是說全天都在同步數據。第一條是開始時間段,第二條是結束時間段。
    write_mark_file_freq=500
    #同步完多少文件後寫mark標記,什麼是mak標記等下面搭建的時候會文件舉例。
    store_path_count=1
    #storage在存儲文件時支持多路徑,默認只設置一個,通俗的將也就是你要掛載幾個存儲盤,你這裏就設置對應的磁盤數,比如12塊盤當store,這裏就設置爲12.
    store_path0=/home/yuqing/fastdfs
    #逐一配置store_path個路徑,索引號基於0。注意配置方法後面有0,1,2 ......,需要配置0到store_path - 1。如果不配置base_path0,那邊它就和base_path對應的路徑一樣。
    #如下面的配置(這裏是兩塊盤,所以store_path_count=2):
    #store_path0=/data01/fastdfs 
    #store_path1=/data02/fastdfs 
    subdir_count_per_path=256
    # FastDFS存儲文件時,採用了兩級目錄。如果本參數只爲N(如:256),那麼storage server在初次運行時,會自動創建 N * N 個存放文件的子目錄。
    tracker_server=192.168.209.121:22122
    #tracker_server 的列表要寫端口(是主動連接tracker_server)有多個tracker server時,每個tracker server寫一行,如下面:
    #192.168.1.103:22122
    #192.168.1.104:22122
    log_level=info
    #日誌級別,我們這裏設置爲了warn。
    run_by_group=
    #指定運行該程序的用戶組,不設置就默認爲當前啓動程序的用戶組。
    run_by_user=
    #指定運行該程序的用戶,不設置就默認爲當前啓動程序的用戶。
    allow_hosts=*
    #默認是允許所有主機連接
    file_distribute_path_mode=0
    # 0: 輪流存放,在一個目錄下存儲設置的文件數後(參數file_distribute_rotate_count中設置文件數),使用下一個目錄進行存儲。
    # 1: 隨機存儲,根據文件名對應的hash code來分散存儲。
    file_distribute_rotate_count=100
    # 當上面的參數file_distribute_path_mode配置爲0(輪流存放方式)時,本參數有效。
    # 當一個目錄下的文件存放的文件數達到本參數值時,後續上傳的文件存儲到下一個目錄中。
    fsync_after_written_bytes=0
    #寫大文件時調用fsync到磁盤,0:永遠不要調用fsync。other:寫多少字節後開始同步,當寫入字節> =這個字節時調用fsync。默認值爲0(從不調用fsync)
    sync_log_buff_interval=10
    # 同步或刷新日誌信息到硬盤的時間間隔,單位爲秒。注意:storage server 的日誌信息不是時時寫硬盤的,而是先寫內存。
    sync_binlog_buff_interval=10
    #同步binglog(更新操作日誌)到硬盤的時間間隔,單位爲秒。本參數會影響新上傳文件同步延遲時間
    sync_stat_file_interval=300
    # 把storage的stat文件同步到磁盤的時間間隔,單位爲秒。注:如果stat文件內容沒有變化,不會進行同步
    thread_stack_size=512KB
    # 線程棧的大小。FastDFS server端採用了線程方式。應該大於等於512KB。
    upload_priority=10
    #本storage server作爲源服務器,上傳文件的優先級,可以爲負數。值越小,優先級越高。裏就和 tracker.conf 中store_server= 2時的配置相對應了。
    if_alias_prefix=
    #網卡別名,用ifconfig -a可以看到很多本機的網卡別名,類似eth0,eth0:0等等。多個網卡別名使用逗號分割,默認爲空,讓系統自動選擇。
    check_file_duplicate=0
    # 是否檢測上傳文件已經存在。如果已經存在,則不存文件內容,建立一個符號鏈接以節省磁盤空間。 這個應用要配合FastDHT 使用,所以打開前要先安裝FastDHT。1或yes 是檢測,0或no 是不檢測
    file_signature_method=hash
    #文件簽名方法用於檢查文件重複,hash:四個32位哈希碼。md5:MD5簽名。默認值是V4.01之後的哈希
    key_namespace=FastDFS
    #當參數check_file_duplicate設定爲1 或 yes時(true/on也是可以的),在FastDHT中的命名空間。
    keep_alive=0
    # 與FastDHT servers 的連接方式 (是否爲持久連接) ,默認是0(短連接方式)。可以考慮使用長連接,這要看FastDHT server的連接數是否夠用。
    use_access_log = false
    #是否記錄訪問日誌
    rotate_access_log = false
    # 是否定期輪轉access log,目前僅支持一天輪轉一次
    access_log_rotate_time=00:00
    # access log定期輪轉的時間點,只有當rotate_access_log設置爲true時有效
    rotate_error_log = false
    #是否定期輪轉error log,目前僅支持一天輪轉一次
    error_log_rotate_time=00:00
    # error log定期輪轉的時間點,只有當rotate_error_log設置爲true時有效
    rotate_access_log_size = 0
    # access log按文件大小輪轉,設置爲0表示不按文件大小輪轉,否則當access log達到該大小,就會輪轉到新文件中
    rotate_error_log_size = 0
    # error log按文件大小輪轉,設置爲0表示不按文件大小輪轉,否則當error log達到該大小,就會輪轉到新文件中
    log_file_keep_days = 0
    #保留日誌文件的日期0表示不刪除舊的日誌文件
    file_sync_skip_invalid_record=false
    #文件同步的時候,是否忽略無效的binlog記錄
    use_connection_pool = false
    # 是否使用連接池
    connection_pool_max_idle_time = 3600
    # 連接的空閒時間超過這個時間將被關閉,單位:秒
    http.domain_name=
    #如果domain_name爲空,請使用此存儲服務器的IP地址,否則此域名將在由跟蹤服務器重定向的URL中出現
    http.server_port=8888
    #該存儲服務器上的Web服務器的端口

client.conf配置文件介紹

    connect_timeout=30
    #連接的超時時間
    network_timeout=60
    #網絡超時(秒),默認值 60s
    base_path=/home/yuqing/fastdfs
    #存儲日誌文件的基本路徑,如/opt/fastdfs
    tracker_server=192.168.0.197:22122
    #tracker server的列表,多個的話就是多行,如:
    #192.168.1.103:22122
    #192.168.1.104:22122
    log_level=info
    #日誌級別
    use_connection_pool = false
    #是否使用連接池
    connection_pool_max_idle_time = 3600
    #連接的空閒時間超過這個時間將被關閉,單位:秒
    load_fdfs_parameters_from_tracker=false
    #是否加載來自跟蹤服務器的FastDFS參數,默認值爲false。這裏可以設置爲true。
    use_storage_id = false
    #是否使用storage id替換ip作爲storage server標識,默認爲false
    storage_ids_filename = storage_ids.conf
    #在文件中設置組名、server ID和對應的IP地址,參見源碼目錄下的配置示例:storage_ids.conf
    http.tracker_server_port=80
    #HTTP設置,tracker server上的HTTP服務器端口號

配置啓動Tracker

首先創建數據目錄,並修改tracker.conf配置文件

mkdir  /data/fastdfs/tracker

修改配置文件
vim /etc/fdfs/tracker.conf

啓動tracker


cd /usr/bin/

fdfs_trackerd /etc/fdfs/tracker.conf restart

查看啓動結果,tracker的默認端口爲 22122

配置啓動storage

按照前面的介紹,storage應該安裝在其他服務器節點上,並且可以添加多個groups。這裏爲了方便,直接跟Tracker在同一臺服務器,並且就不安裝多個了。
修storage.conf配置文件


啓動stroge

測試

直接下載官方的測試demo:https://github.com/happyfish100/fastdfs-client-java
這裏使用idea運行項目,新建fastDFS.conf

connect_timeout = 2
network_timeout = 20
#tracker服務器地址,如果有多個tracker可以配置多個tracker_server
tracker_server=192.168.18.129:22122

需要運行的類,先添加兩個參數:一個是配置文件,一個是要上傳文件。


點擊運行即可,運行結果

參考:
- FastDFS之基礎知識
- FASTDFS

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章