學(xué)習(xí)完整課程請(qǐng)移步 互聯(lián)網(wǎng) Java 全棧工程師
本節(jié)視頻
FastDFS 簡介
百度百科
地址:https://baike.baidu.com/item/fastdfs/5609710?fr=aladdin
FastDFS是一個(gè)開源的輕量級(jí)分布式文件系統(tǒng)妓笙,它對(duì)文件進(jìn)行管理若河,功能包括:文件存儲(chǔ)、文件同步寞宫、文件訪問(文件上傳萧福、文件下載)等,解決了大容量存儲(chǔ)和負(fù)載均衡的問題辈赋。特別適合以文件為載體的在線服務(wù)鲫忍,如相冊(cè)網(wǎng)站、視頻網(wǎng)站等等钥屈。
FastDFS為互聯(lián)網(wǎng)量身定制悟民,充分考慮了冗余備份、負(fù)載均衡篷就、線性擴(kuò)容等機(jī)制射亏,并注重高可用、高性能等指標(biāo)竭业,使用FastDFS很容易搭建一套高性能的文件服務(wù)器集群提供文件上傳智润、下載等服務(wù)。
簡介
FastDFS服務(wù)端有兩個(gè)角色:跟蹤器(tracker)和存儲(chǔ)節(jié)點(diǎn)(storage)未辆。跟蹤器主要做調(diào)度工作窟绷,在訪問上起負(fù)載均衡的作用。
存儲(chǔ)節(jié)點(diǎn)存儲(chǔ)文件咐柜,完成文件管理的所有功能:就是這樣的存儲(chǔ)兼蜈、同步和提供存取接口攘残,F(xiàn)astDFS同時(shí)對(duì)文件的metadata進(jìn)行管理。所謂文件的meta data就是文件的相關(guān)屬性饭尝,以鍵值對(duì)(key valuepair)方式表示肯腕,如:width=1024献宫,其中的key為width钥平,value為1024。文件metadata是文件屬性列表姊途,可以包含多個(gè)鍵值對(duì)涉瘾。
跟蹤器和存儲(chǔ)節(jié)點(diǎn)都可以由一臺(tái)或多臺(tái)服務(wù)器構(gòu)成。跟蹤器和存儲(chǔ)節(jié)點(diǎn)中的服務(wù)器均可以隨時(shí)增加或下線而不會(huì)影響線上服務(wù)捷兰。其中跟蹤器中的所有服務(wù)器都是對(duì)等的立叛,可以根據(jù)服務(wù)器的壓力情況隨時(shí)增加或減少。
為了支持大容量贡茅,存儲(chǔ)節(jié)點(diǎn)(服務(wù)器)采用了分卷(或分組)的組織方式秘蛇。存儲(chǔ)系統(tǒng)由一個(gè)或多個(gè)卷組成,卷與卷之間的文件是相互獨(dú)立的顶考,所有卷的文件容量累加就是整個(gè)存儲(chǔ)系統(tǒng)中的文件容量赁还。一個(gè)卷可以由一臺(tái)或多臺(tái)存儲(chǔ)服務(wù)器組成,一個(gè)卷下的存儲(chǔ)服務(wù)器中的文件都是相同的驹沿,卷中的多臺(tái)存儲(chǔ)服務(wù)器起到了冗余備份和負(fù)載均衡的作用艘策。
在卷中增加服務(wù)器時(shí),同步已有的文件由系統(tǒng)自動(dòng)完成渊季,同步完成后朋蔫,系統(tǒng)自動(dòng)將新增服務(wù)器切換到線上提供服務(wù)。
當(dāng)存儲(chǔ)空間不足或即將耗盡時(shí)却汉,可以動(dòng)態(tài)添加卷驯妄。只需要增加一臺(tái)或多臺(tái)服務(wù)器,并將它們配置為一個(gè)新的卷合砂,這樣就擴(kuò)大了存儲(chǔ)系統(tǒng)的容量青扔。
FastDFS中的文件標(biāo)識(shí)分為兩個(gè)部分:卷名和文件名,二者缺一不可既穆。
上傳交互過程
- client 詢問 tracker 上傳到的 storage赎懦,不需要附加參數(shù)
- tracker 返回一臺(tái)可用的 storage
- client 直接和 storage 通訊完成文件上傳
下載交互過程
- client 詢問 tracker 下載文件的 storage,參數(shù)為文件標(biāo)識(shí)(卷名和文件名)
- tracker 返回一臺(tái)可用的 storage
- client 直接和 storage 通訊完成文件下載
需要說明的是幻工,client 為使用 FastDFS 服務(wù)的調(diào)用方励两,client 也應(yīng)該是一臺(tái)服務(wù)器,它對(duì) tracker 和 storage 的調(diào)用均為服務(wù)器間的調(diào)用囊颅。
FastDFS 為什么要結(jié)合 Nginx
我們?cè)谑褂?FastDFS 部署一個(gè)分布式文件系統(tǒng)的時(shí)候当悔,通過 FastDFS 的客戶端 API 來進(jìn)行文件的上傳傅瞻、下載、刪除等操作盲憎。同時(shí)通過 FastDFS 的 HTTP 服務(wù)器來提供 HTTP 服務(wù)嗅骄。但是 FastDFS 的 HTTP 服務(wù)較為簡單,無法提供負(fù)載均衡等高性能的服務(wù)饼疙,我們使用 FastDFS 的 Nginx 模塊來彌補(bǔ)這一缺陷溺森。
FastDFS 通過 Tracker 服務(wù)器,將文件放在 Storage 服務(wù)器存儲(chǔ),但是同組之間的服務(wù)器需要復(fù)制文件,有延遲的問題.假設(shè) Tracker 服務(wù)器將文件上傳到了 192.168.1.80,文件ID已經(jīng)返回客戶端,這時(shí),后臺(tái)會(huì)將這個(gè)文件復(fù)制到 192.168.1.30,如果復(fù)制沒有完成,客戶端就用這個(gè) ID 在 192.168.1.30 取文件,肯定會(huì)出現(xiàn)錯(cuò)誤。這個(gè) fastdfs-nginx-module 可以重定向連接到源服務(wù)器取文件,避免客戶端由于復(fù)制延遲的問題,出現(xiàn)錯(cuò)誤窑眯。
其他資源
- 源碼地址:https://github.com/happyfish100
- 下載地址:http://sourceforge.net/projects/fastdfs/files/
- 官方論壇:http://bbs.chinaunix.net/forum-240-1.html
FastDFS 安裝
我們基于 Docker 來安裝 FastDFS
環(huán)境準(zhǔn)備
所需全部環(huán)境配置文件已上傳至群中屏积,通過首頁掃碼加群下載即可
- libfastcommon.tar.gz
- fastdfs-5.11.tar.gz
- nginx-1.13.6.tar.gz
- fastdfs-nginx-module_v1.16.tar.gz
創(chuàng)建工作目錄
在 Linux 服務(wù)器上創(chuàng)建 /usr/local/docker/fastdfs/environmen
目錄
說明:
-
/usr/local/docker/fastdfs
:用于存放docker-compose.yml
配置文件及 FastDFS 的數(shù)據(jù)卷 -
/usr/local/docker/fastdfs/environmen
:用于存放Dockerfile
鏡像配置文件及 FastDFS 所需環(huán)境
docker-compose.yml
version: '3.1'
services:
fastdfs:
build: environment
restart: always
container_name: fastdfs
volumes:
- ./storage:/fastdfs/storage
network_mode: host
Dockerfile
FROM ubuntu:xenial
MAINTAINER topsale@vip.qq.com
# 更新數(shù)據(jù)源
WORKDIR /etc/apt
RUN echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse' > sources.list
RUN echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse' >> sources.list
RUN echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse' >> sources.list
RUN echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse' >> sources.list
RUN apt-get update
# 安裝依賴
RUN apt-get install make gcc libpcre3-dev zlib1g-dev --assume-yes
# 復(fù)制工具包
ADD fastdfs-5.11.tar.gz /usr/local/src
ADD fastdfs-nginx-module_v1.16.tar.gz /usr/local/src
ADD libfastcommon.tar.gz /usr/local/src
ADD nginx-1.13.6.tar.gz /usr/local/src
# 安裝 libfastcommon
WORKDIR /usr/local/src/libfastcommon
RUN ./make.sh && ./make.sh install
# 安裝 FastDFS
WORKDIR /usr/local/src/fastdfs-5.11
RUN ./make.sh && ./make.sh install
# 配置 FastDFS 跟蹤器
ADD tracker.conf /etc/fdfs
RUN mkdir -p /fastdfs/tracker
# 配置 FastDFS 存儲(chǔ)
ADD storage.conf /etc/fdfs
RUN mkdir -p /fastdfs/storage
# 配置 FastDFS 客戶端
ADD client.conf /etc/fdfs
# 配置 fastdfs-nginx-module
ADD config /usr/local/src/fastdfs-nginx-module/src
# FastDFS 與 Nginx 集成
WORKDIR /usr/local/src/nginx-1.13.6
RUN ./configure --add-module=/usr/local/src/fastdfs-nginx-module/src
RUN make && make install
ADD mod_fastdfs.conf /etc/fdfs
WORKDIR /usr/local/src/fastdfs-5.11/conf
RUN cp http.conf mime.types /etc/fdfs/
# 配置 Nginx
ADD nginx.conf /usr/local/nginx/conf
COPY entrypoint.sh /usr/local/bin/
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
WORKDIR /
EXPOSE 8888
CMD ["/bin/bash"]
entrypoint.sh
#!/bin/sh
/etc/init.d/fdfs_trackerd start
/etc/init.d/fdfs_storaged start
/usr/local/nginx/sbin/nginx -g 'daemon off;'
注:Shell 創(chuàng)建后是無法直接使用的,需要賦予執(zhí)行的權(quán)限磅甩,使用 chmod +x entrypoint.sh
命令
各種配置文件說明
tracker.conf
FastDFS 跟蹤器配置炊林,容器中路徑為:/etc/fdfs,修改為:
base_path=/fastdfs/tracker
storage.conf
FastDFS 存儲(chǔ)配置卷要,容器中路徑為:/etc/fdfs渣聚,修改為:
base_path=/fastdfs/storage
store_path0=/fastdfs/storage
tracker_server=192.168.75.128:22122
http.server_port=8888
client.conf
FastDFS 客戶端配置,容器中路徑為:/etc/fdfs僧叉,修改為:
base_path=/fastdfs/tracker
tracker_server=192.168.75.128:22122
config
fastdfs-nginx-module 配置文件奕枝,容器中路徑為:/usr/local/src/fastdfs-nginx-module/src,修改為:
# 修改前
CORE_INCS="$CORE_INCS /usr/local/include/fastdfs /usr/local/include/fastcommon/"
CORE_LIBS="$CORE_LIBS -L/usr/local/lib -lfastcommon -lfdfsclient"
# 修改后
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
CORE_LIBS="$CORE_LIBS -L/usr/lib -lfastcommon -lfdfsclient"
mod_fastdfs.conf
fastdfs-nginx-module 配置文件彪标,容器中路徑為:/usr/local/src/fastdfs-nginx-module/src倍权,修改為:
connect_timeout=10
tracker_server=192.168.75.128:22122
url_have_group_name = true
store_path0=/fastdfs/storage
nginx.conf
Nginx 配置文件,容器中路徑為:/usr/local/src/nginx-1.13.6/conf捞烟,修改為:
user root;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 8888;
server_name localhost;
location ~/group([0-9])/M00 {
ngx_fastdfs_module;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
啟動(dòng)容器
docker-compose up -d
測試上傳
交互式進(jìn)入容器
docker exec -it fastdfs /bin/bash
測試文件上傳
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /usr/local/src/fastdfs-5.11/INSTALL
服務(wù)器反饋上傳地址
group1/M00/00/00/wKhLi1oHVMCAT2vrAAAeSwu9TgM3976771
測試 Nginx 訪問
http://192.168.75.128:8888/group1/M00/00/00/wKhLi1oHVMCAT2vrAAAeSwu9TgM3976771