FastDFS詳解

一、什麼是fastDFS
1.介紹
FastDFS是一個開源的高性能分佈式文件系統。它的主要功能包括:文件存儲,文件同步和文件訪問(文件上傳和文件下載),它可以解決高容量和負載平衡問題。主要解決了海量數據存儲問題,特別適合以中小文件(建議範圍:4KB < file_size <500MB)爲載體的在線服務。 FastDFS應該滿足基於服務的網站的要求在照片共享網站和視頻共享網站等文件上。
FastDFS具有兩個角色:跟蹤器和存儲。跟蹤器負責計劃和負載平衡以訪問文件。存儲器存儲文件及其功能是文件管理,包括:文件存儲,文件同步,提供文件訪問界面。跟蹤器還管理元數據,這些元數據是表示爲文件的鍵值對的屬性。例如:width = 1024,鍵是“ width”,值是“ 1024”。
跟蹤器和存儲包含一臺或多臺服務器。跟蹤器或存儲羣集中的服務器可以隨時添加到羣集中或從羣集中刪除,而不會影響聯機服務。跟蹤器羣集中的服務器是對等的。
存儲服務器按文件卷/組進行組織以獲得高容量。該存儲系統包含一個或多個卷,這些卷的文件相互獨立。整個存儲系統的容量等於所有卷容量的總和。文件捲包含一個或多個存儲服務器,這些服務器之間的文件相同。文件卷中的服務器相互備份,並且所有這些服務器都在負載平衡中。將存儲服務器添加到卷中時,該卷中已經存在的文件會自動複製到該新服務器,複製完成後,系統會將該服務器聯機切換爲提供存儲服務。
當整個存儲容量不足時,您可以添加一個或多個卷以擴展存儲容量。爲此,您需要添加一個或多個存儲服務器。
2.技術應用場景
文件爲載體的在線服務,如相冊網站、視頻網站等等。

二、fastDFS工作原理
1.fastDFS架構

在這裏插入圖片描述
FastDFS系統有三個角色:Tracker 服務器、Storage 服務器、Client客戶端。
Tracker服務器(跟蹤器):主要做調度工作,在訪問上起負載均衡的作用。負責管理所有的 storage server和 group,每個 storage 在啓動後會連接 Tracker,告知自己所屬 group 等信息,並保持週期性心跳。注意:Tracker只負責調度,維護各個Storage分組和分組中服務器信息,不存儲Storage中的文件路徑。
Storage服務器(存儲器):主要提供容量和備份服務。以 group 爲單位,每個 group 內可以有多臺 storage server,數據互爲備份。存儲空間大小爲各group容量累加之和。
Client(客戶端cu):上傳下載數據的服務器(第三方服務器,javaAPI運用程序),需要存儲每一個上傳文件的存儲路徑和文件名。

2.Tracker集羣
Tracker可以有一臺或多臺,Tracker 集羣中每一臺服務器是相互平等關係,每一臺Tracker服務器都負責管理Storage服務器,故不存在單點故障,客戶端訪問tracker服務器時可以採用輪詢方式。

3.Storage集羣
storage集羣由一個或多個組構成,集羣存儲總容量爲集羣中所有組的存儲容量之和。一個組由一臺或多臺存儲服務器組成,組內的Storage server之間是平等關係,不同組的Storage server之間不會相互通信,同組內的Storage server之間會相互連接進行文件同步,從而保證同組內每個storage上的文件完全一致的。一個分組的存儲服務器訪問壓力較大時,可以在該組增加存儲服務器來擴充服務能力(縱向擴容)。當系統容量不足時,可以增加組來擴充存儲容量(橫向擴容)。Storage集羣的服務器會定向向Tracker服務器報告自己的狀態,包括磁盤剩餘空間、文件同步狀況、文件上傳下載次數等統計信息。
4.FastDFS的文件同步
寫文件時,客戶端將文件寫至group內一個storage server即認爲寫文件成功,storage server寫完文件後,會由後臺線程將文件同步至同group內其他的storage server。每個storage寫文件後,同時會寫一份binlog,binlog裏不包含文件數據,只包含文件名等元信息,這份binlog用於後臺同步,storage會記錄向group內其他storage同步的進度,以便重啓後能接上次的進度繼續同步;進度以時間戳的方式進行記錄,所以最好能保證集羣內所有server的時鐘保持同步。storage的同步進度會作爲元數據的一部分彙報到tracker上,tracke在選擇讀storage的時候會以同步進度作爲參考。
5.文件上傳流程
在這裏插入圖片描述

