分布式文件系统 FastDFS 服务端的部署

Posted by 暮夏有五 on 2020-12-23
Estimated Reading Time 7 Minutes
Words 1.8k In Total
Viewed Times

FastDFS 简介

FastDFS 服务端有两个角色:跟踪器tracker)和存储节点storage)。跟踪器主要做调度工作,在访问上起负载均衡的作用;存储节点存储文件,完成文件管理的所有功能。

FastDFS 同时对文件的 metadata 进行管理。所谓文件的 metadata 就是文件的相关属性,以键值对方式表示,如:width=1024,其中的 key 为 width,value 为 1024。文件 metadata 是文件属性列表,可以包含多个键值对。

跟踪器和存储节点都可以由一台或多台服务器构成。跟踪器和存储节点中的服务器均可以随时增加或下线而不会影响线上服务。其中跟踪器中的所有服务器都是对等的,可以根据服务器的压力情况随时增加或减少。

为了支持大容量,存储节点(服务器)采用了 分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。

在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。

当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。

FastDFS 中的文件标识分为两个部分:卷名文件名,二者缺一不可。

文件交互过程

上传交互过程

  1. client 询问 tracker 上传到的 storage,不需要附加参数;
  2. tracker 返回一台可用的 storage
  3. client 直接和 storage 通讯完成文件上传。

下载交互过程

  1. client 询问 tracker 下载文件的 storage,参数为文件标识(卷名和文件名);
  2. tracker 返回一台可用的 storage
  3. client 直接和 storage 通讯完成文件下载。

FastDFS 为什么要结合 Nginx

我们在使用 FastDFS 部署一个分布式文件系统的时候,通过 FastDFS 的客户端 API 来进行文件的上传、下载、删除等操作。同时通过 FastDFS 的 HTTP 服务器来提供 HTTP 服务。但是 FastDFS 的 HTTP 服务较为简单,无法提供负载均衡等高性能的服务,我们使用 FastDFSNginx 模块来弥补这一缺陷。

FastDFS 通过 tracker 服务器,将文件放在 Storage 服务器存储,但是同组之间的服务器需要复制文件,有延迟的问题。假设 tracker 服务器将文件上传到了 192.168.1.100,文件 ID 已经返回客户端,这时后台会将这个文件复制到 192.168.1.100,如果复制没有完成,客户端就用这个 ID 在 192.168.1.100 取文件,肯定会出现错误。而 fastdfs-nginx-module 可以重定向连接到源服务器取文件,避免客户端由于复制延迟的问题出现错误。

部署 FastDFS 服务端

服务器地址:192.168.1.100

所需环境配置文件已上传至百度网盘。

提取链接:https://pan.baidu.com/s/1ptM7psDH9IJuH4P7Cd0L9A

提取码:qdxe

在 Linux 服务器上创建 /usr/local/docker/fastdfs 目录和 /usr/local/docker/fastdfs/environment 目录

目录说明:

  • /usr/local/docker/fastdfs:用于存放 docker-compose.yml 文件和 FastDFS 的数据卷。
  • /usr/local/docker/fastdfs/environment:用于存放 Dockerfile 文件和刚刚提取的环境文件。

注意:因为 Shell 创建后是无法直接使用的,所以将 entrypoint.sh 文件拷贝到服务器目录里以后,需要赋予执行的权限,执行以下命令:

1
$ chmod +x entrypoint.sh

各环境配置文件说明

tracker.conf

FastDFS 跟踪器配置,容器中路径为:/etc/fdfs,修改以下配置:

1
base_path=/fastdfs/tracker
storage.conf

FastDFS 存储配置,容器中路径为:/etc/fdfs,修改以下配置:

1
2
3
4
base_path=/fastdfs/storage
store_path0=/fastdfs/storage
tracker_server=192.168.1.100:22122
http.server_port=8888
client.conf

FastDFS 客户端配置,容器中路径为:/etc/fdfs,修改以下配置:

1
2
base_path=/fastdfs/tracker
tracker_server=192.168.1.100:22122
config

fastdfs-nginx-module 配置文件,容器中路径为:/usr/local/src/fastdfs-nginx-module/src,修改以下配置:

1
2
3
4
5
6
7
# 修改前
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,修改以下配置:

1
2
3
4
connect_timeout=10
tracker_server=192.168.1.100:22122
url_have_group_name = true
store_path0=/fastdfs/storage
nginx.conf

Nginx 配置文件,容器中路径为:/usr/local/src/nginx-1.13.6/conf,完整配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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;
}
}
}

Dockerfile

/usr/local/docker/fastdfs/environment 目录下创建 Dockerfile 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
FROM ubuntu:xenial
MAINTAINER antoniopeng@foxmail.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"]

docker-compose.yml

/usr/local/docker/fastdfs/environment 目录下创建 docker-compose.yml 文件:

1
2
3
4
5
6
7
8
9
version: '3.1'
services:
fastdfs:
build: environment
restart: always
container_name: fastdfs
volumes:
- ./storage:/fastdfs/storage
network_mode: host

启动容器

1
$ docker-compose up -d

服务端上传文件

1
2
3
4
5
6
# 交互式进入容器
$ 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/wKhLi1oHVMCAT2vrAAAeSwu9TgM3976771

结合服务器反馈的信息,得出文件上传后地址为:http://192.168.1.100:8888/group1/M00/00/00/wKhLi1oHVMCAT2vrAAAeSwu9TgM3976771


If you like this blog or find it useful for you, you are welcome to comment on it. You are also welcome to share this blog, so that more people can participate in it. If the images used in the blog infringe your copyright, please contact the author to delete them. Thank you !