ubuntu16.04下FastDFS+Nginx分布式文件系统

本文详细介绍了在Ubuntu16.04上安装配置FastDFS和Nginx以实现分布式文件服务器的过程。首先讲解了FastDFS的基本概念和上传原理,然后阐述了FastDFS的架构,包括Tracker和Storage节点的角色。接着,逐步指导了FastDFS环境的搭建,包括Tracker和Storage的安装配置。最后,提到了Nginx的安装配置,以及如何通过Nginx解决因文件同步延迟导致的访问问题,确保文件上传下载的稳定性。
摘要由CSDN通过智能技术生成

前言:

以前的项目上传的文件都是保存到本地或者是局域网内的共享文件夹下,由于数据量,服务器的负载均衡(分机的某些图片无法访问的问题处理)等因素的情况下,就想到用fastdfs来文件管理,

FastDFS简介

FastDFS是一个由C语言实现的开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储,文件同步,文件访问(文件上传,下载)等;解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务。如相册网站,视频网站等等。
同类的分布式文件还有谷歌的GFS,HDFS(Hadoop),TFS(淘宝)。
对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
FastDFS有两个角色:Tracker(跟踪器),Storage(存储节点)。跟踪器主要做调度工作,在访问上起负载均衡的作用。
Tracker:主要做调度作用,起到负载均衡的作用;负责管理所有的Storage和Group,每一个Storage再启动后会连接Tracker,告知自己所属的Group,并保持周期心跳。负责管理所有的 storage server和group,每个 storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳,Tracker根据 storage 心跳信息,建立 group—>[storage server list]的映射表;
注:tracker管理的group数据和server数据可以在tracker的data路径中找到storage_groups_new.dat、storage_servers_new.dat。
Storage:存储节点,主要提供容量和备份服务;以Group为单位,每个Group内可以有多台Storage,数据互相备份。储容量空间以 group 内容量最小的 storage 为准;建议 group 内的 storage server 配置相同;以 group 为单位组织存储能够方便的进行应用隔离、负载均衡和副本数定制;缺点是 group 的容量受单机存储容量的限制, 同时 group 内机器坏掉,数据恢复只能依赖 group 内其他机器重新同步(坏盘替换,重新挂载重启 fdfs_storaged 即可)

FastDFS上传原理

storage定时向tracker上传状态信息

  • client上传连接请求到tracker
  • tracker查询可用的storage,并返回storage的ip和端口
  • 上传文件fIlecontent和meta data
  • 生成file_id,将上传的内容写入磁盘,并返回file_id路径和文件名

fastdfs架构如下图示:

在这里插入图片描述
FastDFS服务端有三个角色:跟踪服务器(tracker server)、存储服务器(storage server)和客户端(client)。

  • tracker
    server:跟踪服务器,主要做调度工作,起负载均衡的作用。在内存中记录集群中所有存储组和存储服务器的状态信息,是客户端和数据服务器交互的枢纽。相比GFS中的master更为精简,不记录文件索引信息,占用的内存量很少。
  • storage server:存储服务器(又称:存储节点或数据服务器),文件和文件属性(meta
    data)都保存到存储服务器上。Storage server直接利用OS的文件系统调用管理文件。
  • client:客户端,作为业务请求的发起方,通过专有接口,使用TCP/IP协议与跟踪器服务器或存储节点进行数据交互。

文件上传和下载的交互过程

上传机制:
在这里插入图片描述
下载机制:
在这里插入图片描述
上传流程:

客户端(client)询问Tracker server上传到的Storage server

1.client->Tracker server(返回一台可用的Storage server,返回的数据为该Storage server的IP地址和端口)

2.client直接与1返回的Storage server建立连接->文件上传成功后->Storage server会返回新生成的文件ID->结束

文件下载流程的步骤如下:

1. client询问Tracker server可以下载指定文件的Storage server,参数为文件ID(包含组名和文件名);

2. Tracker server返回一台可用的Storage server;

