我在B站学习运维之FastDFS分布式的文件存储系统快速单机部署与主从部署(2)
全栈工程师修炼指南
2021年11月10日 23:09
收录于文集
共63篇

本章目录:

0x01 FastDFS 安装使用

  • 1.Linux 安装

    • 1.1) CentOS 单机部署 FastDFS

    • 1.2) Ubuntu 主从部署 FastDFS

  • 2.Docker 安装

    • 官方仓库fastDFS相关镜像

    • 自定义FastDFS基础镜像


0x01 FastDFS 安装使用

描述: FastDFS 是一个开源的高性能分布式文件系统 (DFS), 下面我们进行简单的安装配置使用。

1.Linux 安装

描述: 在Linux我们常用CentOS或者Ubuntu作为服务器进行安装和使用,下面我将分别在CentOS以及Ubuntu中进行安装FastDFS。

1.1) CentOS 单机部署 FastDFS

环境描述:

  • (1) 软件版本

  • (2) 磁盘目录准备: 创建数据和日志存储位置mkdir /home/fdfs以及所有安装包下载解压目录/usr/local/src

代码块
Shell
自动换行
复制代码
mkdir -vp /home/fdfs/{tracker,storage}
复制成功
  • (3) 服务器地址及其端口: 10.10.107.232 (22122 、8080 / 23000 / 8888)

安装步骤:

  • Step 1.编译安装libfatscommon、FastDFS、fastdfs-nginx-module三大件

代码块
Shell
自动换行
复制代码
# 安装 libfatscommon
git clone https://github.com/happyfish100/libfastcommon.git --depth 1
cd libfastcommon/ && ./make.sh && ./make.sh install

# 安装 FastDFS
git clone https://github.com/happyfish100/fastdfs.git --depth 1
cd fastdfs/ && ./make.sh && ./make.sh install
# FastDFS 配置文件准备
cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf # fastdfs tracker 服务配置文件
cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf # fastdfs storage 服务配置文件
cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf   #客户端文件,测试用
cp /usr/local/src/fastdfs/conf/http.conf /etc/fdfs/     #供nginx访问使用
cp /usr/local/src/fastdfs/conf/mime.types /etc/fdfs/    #供nginx访问使用

# 安装下载 fastdfs-nginx-module 并将配置文件复制到 /etc/fdfs/etc/fdfs
git clone https://github.com/happyfish100/fastdfs-nginx-module.git --depth 1
cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs
复制成功

Tips :  模块是自定义的nginx模块,FastDFS 通过 Tracker 服务器,将文件放在 Storage 服务器存储,但是同组存储服务器之间需要进行文件复制,有同步延迟的问题。假设 Tracker 服务器将文件上传到了 10.10.107.234,上传成功后文件 ID已经返回给客户端。时 FastDFS 存储集群机制会将这个文件同步到同组存储 10.10.107.235,在文件还没有复制完成的情况下,客户端如果用这个文件 ID 在 10.10.107.234 上取文件,就会出现文件无法访问的错误。而该模块可以重定向文件链接到源服务器取文件,避免客户端由于复制延迟导致的文件无法访问错误。

  • Step 2.编译安装 nginx (原来测试时此处非最新版本1.15.4)

代码块
Shell
自动换行
复制代码
wget http://nginx.org/download/nginx-1.15.4.tar.gz && tar -zxvf nginx-1.15.4.tar.gz
cd nginx-1.15.4/
#添加fastdfs-nginx-module模块
./configure --prefix=/usr/local/nginx --add-module=/usr/local/src/fastdfs-nginx-module/src
#编译安装
make && make install
复制成功

  • Step 3.FastDFS单机部署流程,对于我的使用场景只是做一个文件服务器,所以无需部署分布式集群,我们将 tracker 服务、storage 服务、 nginx 服务 部署在一台机器上就能完全满足系统的需求。

代码块
Shell
自动换行
复制代码
# 1.tracker配置
$vim /etc/fdfs/tracker.conf
#启用配置文件
disabled=false   
#设置tracker的端口号        
port=22122
#设置tracker的数据文件和日志目录(需预先创建)
base_path=/home/fdfs/tracker 
 #设置http端口号  
http.server_port=8080


# 2.storage配置
$vim /etc/fdfs/storage.conf
# storage服务端口
port=23000
# 数据和日志文件存储根目录
base_path=/home/dfs/storage
# 第一个存储目录
store_path0=/home/dfs/storage
# tracker服务器IP和端口
tracker_server=10.10.107.232:22122
# http访问文件的端口,和nginx中保持一致
http.server_port=8888