FastDFS向使用者提供基本文件訪問接口,包括(upload上傳、download下載、delete刪除),以客戶端(api)方式給用戶使用。集羣中各Tracker是對等的,客戶端上傳時可以選擇任意一個Tracker,當Tracker收到客戶端上傳文件的請求時,會爲該文件分配一個可以存儲文件的group,當選定了group後就要決定給客戶端分配group中的哪一個storage server。當分配好storage server後,客戶端向storage發送寫文件請求,storage將會爲文件分配一個數據存儲目錄。然後爲文件分配一個fileid,最後根據以上的信息生成文件名存儲文件。

6.文件下載流程
在這裏插入圖片描述
跟upload file一樣,在downloadfile時客戶端可以選擇任意tracker server。tracker發送download請求給某個tracker,必須帶上文件名信息,tracke從文件名中解析出文件的group、大小、創建時間等信息,然後爲該請求選擇一個storage用來服務讀請求。
三、服務器搭建
1.安裝包準備
Libfastcommon:是FastDFS 和 FastDHT 中提取出來的公共 C 函數庫,基礎環境,版本libfastcommonV1.0.7.tar.gz
FastDFS-FastDFS:tracker和starage安裝包,版本FastDFS_v5.05.tar.gz
fastdfs-nginx-module:nginx插件,安裝在Storage可以重定向連接到源服務器取文件,避免客戶端由於複製延遲的問題,出現錯誤,版本fastdfs-nginx-module_v1.16.tar.gz
Nginx:反向代理服務器,版本nginx-1.8.1.tar.gz

2.安裝環境介紹
Tracker服務器:192.168.158.11-12;Storage服務器:192.168.158.13-16.其中13與14爲group1,15與16爲group2.
3.安裝libfastcommon類庫(全部服務器)
上傳libfastcommonV1.0.7.tar.gz到/usr/local

cd /usr/local
tar -zxvf libfastcommonV1.0.7.tar.gz
cd libfastcommon-1.0.7
./make.sh
./make.sh install

安裝完的路徑在/usr/lib64,但是fastDFS訪問的lib路徑在 /usr/local/lib 中 所以此時需要建立軟連接

  ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so
  ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so

4.安裝FastDFS(全部)
上傳FastDFS_v5.05.tar.gz到/usr/local

cd /usr/local
tar -zxvf FastDFS_v5.05.tar.gz
cd FastDFS
./make.sh
./make.sh install

安裝好後,程序是在/usr/bin目錄下:
配置文件在/etc/fdfs目錄下
5.配置tracker(11.12)
5.1創建存儲數據和日誌根目錄,並複製tracker.conf文件f

mkdir  /home/fastdfs
cd /etc/fdfs
cp tracker.conf.sample tracker.conf

5.1修改tracker.conf文件(tracker.conf各項配置見tracker.conf詳解)

vi tracker.conf
base_path=/home/fastdfs

5.3啓動

/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart

5.4設置開機啓動

echo '/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart' >> /etc/rc.d/rc.local

5.5確認是否啓動

ps -ef|grep fdfs

6.配置Storage(13-16)
將存儲節點分爲兩個組,其中group1 (13、14)、group2 (15、16)
6.1創建存儲數據和日誌根目錄,並複製tracker.conf文件f

mkdir  /home/fastdfs
cd /etc/fdfs
cp storage.conf.sample storage.conf

6.storage.conf文件(storage.conf各項配置見storage.conf詳解)