环境

系统环境:ubantu16.04
FastDFS版本:5.0.5
Nginx版本:1.12.2
Tracker:192.168.0.3
Storage1:192.168.0.3
Storage2:192.168.0.4

FastDFS安装(三台服务器都要安装)
安装FastDFS之前,先安装libevent工具包

由于fastdfs5.0.5依赖libfastcommon,先安装libfastcommon

wget https://github.com/happyfish100/libfastcommon/archive/V1.0.7.tar.gz
tar -zxvf V1.0.7.tar.gz
cd libfastcommon-1.0.7
./make.sh
./make.sh install

设置软连接

ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so
ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so
ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so
ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so

安装FastDFS

wget https://github.com/happyfish100/fastdfs/archive/V5.05.tar.gz
tar -zxvf V5.05.tar.gz
cd fastdfs-5.05
./make.sh
./make.sh install

配置Tracker与Storage
FastDFS安装成功后,会在/etc目录下会有个fdfs目录,进入fdfs,会发现三个.sample后缀的示例文件。

配置Tracker服务器(本文使用192.168.0.3)

cp tracker.conf.sample tracker.conf
vim tracker.conf

在这里插入图片描述
打开tracker.conf,修改如下处

base_path=/data/fastdfs/tracker

创建/data/fastdfs/tracker目录

mkdir -p /data/fastdfs/tracker

启动tracker服务

fdfs_trackerd /etc/fdfs/tracker.conf start

在这里插入图片描述
关闭tracker服务

fdfs_trackerd /etc/fdfs/tracker.conf stop

启动tracker服务后,查看监听

netstat -unltp|grep fdfs

在这里插入图片描述

查看/data/fastdfs/tracker目录文件,发现多出两个文件,用来存放数据和日志的

ls /data/fastdfs/tracker
data logs

在这里插入图片描述
tracker安装成功

配置Storage服务器(两台192.168.0.3,192.168.0.4)

cp storage.conf.sample storage.conf

打开storage.conf,修改如下处:注意此处ip地址需配置外网,否则外网访问不到,如果只在内网访问则没有问题

bind_addr=
# the base path to store data and log files
base_path=/data/fastdfs/storage

# store_path#, based 0, if store_path0 not exists, it's value is base_path
# the paths must be exist
store_path0=/data/fastdfs/storage

# tracker_server can ocur more than once, and tracker_server format is
#  "host:port", host can be hostname or ip address

#配置tracker跟踪器ip端口
tracker_server=192.168.0.3:22122

创建/data/fastdfs/storage目录

mkdir -p /data/fastdfs/storage

启动storage服务

fdfs_storaged /etc/fdfs/storage.conf start

启动有错误,可以通过/data/fastdfs/storage/logs查看
查看/data/fastdfs/storage下文件内容,生成logs、data两个目录
启动storage服务后,查看监听

netstat -unltp|grep fdfs
在这里插入图片描述
storage默认端口23000
Storage存储节点安装成功

所有存储节点都启动之后,可以在任一存储节点上使用如下命令查看集群的状态信息:
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
在这里插入图片描述
在这里插入图片描述
通过上图可以看到,两台storage的状态。

测试上传文件

三台服务器随便选择一台服务器,这里我选择192.168.0.3服务器

同样进入/etc/fdfs目录,编辑client.conf

cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
vim /etc/fdfs/client.conf

修改如下:

# the base path to store log files
base_path=/data/fastdfs/client

# tracker_server can ocur more than once, and tracker_server format is
#  "host:port", host can be hostname or ip address

#配置tracker跟踪器ip端口
tracker_server=192.168.0.3:22122

创建/data/fastdfs/client目录

mkdir -p /data/fastdfs/client

建立软连接(配置文件中storage存放数据的路径)

ln -s /data/fastdfs/storage/data /data/fastdfs/storage/data/M00
上传/opt目录的一张图片(名为:test.jpg)

上传图片

