前言:

以前的项目上传的文件都是保存到本地或者是局域网内的共享文件夹下,由于数据量,服务器的负载均衡(分机的某些图片无法访问的问题处理)等因素的情况下,就想到用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.06Copyright (C) 2008, Happy Fish / YuQingFastDFS 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: 0tracker_query_storage_store_list_without_group:server 1. group_name=, ip_addr=172.31.13.134, port=23000group_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.conftracker_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所在的grouplocation /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.confupstream 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

ubuntu16.04下FastDFS+Nginx分布式文件系统相关推荐

  1. 1 CentOS 6下FastDFS实现分布式文件系统

    FastDFS FastDFS是用c语言编写的一款开源的分布式文件系统.FastDFS为互联网量身定制,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标,使用FastDFS很容 ...

  2. Ubuntu16.04下部署 nginx+uwsgi+django1.9.7(虚拟环境pyenv+virtualenv)

    由于用的新版本系统,和旧的稍有差别,在网上搜了很多相关资料,搞了三天终于搞好在Ubuntu16.04下的部署,接下来就详细写写步骤以及其中遇到的问题.前提是安装有虚拟环境pyenv+virtualen ...

  3. ubuntu16.04+fastdfs+nginx分布式文件系统

    FastDFS简介 FastDFS是一个由C语言实现的开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储,文件同步,文件访问(文件上传,下载)等:解决了大容量存储和负载均衡的问题.特别适 ...

  4. Ubuntu16.04下配置nginx + RTMP流媒体服务器

    目录 前言 1.安装nginx需要的环境 1.1 查看gcc版本 gcc -v 1.2 pcre.pcre-devel安装 1.3 zlib安装 1.4 安装openssl 2.开始安装 2.1 创建 ...

  5. Ubuntu16.04下caffe CPU版的详细安装步骤

    一.caffe简介 Caffe,是一个兼具表达性.速度和思维模块化的深度学习框架. 由伯克利人工智能研究小组和伯克利视觉和学习中心开发. 虽然其内核是用C++编写的,但Caffe有Python和Mat ...

  6. Ubuntu20.04中fastdfs,nginx的安装和配置(apt-get安装nginx添加fastdfs-nginx-module模块)

    Ubuntu20.04中fastdfs,nginx的安装和配置 环境准备: 编译环境: Ubuntu20.04 使用的系统软件: fastdfs-6.07 fastdfs-nginx-module-1 ...

  7. FastDFS(分布式文件系统)使用介绍

    FastDFS(分布式文件系统)使用介绍 一.基本介绍 1.FastDFS 的特性 2.FastDFS 的存储策略 二.使用 FastDFS 实现分布式文件存储 1.安装 FastDFS 软件 2.验 ...

  8. ubuntu16.04 下安装Opencv2.4.9

    ubuntu16.04 下安装Opencv2.4.9 OpenCV的源码download from:  https://sourceforge.net/projects/opencvlibrary/? ...

  9. ubuntu16.04下ROS最新换源方法,解决Hash sum mismatch 问题

    1.更换源 备份原始数据 cd /etc/apt/ sudo cp sources.list sources.list.bak sudo gedit sources.list 科大源: deb htt ...

最新文章

  1. python walk 遍历文件夹 文件大小
  2. 使用split进行分割时遇到特殊字符的问题
  3. 确保字符串的每个单词首字母都大写,其余部分小写
  4. Redis集群监控RedisClusterManager
  5. 随想录(从编程语言到库、框架、软件)
  6. C# TypeDescriptor初了解
  7. 精品:Spline导数及曲率计算(判断曲线的弯曲程度)
  8. 中国农业银行K宝证书怎么在中国农业银行APP上下载更新K宝证书?
  9. php集成环境 linux,linux下搭建php的集成环境
  10. java flush是什么意思,java – JPA中flush的确切目的是什么
  11. w7忘记计算机密码,忘记电脑开机密码怎么办windows7_win7电脑忘记开机密码解决方法...
  12. Blue Coat 最新报告显示 移动端恶意攻击愈演愈烈
  13. RLC串联电路截止频率
  14. Houdini学习 —— 使用VOP进行陨石坑效果制作
  15. 10 个超好用的免费开源项目管理软件
  16. mysql:增删改查语句大全
  17. 斯坦福SCI论文写作课笔记(十三)
  18. css常见效果——棱形图片
  19. 《ROS学习之路(1)》ROS Kinetic版本安装---ubuntu16.04(Xenial Xerus 好客的非洲地松鼠)
  20. Anton and Fairy Tale(二分)

热门文章

  1. python的哲学内容_python 哲学或者说文化
  2. 计算机二级考试操作题outlook,2017年计算机考试二级考试操作题.doc
  3. 怎么查看蓝牙uuid_你的蓝牙耳机真的坏了吗?蓝牙耳机常见的一些假故障?
  4. [RHCSA学习笔记]Autofs实现自动挂载NFS共享
  5. Singleton in java
  6. JavaEE的核心API与组件
  7. Java学习笔记十:Java的数组以及操作数组
  8. .net跨平台分析软件
  9. MyEclipse配置TomCat环境(图文详解)
  10. Microsoft Azure WebSite创建网站