vi storage.conf
group_name=group1 #組名(第一組13、14爲group1,第二組15、16爲group2)
base_path=/home/fastdfs
store_path0=/home/fastdfs #第一個存儲目錄,第二個存儲目錄起名爲:store_path1=xxx,依次類推...
store_path_count=1 # 存儲路徑個數,需要和store_path個數匹配
tracker_server=192.168.158.11:22122# tracker服務器IP和端口
tracker_server=192.168.158.12:22122 # tracker服務器IP和端口

6.3啓動

/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart

6.4設置開機啓動

echo '/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart' >> /etc/rc.d/rc.local

6.5確認是否啓動

netstat -tupln | grep storaged

7.Storage上安裝nginx
7.1安裝fastdfs-nginx-module,主要這個模塊只需要在Storage上安裝
上傳fastdfs-nginx-module_v1.16.tar.gz到/usr/local
解壓

cd /usr/local
tar -zxvf fastdfs-nginx-module_v1.16.tar.gz

安裝nginx

yum install -y pcre* zlib zlib-devel openssl openssl-devel
./configure --with-http_ssl_module --add-module=/usr/local/fastdfs-nginx-module/src
make && make install

7.2編輯fastdfs-nginx-module文件(修改CORE_INCS和CORE_LIBS路徑)
cd fastdfs-nginx-module/src/
vi config
CORE_INCS=“COREINCS/usr/local/include/fastdfs/usr/local/include/fastcommon/"CORELIBS="CORE_INCS /usr/local/include/fastdfs /usr/local/include/fastcommon/" CORE_LIBS="CORE_LIBS -L/usr/local/lib -lfastcommon -lfdfsclient”
把local都去掉
7.3配置fastdfs-nginx-module
進入fastdfs-nginx-module的src目錄,將md_fastdfs.conf配置文件拷貝到/etc/fdfs/目錄中

cd /usr/local/fastdfs-nginx-module/src
cp mod_fastdfs.conf /etc/fdfs/
vi /etc/fdfs/mod_fastdfs.conf

一般只需改動以下幾個參數即可:

base_path=/home/fastdfs           #保存日誌目錄
tracker_server=192.168.158.11:22122
tracker_server=192.168.158.11:22122 
storage_server_port=23000         #storage服務器的端口號
group_name=group1                 #當前服務器的group名
url_have_group_name = true        #文件url中是否有group名
store_path_count=1                #存儲路徑個數,需要和store_path個數匹配
store_path0=/home/fastdfs         #存儲路徑
group_count = 2                   #設置組的個數

[group1] #設置了group_count = 2,接下來就需要在文件尾部追加這2個group setting
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/home/fastdfs
[group2]
group_name=group2
storage_server_port=23000
store_path_count=1
store_path0=/home/fastdfs

7.4複製文件

cp /usr/local/nginx/conf/http.conf /etc/fdfs 
cp  /usr/local/nginx/conf/mime.types /etc/fdfs 

7.5建立M00至存儲目錄的符號連接

ln -s /home/fastdfs/data /home/fastdfs/data/M00
ll /home/fastdfs/data/M00

7.6配置nginx
Vi /usr/local/nginx/conf/nginx.conf
將listen端口改爲8888,啓動用戶使用root
user root
listen 8888;
在server段中添加:

location ~/group[1-2]/M00 {
    root  /home/fastdfs/data;
    ngx_fastdfs_module;
}

7.7將nginx設置爲開機啓動:

echo '/usr/local/nginx/sbin/nginx' >> /etc/rc.d/rc.local

8.Tracker上安裝nginx
8.1安裝nginx

yum install -y pcre* zlib zlib-devel openssl openssl-devel
./configure --with-http_ssl_module 
make && make install

8.2配置nginx

