Docker+Nginx+FastDFS分布式文件系统搭建

FastDFS介绍


1.1   什么是FastDFS

FastDFS是用c语言编写的一款开源的分布式文件系统。FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。

1.2   FastDFS架构

FastDFS架构包括 Tracker server和Storage server。客户端请求Tracker server进行文件上传、下载,通过Trackerserver调度最终由Storage server完成文件上传和下载。

Trackerserver作用是负载均衡和调度,通过Trackerserver在文件上传时可以根据一些策略找到Storageserver提供文件上传服务。可以将tracker称为追踪服务器或调度服务器。

Storageserver作用是文件存储,客户端上传的文件最终存储在Storage服务器上,Storage server没有实现自己的文件系统而是利用操作系统 的文件系统来管理文件。可以将storage称为存储服务器。

Tracker 集群

FastDFS集群中的Trackerserver可以有多台,Trackerserver之间是相互平等关系同时提供服务,Trackerserver不存在单点故障。客户端请求Trackerserver采用轮询方式,如果请求的tracker无法提供服务则换另一个tracker。

Storage 集群

Storage集群采用了分组存储方式。storage集群由一个或多个组构成,集群存储总容量为集群中所有组的存储容量之和。一个组由一台或多台存储服务器组成,组内的Storage server之间是平等关系,不同组的Storageserver之间不会相互通信,同组内的Storageserver之间会相互连接进行文件同步,从而保证同组内每个storage上的文件完全一致的。一个组的存储容量为该组内存储服务器容量最小的那个,由此可见组内存储服务器的软硬件配置最好是一致的。

采用分组存储方式的好处是灵活、可控性较强。比如上传文件时,可以由客户端直接指定上传到的组也可以由tracker进行调度选择。一个分组的存储服务器访问压力较大时,可以在该组增加存储服务器来扩充服务能力(纵向扩容)。当系统容量不足时,可以增加组来扩充存储容量(横向扩容)。

搭建FastDFS文件系统


准备工作-关闭防火墙

$ systemctl stop firewalld & systemctl disable firewalld

$ vim /etc/sysconfig/selinux
  
  SELINUX=disabled

准备工作-编译环境(FastDFS是C语言开发,安装FastDFS需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,需要安装gcc)

$ yum install git gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl-devel wget vim -y

准备工作-Git

$ yum install git

1.下载镜像

$ docker search fastdfs

$ docker pull season/fastdfs

2.创建文件存储目录

$ mkdir -p /data/fdfs

3.安装libfatscommon

$ git clone https://github.com/happyfish100/libfastcommon.git --depth 1

$ cd libfastcommon/

$ ./make.sh && ./make.sh install #编译安装

4.安装FastDFS

$ git clone https://github.com/happyfish100/fastdfs.git --depth 1

$ cd fastdfs/

$ ./make.sh && ./make.sh install #编译安装

5.安装fastdfs-nginx-module

$ git clone https://github.com/happyfish100/fastdfs-nginx-module.git --depth 1

6.安装Nginx

$ wget http://nginx.org/download/nginx-1.15.4.tar.gz #下载nginx压缩包

$ tar -zxvf nginx-1.15.4.tar.gz #解压

$ cd nginx-1.15.4/

#添加fastdfs-nginx-module模块
$ ./configure --add-module=/data/fdfs/fastdfs-nginx-module/src/ 

$ make && make install #编译安装

$ cd /usr/local 查看nginx是否安装成功,成功则显示nginx目录

7.创建FastDFS存储目录

$ mkdir -p /data/fdfs/{tracker_data,storage_data,store_path,fdfs_conf}

8.启动一个临时的tracker 拷贝storage.conf tracker.conf 至/var/fdfs/fdfs_conf

docker run  -d --name tracker  --net=host season/fastdfs tracker
docker ps 

//查询到容器id
docker cp 容器ID:/fdfs_conf/tracker.conf /data/fdfs/fdfs_conf/
docker cp 容器ID:/fdfs_conf/storage.conf /data/fdfs/fdfs_conf/

9.单机配置

tracker配置

$ vim /etc/fdfs/tracker.conf
#需要修改的内容如下
port=22122  # tracker服务器端口(默认22122,一般不修改)
base_path=/data/fdfs/tracker_data  # 存储日志和数据的根目录
storage配置

$ vim /etc/fdfs/storage.conf
#需要修改的内容如下
port=23000  # storage服务端口(默认23000,一般不修改)
base_path=/data/fdfs/store_path  # 数据和日志文件存储根目录
store_path0=/data/fdfs/store_path # 第一个存储目录
tracker_server=192.168.199.120:22122  # tracker服务器IP和端口
http.server_port=80  # http访问文件的端口(默认8888,看情况修改,和nginx中保持一致)
client测试

vim /etc/fdfs/client.conf
#需要修改的内容如下
base_path=/data/fdfs/store_path
tracker_server=192.168.199.120:22122    #tracker服务器IP和端口
#保存后测试,返回ID表示成功 如:group1/M00/00/00/xx.tar.gz
fdfs_upload_file /etc/fdfs/client.conf /usr/local/src/nginx-1.15.4.tar.gz
配置nginx访问