# 3.client 配置
$vim /etc/fdfs/client.conf
# 路径要和 storage 服务器相同 
base_path=/home/dfs
# tracker 服务器 IP 和端口
tracker_server=10.10.107.232:22122

# 4.ngx_fastdfs_module模块与Nginx配置
$vim /etc/fdfs/mod_fastdfs.conf
# tracker服务器IP和端口
tracker_server=10.10.107.232:22122
# URL是否带有group_name组名称
url_have_group_name=true
# storage 数据目录
store_path0=/home/fdfs/storage

$ # - 配置nginx.config - #
# 添加如下配置
server {
  listen       8888;      # 该端口为storage.conf中的http.server_port相同
  server_name  localhost;

  # 方式1.ngx_fastdfs_module模块加载使用
  location ~/group[0-9]/ {
    ngx_fastdfs_module;
  }

  # 方式2.添加如下行,将 /group1/M00 指定要或者映射到 /home/dfs/storage/data
  # location ~/group([0-9])/M00 {
  #   root  /home/dfs/storage/data;
  #   # alias /home/dfs/storage/data;
  # }

  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
    root   html;
  }
}
复制成功

  • Step 4.防火墙规则设置

代码块
Shell
自动换行
复制代码
# Tracker
iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 22122 -j ACCEP
# Storage
iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 23000 -j ACCEP
# Nginx
iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 8888 -j ACCEP
复制成功

  • Step 5.tracker、storage、nginx 服务启动 (注意启动顺序)

代码块
Shell
自动换行
复制代码
# tracker 服务启动
/etc/init.d/fdfs_trackerd [start|restart|stop]   # 启动/重启动/停止tracker服务
chkconfig fdfs_trackerd on                       # 自启动tracker服务
service fdfs_trackerd start

# storage 服务启动
/etc/init.d/fdfs_storaged start|restart|stop  # 启动/重启动/停止storage服务
chkconfig fdfs_storaged on                    #自启动storage服务
service fdfs_storaged start

# nginx 服务启动
/usr/local/nginx/sbin/nginx           # 启动nginx
/usr/local/nginx/sbin/nginx -s reload # 重启nginx
/usr/local/nginx/sbin/nginx -s stop   # 停止nginx
复制成功

  • Step 6.启动完上面的服务之后,我们可以进行上传测试。

代码块
Shell
自动换行
复制代码
# 保存后测试,返回ID表示成功 如:group1/M00/00/00/xx.tar.gz
fdfs_upload_file /etc/fdfs/client.conf /usr/local/src/nginx-1.15.4.tar.gz
group1/M00/00/00/wKgAQ1pysxmAaqhAAA76tz-dVgg.tar.gz

# 测试下载,用外部浏览器访问刚才已传过的nginx安装包,引用返回的ID
http://10.10.107.232:8888/group1/M00/00/00/wKgAQ1pysxmAaqhAAA76tz-dVgg.tar.gz
复制成功

附录编译安装Shell脚本: (有fastdfs项目的改变自己需要进行修改)

代码块
Shell
自动换行
复制代码
#!/bin/bash
# data: 2019-07-23
# for: install FastDFS on CentOS7
# 安装编译依赖
yum install git gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl-devel wget  -y

cd /usr/local/src
git clone https://github.com/happyfish100/libfastcommon.git --depth 1
cd libfastcommon/
./make.sh && ./make.sh install

cd ../
git clone https://github.com/happyfish100/fastdfs.git --depth 1
cd fastdfs/
./make.sh && ./make.sh install

# 配置文件准备
cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
cp /usr/local/src/fastdfs/conf/http.conf /etc/fdfs/
cp /usr/local/src/fastdfs/conf/mime.types /etc/fdfs/

cd ../
git clone https://github.com/happyfish100/fastdfs-nginx-module.git --depth 1
cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs

# 编译安装 nginx
cd../
wget http://nginx.org/download/nginx-1.15.4.tar.gz
tar -zxvf nginx-1.15.4.tar.gz
cd nginx-1.15.4/
./configure --add-module=/usr/local/src/fastdfs-nginx-module/src/
make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
复制成功

至此使用Ubuntu安装FastDFS完毕!

1.2) Ubuntu 主从部署 FastDFS

描述: 在CentOS我们是进行的单机部署,此处我们采用两台机器进行FastDFS集群的配置部署,