fdfs_test /etc/fdfs/client.conf upload /opt/test.jpg
fdfs_test /etc/fdfs/client.conf upload /root/libfastcommon-1.0.7/fastdfs-5.05/conf/anti-steal.jpg
jnydjky@jnydjky:/data/fastdfs/tracker/logs$ sudo /usr/bin/fdfs_test /etc/fdfs/client.conf upload /home/jnydjky/fastdfs-5.05/conf/anti-steal.jpg

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
启动和停止脚本为:

e 启动

/usr/local/bin/fdfs_trackerd /etc/fdfs/tracker.conf
/usr/local/bin/fdfs_storaged /etc/fdfs/storage.conf

f 停止

/usr/local/bin/stop.sh /usr/local/bin/fdfs_trackerd /etc/fdfs/tracker.conf
/usr/local/bin/stop.sh /usr/local/bin/fdfs_storaged /etc/fdfs/storage.conf

Nginx启动为:

/usr/local/nginx/sbin/nginx

Nginx停止脚本为:

ps uax |grep nginx|grep -v grep |awk '{print $2}'|xargs kill -9

测试上传文件:

fastdfs上传文件测试

fdfs_test /etc/fdfs/client.conf upload restart_nginx
This is FastDFS client test program v4.06
 
Copyright (C) 2008, Happy Fish / YuQing
 
FastDFS may be copied only under the terms of the GNU General
Public License V3, which may be found in the FastDFS source kit.
Please visit the FastDFS Home Page http://www.csource.org/
for more detail.
 
[2019-01-07 17:02:53] DEBUG - base_path=/data/fasdfs, connect_timeout=30, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0
 
tracker_query_storage_store_list_without_group:
        server 1. group_name=, ip_addr=172.31.13.134, port=23000
 
group_name=group1, ip_addr=172.31.13.134, port=23000
storage_upload_by_filename
group_name=group1, remote_filename=M00/00/00/rB8NhlwzFb2AYSoNAAAAcdeFOzU3621246
source ip address: 172.31.13.134
file timestamp=2019-01-07 17:02:53
file size=113
file crc32=3615832885
file url: http://172.31.13.134:9999/group1/M00/00/00/rB8NhlwzFb2AYSoNAAAAcdeFOzU3621246
storage_upload_slave_by_filename
group_name=group1, remote_filename=M00/00/00/rB8NhlwzFb2AYSoNAAAAcdeFOzU3621246_big
source ip address: 172.31.13.134
file timestamp=2019-01-07 17:02:53
file size=113
file crc32=3615832885
file url: http://172.31.13.134:9999/group1/M00/00/00/rB8NhlwzFb2AYSoNAAAAcdeFOzU3621246_big

上传文件测试

配置好fdfs后,测试上传一个/etc/passwd的文件

root@ubuntu:/data/fastdfs/tracker# fdfs_test /etc/fdfs/client.conf upload /etc/fdfs/client.conf /etc/passwd

在这里插入图片描述
如上图,上传成功,分别进入两台storage服务器目录/data/fastdfs/storage/data/00/00下,都可以发现,文件保存成功
刚才上传的路径查看是否上传成功~~~

