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