storage 集群配置两种方式:

  • (1) Multiple volume : 如果为单个group配置多个storage的话,指定相同的group_name即可,此时拥有相同的组名的机器将会有一台被选为主,于此同时有几个节点将会有几个副本。

  • (2) Multiple group : 如果group_name配置不同即为创建不同的组,此处每个group下的storage都是单独的个体,个个都是主。

环境说明:

  • 操作系统以及网络地址

  • 软件版本一览

    • Fastdfs : 6.07

    • Nginx : 1.21.1

安装部署:

Step 1.基础环境准备Fastdfs数据目录以及执行用户创建、和机器别名(两台都要执行)。

代码块
Shell
自动换行
复制代码
# 1.软件仓库更新以及依赖下载
sudo apt-get update 
sudo apt-get install git wget gcc make automake autoconf libtool libpcre3 libpcre3-dev zlib1g-dev build-essential

# 2.fastdfs 运行用户创建以及家目录创建。
# 此处巍峨采用普通用户运行fasfdfs以及nginx,为了安全考虑非常建议。
groupadd fdfs && useradd -m -d /home/fdfs -g fdfs fdfs

# 3.分别创建服务和数据存储目录
mkdir -vp /home/fdfs/{storage,tracker,client}

# 4.机器别名
tee -a /etc/hosts <<'EOF'
10.10.107.225 file1.weiyigeek.top
10.10.107.226 file2.weiyigeek.top
EOF
复制成功

Step 2.从Github上拉取Fastdfs相关项目和依赖到本地、进行编译安装。

代码块
Shell
自动换行
复制代码
# 1.拉取Github代码仓库中Fastdfs ( --depth 1 用于指定克隆深度,为1即表示只克隆最近一次commit的代码,减少下载时间和存储空间)
git clone https://github.com/happyfish100/libfastcommon.git --depth 1 \
&& git clone https://github.com/happyfish100/fastdfs.git --depth 1    \
&& git clone https://github.com/happyfish100/fastdfs-nginx-module.git --depth 1

# 2.编译安装
cd libfastcommon && ./make.sh && ./make.sh install
cd ../fastdfs && ./make.sh && ./make.sh install

# 3.配置文件复制
cp /usr/local/src/fastdfs/conf/http.conf  /etc/fdfs/   # fastdfs-nginx-module模块自配置文件供nginx访问使用
cp /usr/local/src/fastdfs/conf/mime.types /etc/fdfs/   # fastdfs-nginx-module模块自配置文件供nginx访问使用
cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/  # mod_fastdfs.conf 模块自配置文件

# 4.备份配置文件
cp /etc/fdfs/storage.conf /etc/fdfs/storage.conf-bak   
cp /etc/fdfs/tracker.conf /etc/fdfs/tracker.conf-bak
cp /etc/fdfs/client.conf  /etc/fdfs/client.conf-bak
cp /etc/fdfs/mod_fastdfs.conf  /etc/fdfs/mod_fastdfs.conf-bak
复制成功

Step 3.Nginx 负载均衡服务器编译安装

代码块
Shell
自动换行
复制代码
# nginx 源码下载
wget http://nginx.org/download/nginx-1.20.1.tar.gz -O /usr/local/src
cd /usr/local/src && tar -zxvf nginx-1.20.1.tar.gz -C .

# 查看 fastdfs-nginx-module 中的文件
$ ls /usr/local/src/fastdfs-nginx-module/src
common.c  common.h  config  mod_fastdfs.conf  ngx_http_fastdfs_module.c

# 编译安装 Nginx (此处我们指定了执行用户为fdfs是为了安全采用最小权限执行) , 此处未添加SSL支持如需要请百度,在编译时加入openssl功能。
cd ../nginx-1.20.1/
./configure --prefix=/usr/local/nginx \
--user=fdfs \
--group=fdfs \
--pid-path=/usr/local/nginx/logs/nginx.pid \
--add-module=/usr/local/src/fastdfs-nginx-module/src
make && make install
复制成功

Step 4.为Tracker 、Storage 、Nginx 配置systemd管理的服务(6.07 默认生成的services服务文件启动时会卡在systemctl界面,我们需要进行更改其systemd服务文件)。

