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