vi /usr/local/nginx/conf/nginx.conf
worker_processes  4;                  #根據CPU核心數而定
events {
    worker_connections  65535;        #最大鏈接數
    use epoll;                        #新版本的Linux可使用epoll加快處理性能
}
http {
    #設置group1的服務器
    upstream fdfs_group1 {
        server 192.168.158.13:8888 weight=1 max_fails=2 fail_timeout=30s;
        server 192.168.158.14:8888 weight=1 max_fails=2 fail_timeout=30s;
    }
    #設置group2的服務器
    upstream fdfs_group2 {
        server 192.168.158.15:8888 weight=1 max_fails=2 fail_timeout=30s;
        server 192.168.158.16:8888 weight=1 max_fails=2 fail_timeout=30s;
    }

   server {
       #設置服務器端口
        listen       8080;
       #設置group1的負載均衡參數
        location /group1/M00 {
            proxy_pass http://fdfs_group1;
        }
        #設置group2的負載均衡參數
        location /group2/M00 {
            proxy_pass http://fdfs_group2;
        }
      }
}
}

8.3將nginx設置爲開機啓動:

echo '/usr/local/nginx/sbin/nginx' >> /etc/rc.d/rc.local

四、配置文件詳解
1.tracker.conf文件詳解
disabled:配置文件是否生效
bind_addr:綁定固定IP地址,服務器多個IP時希望指定IP提供服務時指定,不指定爲服務器所有IP
port:tracker服務端口
connect_timeout:套接字連接超時秒數,默認30秒
network_timeout:網絡連接超時秒數,發送或接收數據時,超時後還不能發送或接收數據,則本次網絡通信失敗
base_path:存儲數據和日誌文件的基礎目錄地址(根目錄必須存在,子目錄會自動創建),tracker
server目錄及文件結構:
${base_path}
|__data
| |__storage_groups.dat:存儲分組信息
| |__storage_servers.dat:存儲服務器列表
| |__storage_sync_timestamp.dat:storage同步時間
| |__storage_changelog.dat:storage變更日誌
| |__fdfs_trackerd.pid:tracker服務ID
|__logs
|__trackerd.log:tracker server日誌文件
max_connections:系統提供服務時的最大連接數
accept_threads:線程總數
work_threads:工作線程數,通常爲CPU數,應該不大於max_connections
store_lookup:選擇哪個group存儲上傳的文件,0:輪詢,1:指定組,2:負載均衡(最大剩餘空間的group)
store_group:存儲上傳文件的group名稱,store_lookup爲1時,必須指定一個group名稱
store_server:選擇哪個storage進行上傳操作,0:輪詢(默認),1:根據IP地址選擇一個最小的,2:storage服務設置的upload_priority優先級來選擇
store_path:選擇storage中的哪個目錄進行上傳,0:輪詢,2:剩餘空間最大的目錄
download_server:選擇哪個storage作爲下載文件服務,0:輪詢,1:與上傳文件服務一致
reserved_storage_space:storage服務器爲系統和其他應用保留的存儲空間,支持百分比設置
log_level:日誌級別
run_by_group:服務器運行FastDFS的用戶組,不填爲當前用戶組
run_by_user:服務器運行FastDFS的用戶,不填爲當前用戶
allow_hosts:可以連接此tracker服務的IP範圍
sync_log_buff_interval:同步或刷新日誌信息導磁盤的時間間隔單位爲秒
check_active_interval:檢測storage服務存活的時間間隔單位爲秒,此參數應該大於storage服務配置的心跳時間
隔。
thread_stack_size:線程棧的大小
storage_ip_changed_auto_adjust:當storage服務的IP地址變更時是否自動調整
storage_sync_file_max_delay:storage服務之間同步文件的最大延遲秒數,本參數不影響文件同步過程,僅在下
文件時,判斷文件是否已經被同步完成的一個閥值
storage_sync_file_max_time:存儲服務器同步一個文件的最大秒數,本參數不影響文件同步過程,僅在下載文件
,判斷文件是否已經被同步完成的一個閥值
use_trunk_file:是否使用小文件合併存儲特性
slot_min_size:trunk文件分配的最小字節數
slot_max_size:trunk文件分配的最大字節數,只有文件大小不大於這個參數值,纔會合併存儲。如果大於,將不
用合併存儲方式
trunk_file_size:合併存儲的trunk文件的大小
trunk_create_file_advance:是否提前創建trunk文件。此值爲真,trunk_create_file_XXX的參數纔有效
trunk_create_file_time_base:提前創建trunck文件的起始時間點
trunk_create_file_interval:創建trunck文件的時間間隔,單位爲秒
trunk_create_file_space_threshold:提前創建trunk文件需要達到的空閒trunk大小
trunk_init_check_occupying:trunk初始化時,是否檢查可用空間是否被佔用
trunk_init_reload_from_binlog:是否從trunk二進制日誌中國年加載trunk可用空間信息
trunk_compress_binlog_min_interval:trunk二進制日誌壓縮的最小時間間隔
use_storage_id:是否使用storage ID作爲storage服務標識
storage_ids_filename:storage ID文件地址,use_storage_id爲真,才需設置次參數。
id_type_in_filename:storage ID文件中服務ID類型,支持IP和storage服務ID
store_slave_file_use_link:存儲從文件是否採用符號鏈接方式
rotate_error_log:是否定期輪轉錯誤日誌
error_log_rotate_time:錯誤日誌輪轉時間點
rotate_error_log_size:錯誤日誌按大小輪轉
log_file_keep_days:日誌文件保留天數。0:不刪除老日誌文件
use_connection_pool:使用連接池
connection_pool_max_idle_time:連接池連接最大時長
http.server_port:tracker服務的HTTP端口
http.check_alive_interval:檢查storage HTTP服務存活時間間隔,單位爲秒
http.check_alive_type:檢查storage HTTP服務存活的服務協議類型
http.check_alive_uri:檢查storage HTTP服務存活地址URI/URL