代码块
Shell
自动换行
复制代码
# 1.命令行替方式 (注意以下配置的路径是与后续在配置中配置路径强关联)
# sed -i 's/Type=forking/&\nUser=fdfs\nGroup=fdfs/' /lib/systemd/system/fdfs_storaged.service
# sed -i 's#/opt/fastcfs/data#/home/fdfs/storage/data#g' /lib/systemd/system/fdfs_storaged.service
# sed -i '/PIDFile/i WorkingDirectory=/home/fdfs/storage' /lib/systemd/system/fdfs_storaged.service
# sed -i '/ExecStop/a ExecReload=/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart' /lib/systemd/system/fdfs_storaged.service


# 2.service 替换方式
# /lib/systemd/system/fdfs_trackerd.service
cat > /lib/systemd/system/fdfs_trackerd.service <<'EOF'
[Unit]
Description=FastDFS trackerd service
After=network-online.target

[Service]
Type=forking
# User=fdfs
# Group=fdfs
WorkingDirectory=/home/fdfs/tracker
PIDFile=/home/fdfs/tracker/data/fdfs_trackerd.pid
ExecStart=/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start
ExecStop=/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf stop
ExecReload=/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart

# No artificial start/stop timeout
TimeoutSec=3

# Disable OOM kill by Linux kernel
OOMScoreAdjust=-1000

[Install]
WantedBy=multi-user.target
EOF


# /lib/systemd/system/fdfs_storaged.service
cat > /lib/systemd/system/fdfs_storaged.service <<'EOF'
[Unit]
Description=FastDFS storaged service
After=network-online.target

[Service]
Type=forking
# User=fdfs
# Group=fdfs
WorkingDirectory=/home/fdfs/storage
PIDFile=/home/fdfs/storage/data/fdfs_storaged.pid
ExecStart=/usr/bin/fdfs_storaged /etc/fdfs/storage.conf start
ExecStop=/usr/bin/fdfs_storaged /etc/fdfs/storage.conf stop
ExecReload=/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart

# No artificial start/stop timeout
TimeoutSec=3

# Disable OOM kill by Linux kernel
OOMScoreAdjust=-1000

[Install]
WantedBy=multi-user.target
EOF

# /usr/lib/systemd/system/nginx.service
tee /usr/lib/systemd/system/nginx.service<<'EOF'
[Unit]
Description=Nginx - high performance web server service
Documentation=http://nginx.org/en/docs/ 
After=network-online.target remote-fs.target nss-lookup.target 
Wants=network-online.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID

[Install]
WantedBy=multi-user.target
EOF

# 3.老规矩重载systemd使编辑的service生效
systemctl daemon-reload

# 4.此处我们暂时不启用服务,我们还需进行后续的配置
systemctl stop fdfs_storaged.service fdfs_trackerd.service nginx.service
systemctl status fdfs_storaged.service fdfs_trackerd.service nginx.service
复制成功
代码块
Shell
自动换行
复制代码
#Tips : 非常注意 Tracker 、Storage 生成的pid的路径分别为/home/fdfs/tracker/data/fdfs_trackerd.pid和/home/fdfs/storage/data/fdfs_storaged.pid
复制成功
  • Step 5.两台机器的Tracker服务主要配置。

代码块
Shell
自动换行
复制代码
$vim /etc/fdfs/tracker.conf


# - Master 端- #
# 是否禁用配置文件 (当然False了)
disabled = false
# 绑定指定监听的网卡地址否则留空则为全部网卡。
bind_addr = 10.10.107.225
# tracker 服务端口
port = 22122
# tracker 服务data和logs存储目录 (可以分开也可以全部设置storage中)
# sed -i "s#/home/yuqing/fastdfs#/home/fdfs/tracker#g" /etc/fdfs/tracker.conf
base_path = /home/fdfs/tracker
# 为系统或其他应用程序保留的存储空间。
reserved_storage_space = 10%
# 指定用户运行 tracker 服务
run_by_user = fdfs
run_by_group = fdfs
# 指定访问白名单默认所有都可访问 (正式环境一定要设置)
allow_hosts = *


