写在前面
一个业务系统 总有这样那样的文件 需要保存把。有许多第三方的对象存储,什么阿里腾讯的OSS,COS,还有七牛云啥的。当然也是可以选择没错了,但是可能基于数据安全还有公司成本,或许我们搭建自己的文件服务器也是不错的。不过这样也会多出一些运维成本了。这个取舍就看自己了吧,仁者见仁智者见智。
话不多说,直接开始吧,如果有什么错误的地方,欢迎指正~ 我也还在不断的学习中,大家一起加油!
先来两张架构图:
Tracker 就相当于一个主节点,负责管理记录多个Storage节点的元信息。类似于Hadoop HDFS的namenode & datanode 的关系
CentOS软件准备:
软件 | 版本链接 | 说明 |
---|---|---|
FastDFS | fastdfs-5.08.tar.gz | 包含Tracker, Storage 和Client 三个组件 |
FastCommon | libfastcommon-master.20170125.zip | FastDFS 依赖的基础库,同一个作者写的 |
FastDFS的Nginx模块 | fastdfs-nginx-module-master.20170125.zip | 借助Nginx提供HTTP下载服务。由于性能不如Nginx,作者从4.05版本后就取消了内置HTTP服务。 |
Nginx | nginx-1.12.2 | HTTP服务 |
//FastDFS是C开发的,没有libevent包的装一下即可。ps:Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库
[root@spark001 fastdfs]# yum -y install libevent
安装
1. 基础依赖库: fastcommon
fastcommon 是作者余庆从FastDFS剥离出来的。
$ unzip libfastcommon-master.20170125.zip && cd libfastcommon-master
$ ./make.sh && ./make.sh install
安装成功后,会输出到/usr/include/fastcommon 目录:
2.安装FastDFS
$ tar zxvf fastdfs-5.08.tar.gz && cd fastdfs-5.08
$ ./make.sh && ./make.sh install
2.1 安装成功后,会在 /usr/bin 目录输出若干以 fdfs_ 开头的可执行文件:
2.2 安装成功后,会在 /etc/fdfs 出现三个文件:
这三个文件我们不用,直接用 fastdfs-5.08/conf 目录下的:
├── tracker.conf # tracker server 的配置文件
├── storage.conf # storage server 的配置文件
├── client.conf # 客户端的配置文件
├── http.conf # fastdfs nginx 模块配置文件,如果不需要Nginx提供HTTP下载服务,可以不要。
├── mime.types # fastdfs nginx 模块配置文件,如果不需要Nginx提供HTTP下载服务,可以不要。
├── storage_ids.conf
└── anti-steal.jpg
执行:
[root@spark001 fastdfs-5.08]# cp conf/* /etc/fdfs/
A 启动 Tracker
在启动之前需要对主节点做一些修改
主要是以下几项:
bind_addr=
port=22122
base_path=/fastdfs/tracker
tracker 服务主要3个配置:服务侦听地址和端口,
base_path是用来存储meta和log的,
分别是 ${base_path}/data 和 ${base_path}/logs 两个子目录
[root@spark001 ~]# mkdir -p /fastdfs/tracker
启动 trackerd
[root@spark001 bin]# fdfs_trackerd /etc/fdfs/tracker.conf restart
[root@spark001 bin]# pwd
/usr/bin
[root@spark001 bin]#
查看是否启动成功:
同时,这个时候的日志文件是在:
B 启动 Storage
由于 Storage 启动的时候,需要主动连接到 Tracker,并周期性的发送心跳,以汇报 storage 的状态信息。
同样,还是要修改一下配置文件:
bind_addr=
port=22122
base_path=/fastdfs/storage
store_path0=/fastdfs/storage/p0
tracker_server=ip:22122
其中:
base_path 是存放数据(比如binlog)和日志的,
store_path0是第一个group的(下面的data目录有256*256的二级子目录),tracker_server 是 trackerd 的地址,以便storage 连接它,并发送心跳。
启动 Storage
[root@spark001 bin]# pwd
/usr/bin
[root@spark001 bin]# fdfs_storaged /etc/fdfs/storage.conf restart
[root@spark001 bin]#
C 启动 Client
同样是:去到/etc/fdfs
修改clinet.conf
base_path=/fastdfs/client
tracker_server=ip:22122
其中 base_path 是指定日志输出路径,
tracker_server 是因为 client首先要请求 trackerd 获取调度信息。
[root@spark001 ~]# mkdir -p /fastdfs/client
启动 clinet
同样,进入到/usr/bin
使用命令测试一下上传功能:
[root@spark001 bin]# /usr/bin/fdfs_test /etc/fdfs/client.conf upload /root/jy.png
This is FastDFS client test program v5.08
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.
[2020-07-01 19:37:37] DEBUG - base_path=/fastdfs/client, 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
[2020-07-01 19:37:37] ERROR - file: tracker_proto.c, line: 48, server: 120.27.243.91:22122, response status 28 != 0
[2020-07-01 19:37:37] ERROR - file: tracker_proto.c, line: 48, server: 120.27.243.91:22122, response status 28 != 0
tracker_query_storage fail, error no: 28, error info: No space left on device
[root@spark001 bin]#
出现内存空间不足的问题:这里可以调整一下,来到 tracker.conf
重启:
[root@spark001 tracker]# /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
waiting for pid [15323] exit ...
starting ...
[root@spark001 tracker]#
再次测试上传:
上传过程会涉及到先跟trackerd交互,然后跟storaged交互,最后返回文件的信息
发现这个时候,图片已经是上传成功了。
接下来,我们借用Nginx 使得我们可以通过其提供HTTP服务进行文件的访问$下载。
先解压 fastdfs-nginx-module-master.20170125.zip
unzip fastdfs-nginx-module-master.20170125.zip && cd fastdfs-nginx-module-master
安装Nginx
安装前置依赖
yum -y install gcc gcc-c++ autoconf automake make
yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-devel
解压安装
tar -zxvf nginx-1.12.2.tar.gz && cd nginx-1.12.2
./configure --add-module=/root/softs/fastdfs/fastdfs-nginx-module-master/src
make && make install
安装好之后:
拷贝 mod_fastdfs.conf 这个文件到 /etc/fdfs/
文件位置如下:
[root@spark001 src]# pwd
/root/softs/fastdfs/fastdfs-nginx-module-master/src
[root@spark001 src]# ll
total 76
-rw-r--r-- 1 root 0 33239 Jan 10 2017 common.c
-rw-r--r-- 1 root 0 3479 Jan 10 2017 common.h
-rw-r--r-- 1 root 0 902 Jan 10 2017 config
-rw-r--r-- 1 root 0 3725 Jan 10 2017 mod_fastdfs.conf
-rw-r--r-- 1 root 0 28643 Jan 10 2017 ngx_http_fastdfs_module.c
[root@spark001 src]#
修改拷贝过去的文件:
base_path=/fastdfs/tmp
tracker_server=ip:22122
group_name=group1
url_have_group_name = true
其中 base_path 是指定日志输出路径,
url_have_group_name 是指是否需要包含group_name ,默认false
再次回到Nginx这边进行配置
cd /usr/local/nginx/conf
vim nginx.conf
新增:
server {
listen 88;
server_name 120.27.243.x;
location /group1/M00 {
ngx_fastdfs_module;
}
}
保存退出,启动nginx
验证:
浏览器打开ip:888
要想在浏览器上看见刚才上传的图片,需要修改一个配置
修改之后:重启各个服务
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
/usr/local/nginx/sbin/nginx -s reload
浏览器打开http://ip:88/group1/M00/00/00/rBCc_V78d-CAS1zsAASVqq9IuEg601.png
好啦,到这里成功搭建了,这样我们就可以在后端代码里面将文件服务器嵌进去了~
其中一些点,有时间,我再深入一下吧。
谢谢~