cd /usr/muyoudev/fastdfs/fastdfs_storage_data/data
ls
0  0D  1A  27  34  41  4E  5B  68  75  82  8F  9C  A9  B6  C3  D0  DD  EA  F7
01  0E  1B  28  35  42  4F  5C  69  76  83  90  9D  AA  B7  C4  D1  DE  EB  F8
02  0F  1C  29  36  43  50  5D  6A  77  84  91  9E  AB  B8  C5  D2  DF  EC  F9
03  10  1D  2A  37  44  51  5E  6B  78  85  92  9F  AC  B9  C6  D3  E0  ED  FA
04  11  1E  2B  38  45  52  5F  6C  79  86  93  A0  AD  BA  C7  D4  E1  EE  FB
05  12  1F  2C  39  46  53  60  6D  7A  87  94  A1  AE  BB  C8  D5  E2  EF  FC
06  13  20  2D  3A  47  54  61  6E  7B  88  95  A2  AF  BC  C9  D6  E3  F0  FD
07  14  21  2E  3B  48  55  62  6F  7C  89  96  A3  B0  BD  CA  D7  E4  F1  FE
08  15  22  2F  3C  49  56  63  70  7D  8A  97  A4  B1  BE  CB  D8  E5  F2  FF
09  16  23  30  3D  4A  57  64  71  7E  8B  98  A5  B2  BF  CC  D9  E6  F3  M00
0A  17  24  31  3E  4B  58  65  72  7F  8C  99  A6  B3  C0  CD  DA  E7  F4
0B  18  25  32  3F  4C  59  66  73  80  8D  9A  A7  B4  C1  CE  DB  E8  F5
0C  19  26  33  40  4D  5A  67  74  81  8E  9B  A8  B5  C2  CF  DC  E9  F6

在所有Storage节点下载安装fastdfs-nginx-module
FastDFS通过Tracker服务器,将文件放在Storage服务器存储,但是同组存储服务器之间需要进入文件复制,有同步延迟的问题。假如Tracker 服务器将文件上传到192.168.0.3,上传成功后文件ID已经返回给客户端。此时FastDFS存储集群机制会将这个文件同步到同组存储 192.168.0.4,在文件还没有复制完成的情况下,客户端如果用这个文件ID192.168.0.4上取文件,就会出现文件无法访问的错误。而 fastdfs-nginx-module可以重定向文件连接到源服务器取文件,避免客户端由于复制延迟导致的文件无法访问错误。

安装fastdfs-nginx-module

wget https://github.com/happyfish100/fastdfs-nginx-module/archive/V1.20.tar.gz
wget https://nchc.dl.sourceforge.net/project/fastdfs/FastDFS%20Nginx%20Module%20Source%20Code/fastdfs-nginx-module_v1.16.tar.gz
或者
wget http://jaist.dl.sourceforge.NET/project/fastdfs/FastDFS%20Nginx%20Module%20Source%20Code/fastdfs-nginx-module_v1.16.tar.gz
tar -zxvf fastdfs-nginx-module_v1.16.tar.gz
cd /opt/fastdfs/fastdfs-nginx-module/src
vim config

修改如下:不修改后面编译nginx会报错

CORE_INCS="$CORE_INCS /usr/local/include/fastdfs /usr/local/include/fastcommon/"

改为:

CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"

复制 fastdfs-nginx-module 源码中的配置文件到/etc/fdfs 目录, 并修改

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

tracker_server=192.168.7.73:22122 # tracker服务IP和端口
url_have_group_name=true # 访问链接前缀加上组名
store_path0=/data/fastdfs/storage # 文件存储路径

nginx安装配置

下载nginx包安装
由于上面已经安装了nginx,所以我们先卸载nginx。再重新上传nginx包,解压下载。有输入提示时,输入Y即可

卸载apt-get安装的nginx

彻底卸载nginx

apt-get --purge autoremove nginx

#查看nginx的版本号

nginx -v

载nginx包安装
安装依赖包

apt-get install build-essential libtool libpcre3 libpcre3-dev zlib1g-dev openssl -y

安装nginx

cd /usr/local
mkdir nginx
cd nginx
wget http://nginx.org/download/nginx-1.13.7.tar.gz
tar -zxvf nginx1.13.7.tar.gz
cd nginx-1.13.7/
./configure --prefix=/usr/local/nginx --add-module=/root/fastdfs-nginx-module/src 

sudo ./configure --prefix=/usr/local/nginx --with-pcre=/usr/local/nginx/pcre-8.42 --with-zlib=/usr/local/nginx-1.13.7
make && make install

在这里插入图片描述
编译nginx

进入nginx目录

/usr/local/nginx/nginx-1.13.7

执行命令

./configure

执行make命令

make

执行make install命令

make install

启动nginx

