基於 Docker 來安裝 FastDFS

百度百科

參考百度百科

FastDFS是一個開源的輕量級分佈式文件系統,它對文件進行管理,功能包括:文件存儲、文件同步、文件訪問(文件上傳、文件下載)等,解決了大容量存儲和負載均衡的問題。特別適合以文件爲載體的在線服務,如相冊網站、視頻網站等等。

FastDFS爲互聯網量身定製,充分考慮了冗餘備份、負載均衡、線性擴容等機制,並注重高可用、高性能等指標,使用FastDFS很容易搭建一套高性能的文件服務器集羣提供文件上傳、下載等服務。

FastDFS 簡介

FastDFS服務端有兩個角色:跟蹤器(tracker)存儲節點(storage)跟蹤器主要做調度工作,在訪問上起負載均衡的作用。

存儲節點存儲文件,完成文件管理的所有功能:就是這樣的存儲、同步和提供存取接口,FastDFS同時對文件的metadata進行管理。所謂文件的meta data就是文件的相關屬性,以鍵值對(key valuepair)方式表示,如:width=1024,其中的key爲width,value爲1024。文件metadata是文件屬性列表,可以包含多個鍵值對。

FastDFS 存儲策略

爲了支持大容量,存儲節點(服務器)採用了分卷(或分組)的組織方式。存儲系統由一個或多個卷組成,卷與卷之間的文件是相互獨立的,所有卷的文件容量累加就是整個存儲系統中的文件容量。一個卷可以由一臺或多臺存儲服務器組成,一個卷下的存儲服務器中的文件都是相同的,卷中的多臺存儲服務器起到了冗餘備份和負載均衡的作用。

在卷中增加服務器時,同步已有的文件由系統自動完成,同步完成後,系統自動將新增服務器切換到線上提供服務。當存儲空間不足或即將耗盡時,可以動態添加捲。只需要增加一臺或多臺服務器,並將它們配置爲一個新的卷,這樣就擴大了存儲系統的容量。

上傳交互過程

  • FastDFS向使用者提供基本文件訪問接口,比如upload、download、append、delete等,以客戶端庫的方式提供給用戶使用。

  • Storage Server會定期的向Tracker Server發送自己的存儲信息。當Tracker Server Cluster中的Tracker Server不止一個時,各個Tracker之間的關係是對等的,所以客戶端上傳時可以選擇任意一個Tracker。

  • 當Tracker收到客戶端上傳文件的請求時,會爲該文件分配一個可以存儲文件的group,當選定了group後就要決定給客戶端分配group中的哪一個storage server。當分配好storage server後,客戶端向storage發送寫文件請求,storage將會爲文件分配一個數據存儲目錄。然後爲文件分配一個fileid,最後根據以上的信息生成文件名存儲文件。
    在這裏插入圖片描述

下載交互過程

客戶端uploadfile成功後,會拿到一個storage生成的文件名,接下來客戶端根據這個文件名即可訪問到該文件。
在這裏插入圖片描述
跟upload file一樣,在downloadfile時客戶端可以選擇任意tracker server。tracker發送download請求給某個tracker,必須帶上文件名信息,tracke從文件名中解析出文件的group、大小、創建時間等信息,然後爲該請求選擇一個storage用來服務讀請求。

FastDFS的文件同步

寫文件時,客戶端將文件寫至group內一個storage server即認爲寫文件成功,storage server寫完文件後,會由後臺線程將文件同步至同group內其他的storage server。

每個storage寫文件後,同時會寫一份binlog,binlog裏不包含文件數據,只包含文件名等元信息,這份binlog用於後臺同步,storage會記錄向group內其他storage同步的進度,以便重啓後能接上次的進度繼續同步;進度以時間戳的方式進行記錄,所以最好能保證集羣內所有server的時鐘保持同步。

storage的同步進度會作爲元數據的一部分彙報到tracker上,tracke在選擇讀storage的時候會以同步進度作爲參考。

FastDFS 爲什麼要結合 Nginx

我們在使用 FastDFS 部署一個分佈式文件系統的時候,通過 FastDFS 的客戶端 API 來進行文件的上傳、下載、刪除等操作。同時通過 FastDFS 的 HTTP 服務器來提供 HTTP 服務。但是 FastDFS 的 HTTP 服務較爲簡單,無法提供負載均衡等高性能的服務,我們使用 FastDFS 的 Nginx 模塊來彌補這一缺陷。

FastDFS 通過 Tracker 服務器,將文件放在 Storage 服務器存儲,但是同組之間的服務器需要複製文件,有延遲的問題.假設 Tracker 服務器將文件上傳到了 192.168.1.80,文件ID已經返回客戶端,這時,後臺會將這個文件複製到 192.168.1.30,如果複製沒有完成,客戶端就用這個 ID 在 192.168.1.30 取文件,肯定會出現錯誤。這個 fastdfs-nginx-module 可以重定向連接到源服務器取文件,避免客戶端由於複製延遲的問題,出現錯誤。

其他資源

FastDFS 安裝

我們基於 Docker 來安裝 FastDFS

環境準備

  • libfastcommon.tar.gz
  • fastdfs-5.11.tar.gz
  • nginx-1.13.6.tar.gz
  • fastdfs-nginx-module_v1.16.tar.gz

創建工作目錄

在 Linux 服務器上創建 /usr/local/docker/fastdfs/environment 目錄

說明:

  • /usr/local/docker/fastdfs:用於存放 docker-compose.yml 配置文件及 FastDFS 的數據卷
  • /usr/local/docker/fastdfs/environment:用於存放 Dockerfile 鏡像配置文件及 FastDFS 所需環境

docker-compose.yml

version: '2.0'
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

# 更新數據源
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

# 複製工具包
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 存儲
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 創建後是無法直接使用的,需要賦予執行的權限,使用 chmod +x entrypoint.sh 命令

各種配置文件說明

tracker.conf

FastDFS 跟蹤器配置,容器中路徑爲:/etc/fdfs,修改爲:

base_path=/fastdfs/tracker

storage.conf

FastDFS 存儲配置,容器中路徑爲:/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;
        }
    }
}

最終目錄結構爲
在這裏插入圖片描述
在這裏插入圖片描述

創建容器

docker-compose build

啓動容器

docker-compose up -d

測試上傳

交互式進入容器

docker exec -it fastdfs /bin/bash

測試文件上傳

/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /usr/local/src/fastdfs-5.11/INSTALL

服務器反饋上傳地址

group1/M00/00/00/rBkAAV0BEBGAJ4M-AAAeSwu9TgM5076993

測試 Nginx 訪問

http://172.25.0.1:8888/group1/M00/00/00/rBkAAV0BEBGAJ4M-AAAeSwu9TgM5076993
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章