2.storage.conf文件詳解
disabled:配置文件是否生效
group_name:storage服務所屬group名稱
bind_addr:綁定指定IP地址提供服務
client_bind:storage作爲客戶端連接其他服務時,是否綁定地址
port:storage服務端口
connect_timeout:套接字連接超時秒數,默認30秒
network_timeout:網絡連接超時秒數,發送或接收數據時,超時後還不能發送或接收數據,則本次網絡通信失敗
heart_beat_interval:主動向tracker發送心跳間隔時間,單位爲秒
stat_report_interval:向tracker服務報告磁盤剩餘空間時間間隔,單位爲秒
base_path:存儲數據和日誌文件的基礎目錄地址(根目錄必須存在,子目錄會自動創
max_connections:系統提供服務時的最大連接數
buff_size:接收或發送數據的隊列結點緩存大小,工作隊列消耗內存大小=send * max_connections
accept_threads:線程總數
work_threads:工作線程數,通常爲CPU數,應該不大於max_connections
disk_rw_separated:磁盤讀寫是否分離
disk_reader_threads:讀寫分離時,系統中的寫線程數=disk_reader_threads *
store_path_count,讀寫混合時線程數=(disk_reader_threads + disk_writer_threads) * store_path_count
disk_writer_threads:讀寫分離時,系統中的寫線程數=disk_writer_threads * store_path_count
sync_wait_msec:同步文件時,嘗試從二進制日誌文件中不斷讀取的休眠毫秒數
sync_interval:同步完一個文件後繼續同步的時間間隔,單位毫秒
sync_start_time:同步開始時間點
sync_end_time:同步結束時間點
write_mark_file_freq:同步完N個文件後,同步storage的mark文件到磁盤
store_path_count:storage服務存放文件的基路徑數
store_path#:逐一配置store_path路徑,索引號從0開始,store_path0不配置的話,與base_path路徑保持一致
subdir_count_per_path:FastDFS存儲文件的目錄個數,會自動創建N * N個子目錄
tracker_server:tracker服務列表,每個一行。格式爲主機和端口號,主機可以是主機名稱或IP地址
log_level:日誌級別
run_by_group:服務器運行FastDFS的用戶組,不填爲當前用戶組
run_by_user:服務器運行FastDFS的用戶,不填爲當前用戶
allow_hosts:允許連接storage服務的IP地址列表
file_distribute_path_mode:文件在data目錄下分佈存儲策略,0:輪詢,1:隨機根據文件名對應的hashcode存儲
file_distribute_rotate_count:file_distribute_path_mode爲0時有效,當一個目錄下的文件存放的文件數達到
參數值時,後續上傳的文件存儲到下一個目錄
fsync_after_written_bytes:寫入大文件時,每N字節強行將內容同步到硬盤
sync_log_buff_interval:同步或刷新日誌信息導磁盤的時間間隔單位爲秒
sync_binlog_buff_interval:同步二進制日誌到硬盤的時間間隔單位爲秒
sync_stat_file_interval:storage的stat信息同步到硬盤的時間間隔單位爲秒
thread_stack_size:線程棧的大小
upload_priority:上傳文件的優先級,值越小,優先級越高。tracker配置文件中的store_server值爲2時生效
if_alias_prefix:網絡適配器的別名前綴,不填寫會自動設置系統類型
check_file_duplicate:是否上傳的文件已經存在,配合FastDHT使用
file_signature_method:重複文件內容的簽名方式,支持hash和md5
key_namespace:在FastDHT中保存文件索引的命名空間
keep_alive:與FastDHT連接的方式。長連接和斷連接
use_access_log:是否將文件操作記錄到操作日誌
rotate_access_log:是否定期輪詢操作日誌
access_log_rotate_time:操作日誌定期輪詢時間點
rotate_error_log:是否定期輪詢錯誤日誌
error_log_rotate_time:錯誤日誌定期輪詢時間點
rotate_access_log_size:按文件大小輪詢操作日誌
rotate_error_log_size:按文件大小輪詢錯誤日誌
log_file_keep_days:日誌文件保存天數
file_sync_skip_invalid_record:文件同步時,是否忽略無效的記錄
use_connection_pool:是否使用連接池
connection_pool_max_idle_time:連接池連接最大時長
http.domain_name:storage服務web服務域名,可以通過tracker服務重定向URL來訪問,如果域名爲空使用IP地址
http.server_port:storage提供web服務的端口號
3.

五、測試與監控

1.運行測試:
FastDFS安裝成功可通過/usr/bin/fdfs_test測試上傳、下載等操作。
cp client.conf.sample client.conf
修改/etc/fdfs/client.conf
base_path=/home/fastdfs
tracker_server=192.168.158.11:22122

使用格式:
/usr/bin/fdfs_test 客戶端配置文件地址 upload 上傳文件
比如將/home下的文件上傳到FastDFS中:
/usr/bin/fdfs_test /etc/fdfs/client.conf upload /home/aaa.html
上傳後將返回文件路徑
2.運行監控
/usr/bin/fdfs_monitor <client_conf_filename>
3.fastdfs七種狀態
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 :在線,可以提供服務
六、下載文件重命名
FastDFS上傳的文件是重命名的,如果重命名需要配置Storage服務器nginx.conf ,並且訪問時帶上文件名
http://192.168.158.11:888/group1/M00/00/00/0g6GT1H40kkAZJeWAACCCJr7psA954_big.txt?filename=測試文件.txt

修改後的nginx.conf

location ~/group[1-2]/M00 {
    root  /home/fastdfs/data;
    if ($arg_attname ~ "^(.+)") {
        add_header Content-Disposition "attachment;filename=$arg_attname";
    }
    ngx_fastdfs_module;
}

文件過長保存問題
修改fastdfs_nginx模塊. src下 common.c 第615行到622行

if (uri_len + 1 >= (int)sizeof(uri))  
{  
    logError("file: "__FILE__", line: %d, " \  
        "uri length: %d is too long, >= %d", __LINE__, \  
        uri_len, (int)sizeof(uri));  
    OUTPUT_HEADERS(pContext, (&response), HTTP_BADREQUEST)  
    return HTTP_BADREQUEST;  
} 

註釋後,重新安裝nginx

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