# - Slave 端- #
disabled = false
bind_addr = 10.10.107.226   # 不同点
port = 22122
base_path = /home/fdfs/tracker
reserved_storage_space = 10%
run_by_user = fdfs
run_by_group = fdfs
allow_hosts = *
复制成功
  • Step 6.两台机器的Storage服务主要配置。

  • Step 7.两台机器的client.conf主要配置, 可选配置如果Master与Slave的机器只是作为存储而非fastdfs时此处可以省略,此处假设使用Master 端作为fastdfs客户端进行上传文件进行测试。

  • Step 8.两台机器的mod_fastdfs模块主要配置, 可选配置如果Master与Slave的机器只是作为存储而非web服务器时此处可以省略。

  • Step 8.两台机器的nginx.conf配置,可选配置如果Master与Slave的机器只是作为存储而非web服务器时此处可以省略。

  • Step 9.设置目录所属权限以及防火墙规则设置。

  • Step 10.分别启动两台主机中tracker、storage、nginx三个服务。

  • Step 11.fastdfs 主从同步状态以及节点监控。

  • Step 12.进行 fastdfs 服务验证我们准备如下文件进行上传测试。

  • Step 13.Tracker 与 storage 服务数据存储目录结构说明,当前面两个服务运行时将会自动创建data、logs这个两个目录:

  • 下面以 FastDFS 的官方 Dockerfile 示例(https://github.com/happyfish100/fastdfs/blob/52ac538a71fc9753c9dbcd4c75f581e9402f39a5/docker/dockerfile_local/Dockerfile)

代码块
Shell
自动换行
复制代码
# centos 7
FROM centos:7
# 添加配置文件
# add profiles
ADD conf/client.conf /etc/fdfs/
ADD conf/http.conf /etc/fdfs/
ADD conf/mime.types /etc/fdfs/
ADD conf/storage.conf /etc/fdfs/
ADD conf/tracker.conf /etc/fdfs/
ADD fastdfs.sh /home
ADD conf/nginx.conf /etc/fdfs/
ADD conf/mod_fastdfs.conf /etc/fdfs

# 添加源文件
# add source code
ADD source/libfastcommon.tar.gz /usr/local/src/
ADD source/fastdfs.tar.gz /usr/local/src/
ADD source/fastdfs-nginx-module.tar.gz /usr/local/src/
ADD source/nginx-1.15.4.tar.gz /usr/local/src/

# Run
RUN yum install git gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl-devel wget vim -y \
  &&  mkdir /home/dfs   \
  &&  cd /usr/local/src/  \
  &&  cd libfastcommon/   \
  &&  ./make.sh && ./make.sh install  \
  &&  cd ../  \
  &&  cd fastdfs/   \
  &&  ./make.sh && ./make.sh install  \
  &&  cd ../  \
  &&  cd nginx-1.15.4/  \
  &&  ./configure --add-module=/usr/local/src/fastdfs-nginx-module/src/   \
  &&  make && make install  \
  &&  chmod +x /home/fastdfs.sh
# export config
VOLUME /etc/fdfs

EXPOSE 22122 23000 8888 80
ENTRYPOINT ["/home/fastdfs.sh"]
复制成功
  • 优化后的 Dockerfile 参考

代码块
Shell
自动换行
复制代码
FROM alpine:3.10

RUN set -x \
    && echo "http://mirrors.aliyun.com/alpine/latest-stable/main/" > /etc/apk/repositories \
    && echo "http://mirrors.aliyun.com/alpine/latest-stable/community/" >> /etc/apk/repositories \
    && apk update \
    && apk add --no-cache --virtual .build-deps gcc libc-dev make perl-dev openssl-dev pcre-dev zlib-dev git \
    && mkdir -p /usr/local/src \
    && cd /usr/local/src \
    && git clone https://github.com/happyfish100/libfastcommon.git --depth 1 \
    && git clone https://github.com/happyfish100/fastdfs.git --depth 1    \
    && git clone https://github.com/happyfish100/fastdfs-nginx-module.git --depth 1  \
    && wget http://nginx.org/download/nginx-1.15.4.tar.gz \
    && tar -xf nginx-1.15.4.tar.gz \
    && cd /usr/local/src/libfastcommon \
    && ./make.sh \
    && ./make.sh install \
    && cd /usr/local/src/fastdfs/ \
    && ./make.sh \
    && ./make.sh install \
    && cd /usr/local/src/nginx-1.15.4/ \
    && ./configure --add-module=/usr/local/src/fastdfs-nginx-module/src/ \
    && make && make install \
    && apk del .build-deps \
    && apk add --no-cache pcre-dev bash \
    && mkdir -p /home/dfs  \
    && mv /usr/local/src/fastdfs/docker/dockerfile_network/fastdfs.sh /home \
    && mv /usr/local/src/fastdfs/docker/dockerfile_network/conf/* /etc/fdfs \
    && chmod +x /home/fastdfs.sh 
    # && rm -rf /usr/local/src*
VOLUME /home/dfs
EXPOSE 22122 23000 8888 8080
CMD ["/home/fastdfs.sh"]
复制成功


从错误中比从混乱中易于发现真理。