#进入nginx启动目录
cd /usr/local/nginx/sbin

启动nginx
./nginx

sudo nginx -t 或者/usr/local/nginx/sbin/nginx -t       #检测配置文件是否正确 
sudo nginx -s stop #停止 
sudo nginx -s reload #重载配置文件
 /usr/local/nginx/sbin/nginx -V 或者nginx -V            #查看nginx版本

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
查看端口
在这里插入图片描述
访问nginx
网页输入ip地址,访问成功,到此,nginx安装完毕

FastDFS Storage配置nginx访问(Storage机器配置)
复制FastDFS的部分配置文件到/etc/fdfs目录,命令:

cd /opt/fastdfs/fastdfs-5.05/conf
cp http.conf mime.types /etc/fdfs

配置nginx.conf文件,修改端口与/etc/fdfs/storage.conf中的http.server_port=8888相对应

user root;
    server {
        listen       8888;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }
        # group1为Storage所在的group
        location /group1/M00 {
             # Storage的data目录
            root /mnt/fastdfs/data;
             # 由于fastdfs保存的文件名已经编码,源文件名将丢失,应用可通过在请求url后加oname参数指定源文件名
            if ($arg_oname != ''){
                add_header Content-Disposition "attachment;filename=$arg_oname";
            }
             # 调用nginx-fastdfs-module模块
            ngx_fastdfs_module;
        }

在这里插入图片描述

注意事项

8888端口值是要与/etc/fdfs/storage.conf中的http.server_port=8888相对应,因为http.server_port默认为8888,如果想改成 80,则要对应修改过来。
Storage对应有多个group的情况下,访问路径带group名,

注意 :location的配置,如果有多个group则配置location ~/group([0-9])/M00 ,没有则不用配group。

如/group1/M00/00/00/xxx,对应的 Nginx 配置为:

location ~/group([0-9])/M00 {
    ngx_fastdfs_module;
}

如查下载时如发现老报404,将nginx.conf第一行user nobody修改为user root后重新启动。
重启nginx服务

/usr/local/nginx/sbin/nginx -s reload

FastDFS Tracker配置nginx访问(Tracker机器配置)

vim /usr/local/nginx/conf/nginx.conf

upstream fdfs_group1 {
     server 192.168.7.149:8888 weight=1 max_fails=2 fail_timeout=30s;
     server 192.168.7.44:8888 weight=1 max_fails=2 fail_timeout=30s;
}
listen       80;
server_name 912.1.1.12          #默认是localhost,设置成本机IP。
 #设置 group 的负载均衡参数
location /group1/M00 {
    proxy_next_upstream http_502 http_504 error timeout invalid_header;
    proxy_pass http://fdfs_group1;
    expires 30d;
}

重启nginx服务

ginx -s reload

上传文件访问测试

通过浏览器访问,上传的文件,例如测试上传后返回的文件ID为group1/M00/00/00/wKgAA1oXweqAVyBDAAFsYaVScOM276_big.jpg

用浏览器通过Storage访问:http://ip:8888/group1/M00/00/00/wKgAA1oXweqAVyBDAAFsYaVScOM276_big.jpg

用浏览器通过Tracker访问:http://ip/group1/M00/00/00/wKgAA1oXweqAVyBDAAFsYaVScOM276_big.jpg

常用命令

./nginx        启动服务
nginx -s reload        重载配置
fdfs_trackerd /etc/fdfs/tracker.conf start       启动tracker服务
fdfs_storaged /etc/fdfs/storage.conf start       启动storage服务

参考链接 :
岑同时7.5 : https://blog.csdn.net/ystyaoshengting/article/details/48439003
https://blog.csdn.net/qq_30505673/article/details/82392430
https://blog.csdn.net/qq_34301871/article/details/80060235
https://www.cnblogs.com/aidanzsj/p/5757013.html

FastDFS && Nginx实现分布式文件服务器(一):https://www.jianshu.com/p/af2dea6b831f

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值