vim /etc/fdfs/mod_fastdfs.conf
#需要修改的内容如下
tracker_server=192.168.199.120:22122  #tracker服务器IP和端口
url_have_group_name=true #是否使用group_name为前缀
store_path0=/data/fdfs/store_path

#配置nginx.config
vim /usr/local/nginx/conf/nginx.conf
#添加如下配置
user root;              ##配置访问权限

server {
    listen       80;    ## 该端口为storage.conf中的http.server_port相同
    server_name  192.168.199.120;
    # location ~/group[0-9]/ {
      location ~/kongqi/{
        root /data/fdfs/storage_path/data;
        ngx_fastdfs_module;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
    root   html;
    }
}

10.分布式部署

tracker配置

vim /etc/fdfs/tracker.conf
#需要修改的内容如下
port=22122  # tracker服务器端口(默认22122,一般不修改)
base_path=/data/fdfs/tracker_data  # 存储日志和数据的根目录
storage配置

vim /etc/fdfs/storage.conf
#需要修改的内容如下
port=23000  # storage服务端口(默认23000,一般不修改)
base_path=/data/fdfs/store_path  # 数据和日志文件存储根目录
store_path0=/data/fdfs/store_path # 第一个存储目录
tracker_server=192.168.199.120:22122  # 服务器1
tracker_server=192.168.199.121:22122  # 服务器2
tracker_server=192.168.199.122:22122  # 服务器3
http.server_port=80  # http访问文件的端口(默认8888,看情况修改,和nginx中保持一致)
client测试

vim /etc/fdfs/client.conf
#需要修改的内容如下
base_path=/data/fdfs/store_path  # 数据和日志文件存储根目录
tracker_server=192.168.199.120:22122  # 服务器1
tracker_server=192.168.199.121:22122  # 服务器2
tracker_server=192.168.199.122:22122  # 服务器3
#保存后测试,返回ID表示成功 如:group1/M00/00/00/xx.tar.gz
fdfs_upload_file /etc/fdfs/client.conf /usr/local/src/nginx-1.15.4.tar.gz
配置nginx访问

vim /etc/fdfs/mod_fastdfs.conf
#需要修改的内容如下
tracker_server=192.168.199.120:22122  # 服务器1
tracker_server=192.168.199.121:22122  # 服务器2
tracker_server=192.168.199.122:22122  # 服务器3
url_have_group_name=true
store_path0=/data/fdfs/store_path # 第一个存储目录

#配置nginx.config
vim /usr/local/nginx/conf/nginx.conf
#添加如下配置
user root;              ##配置访问权限

server {
    listen       80;    ## 该端口为storage.conf中的http.server_port相同
    server_name  192.168.199.120;
    # location ~/group[0-9]/ {
      location ~/kongqi/{
        root /data/fdfs/storage_path/data;
        ngx_fastdfs_module;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
    root   html;
    }
}

11.编写配置文件脚本(/etc/fdfs目录中的所有文件是nginx 整合fastdfs-nginx-module所用到的配置文件)

#! /bin/bash

cp /data/fdfs/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs

cp -r /data/fdfs/fastdfs/conf/* /etc/fdfs/

cp -r /data/fdfs/fdfs_conf/* /etc/fdfs/

12.docker部署tracker和storage容器

运行tracker镜像

$ docker run -d --name trakcer \
  --restart=always \
  -v /data/fdfs/fdfs_conf/tracker.conf:/fdfs_conf/tracker.conf \
  -v /data/fdfs/tracker_data:/fastdfs/tracker/data \
  --net=host season/fastdfs tracker
运行storage镜像

$ docker run -d --name storage \
  --restart=always \
  -v /data/fdfs/fdfs_conf/storage.conf:/fdfs_conf/storage.conf \
  -v /data/fdfs/storage_data:/fastdfs/storage/data \
  -v /data/fdfs/store_path:/fastdfs/store_path \
  --net=host season/fastdfs storage
Tracker服务器的端口默认是22122,你可以查看是否启用端口

$ netstat -aon | grep 22122
查看tracker容器和storage容器的关联

$ docker exec -it storage /bin/bash

$ cd fdfs_conf

$ fdfs_monitor storage.conf

13.运行nginx进行端口监听

cd /usr/local/nginx/sbin

./nginx #启动Nginx

./nginx -s reload #重新加载 

./nginx -s stop #停止
设置nginx开机自启动

新增shell脚本 vi /etc/rc.d/init.d/nginx

#!/bin/sh
#
#nginx - this script starts and stops the nginx daemin
#
# chkconfig: - 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /usr/local/nginx/conf/nginx.conf
# pidfile: /usr/local/nginx/logs/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
lockfile=/var/lock/subsys/nginx
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
configtest || return $?
stop
start
}
reload() {
configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac

加入系统服务并开机自启动

chmod +x /etc/rc.d/init.d/nginx (设置可执行权限)

chkconfig --add nginx (添加系统服务)

chkconfig --level 35 nginx on (开机自启动)

14.测试是否成功部署

curl http://192.168.199.120/kongqi/M00/00/00/wKjHeF27C5KAZdUSAAXmEY7V_qc038.jpg
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值