分布式文件系统(Distributed File System)是一个软件/软件服务器,可以用来管理文件。这个软件所管理的文件通常在多个服务器节点上,这些服务器节点通过网络相连构成一个庞大的文件存储服务器集群,这些服务器都用于存储文件资源,通过分布式文件系统来管理这些服务器上的文件。
分布式文件系统与传统文件系统对比
FastDFS 就是常见的分布式文件系统之一,它是基于 C 语言开发的,一个轻量级开源的高性能分布式文件系统。主要功能有:文件存储、文件同步、文件访问(文件上传/下载),解决了大容量的文件存储和高并发访问的问题,文件存取时实现了负载均衡。FastDFS 特别适合中大型网站以文件为载体的在线服务。开源地址:https://github.com/happyfish100/fastdfs,只有Linux版,没有Window版。
FastDFS主要由两部分构成:客户端、服务端。
客户端(client):用于连接操作FastDFS的java程序,提供基本文件访问接口,比如 upload、download、append、delete 等。
服务端(Server):由两部分构成,跟踪器(tracker)、存储节点(storage)。
跟踪器(tracker):负责文件访问的调度和负载均衡,负责管理所有的 Storage Server 和 group 组/卷。
存储节点(storage):负责文件存储,文件同步/备份,提供文件访问接口,文件元数据管理。以 group 为单位,每个 group 内可以有多台 Storage Server,数据互为备份,达到容灾的目的。每个 Storage 在启动以后会主动连接 Tracker,告知自己所属 group 等存储相关信息,并保持周期性心跳。
检查是否安装了gcc、libevent、libevent-devel
yum list installed | grep gcc
yum list installed | grep libevent
yum list installed | grep libevent-devel
如果没有安装,则需进行安装
yum install gcc libevent libevent-devel -y
下载地址:https://github.com/happyfish100 ,需要下载以下几个包,需要注意的是最后一个libserverframe包是新引入的网络框架库,目前安装FastDFS除了libfastcommon还需另外编译安装它,否则编译不通过。
安装 FastDFS 前首先需要安装 libfastcommon 。
解压
cd /usr/local/fastdfs/
unzip libfastcommon-master.zip
进入解压后的目录,编译
cd libfastcommon-master/
./make.sh
然后安装
./make.sh install
安装 FastDFS 前首先需要安装 libserverframe。
解压
cd /usr/local/fastdfs/
unzip libserverframe-master.zip
进入解压后的目录,编译
cd libserverframe-master/
./make.sh
然后安装
./make.sh install
解压
cd /usr/local/fastdfs/
unzip fastdfs-master.zip
进入解压后的目录,编译
cd fastdfs-master/
./make.sh
然后安装
./make.sh install
安装成功后,可以看到配置文件已经在/etc/fdfs/目录下
并且在/usr/bin/目录下已经有 fdfs 开头的文件,都是启动Server的一些命令文件。
为了方便,我们先将FastDFS解压目录conf里的 http.conf 和 mime.types 文件拷贝到 /etc/fdfs/ 目录下,后续程序里使用会用到
cd /usr/local/fastdfs/fastdfs-master/conf/
cp http.conf /etc/fdfs/
cp mime.types /etc/fdfs/
主要配置 tracker.conf 和 storage.conf 两个文件。
在配置Tracker之前,需要先创建Tracker服务器的文件路径,用于存储Tracker的数据文件和日志文件等。
mkdir -p /opt/fastdfs/tracker
vi /etc/fdfs/tracker.conf
#启用配置文件,默认启用配置文件(默认值)
disabled=false
#设置tracker的端口号,通常采用22122这个默认端口 (默认值)
port=22122
#设置tracker的数据文件和日志目录
base_path=/opt/fastdfs/tracker
#设置http端口号,(默认值)
http.server_port=8080
步骤基本与配置Tracker一致,创建Storage服务器的文件目录。
# 创建数据文件和日志目录
mkdir -p /opt/fastdfs/storage
# 创建实际文件存储目录
mkdir -p /opt/fastdfs/storage/files
vi /etc/fdfs/storage.conf
#启用配置文件(默认值)
disabled=false
#组名,根据实际情况修改 (默认值)
group_name=group1
#设置storage的端口号,默认是23000,同一个组的storage端口号必须一致 (默认值)
port=23000
#设置storage数据文件和日志目录
base_path=/opt/fastdfs/storage
#存储路径个数,需要和store_path个数匹配 (默认值)
store_path_count=1
#实际文件存储路径
store_path0=/opt/fastdfs/storage/files
#tracker 服务器的 IP地址和端口号,如果是单机搭建,IP不要写127.0.0.1,否则启动不成功
tracker_server=192.168.157.140:22122
#设置 http 端口号 (默认值)
http.server_port=8888
fdfs_trackerd /etc/fdfs/tracker.conf
fdfs_storaged /etc/fdfs/storage.conf
启动成功后,查看进程
ps -ef | grep fdfs
监测storage是否注册到了tracker中
fdfs_monitor /etc/fdfs/storage.conf
查看端口监听情况,22122和23000被正常监听。
#查看端口监听情况
netstat -unltp|grep fdfs
查看新生成的data和logs目录
cd /opt/fastdfs/storage
查看数据实际存储目录,里面存放了 255*255 个文件夹
cd /opt/fastdfs/storage/files
查看日志
tail -f /opt/fastdfs/storage/logs/storaged.log
# 停止tracker服务
fdfs_trackerd /etc/fdfs/tracker.conf stop
# 停止storage服务
fdfs_storaged /etc/fdfs/storage.conf stop
测试主要使用client,所以修改 client.conf 配置文件
vi /etc/fdfs/client.conf
#配置数据存储路径
base_path = /opt/fastdfs/storage
#配置tracker_server部署的访问地址
tracker_server = 192.168.157.140:22122
fdfs_test /etc/fdfs/client.conf upload /data/test.txt
成功。
tracker_query_storage_store_list_without_group:
server 1. group_name=, ip_addr=192.168.157.140, port=23000
group_name=group1, ip_addr=192.168.157.140, port=23000
storage_upload_by_filename
group_name=group1, remote_filename=M00/00/00/wKidjGWem4KAMz_DAAAAIxX_-fc253.txt
source ip address: 192.168.157.140
file timestamp=2024-01-10 21:28:34
file size=35
file crc32=369097207
example file url: http://192.168.157.140/group1/M00/00/00/wKidjGWem4KAMz_DAAAAIxX_-fc253.txt
storage_upload_slave_by_filename
group_name=group1, remote_filename=M00/00/00/wKidjGWem4KAMz_DAAAAIxX_-fc253_big.txt
source ip address: 192.168.157.140
file timestamp=2024-01-10 21:28:34
file size=35
file crc32=369097207
example file url: http://192.168.157.140/group1/M00/00/00/wKidjGWem4KAMz_DAAAAIxX_-fc253_big.txt
这里返回的文件目录结构如下
/group1/M00/00/00/wKidjGWem4KAMz_DAAAAIxX_-fc253.txt
/组名(group1)/磁盘(M00)/目录(00/00)/文件名
注:没有搭建集群默认只有一个组group1,后缀名包含-m的为属性文件(meta)。
# 需要指定group_name和remote_filename,下载默认下载到当前目录
fdfs_test /etc/fdfs/client.conf download group1 M00/00/00/wKidjGWem4KAMz_DAAAAIxX_-fc253.txt
# 需要指定group_name和remote_filename,下载默认下载到当前目录
fdfs_test /etc/fdfs/client.conf delete group1 M00/00/00/wKidjGWem4KAMz_DAAAAIxX_-fc253.txt
在文件上传的时候,上传成功的信息中有提示我们可以通过某个路径去访问上传的文件,但是我们不能直接访问这个路径。 FastDFS提供了一个Nginx扩展模块fastdfs-nginx-module,利用该模块,我们可以通过Nginx来对外访问查看FastDFS上的文件,所以需要安装 nginx 和 fastdfs-nginx-module。
注:如果是已经有nginx了,只需要增加 fastdfs-nginx-module 模块就行,也就是最后nginx只执行make ,不执行install ,因为不需要重新安装,只需要生成新的nginx启动项即可。
安装nginx所需依赖
#安装nginx所需依赖
yum -y install pcre pcre-devel
yum -y install zlib zlib-devel
yum -y install openssl openssl-devel
解压 nginx 和 fastdfs-nginx-module
cd /usr/local/fastdfs
tar -zxvf nginx-1.19.10.tar.gz
unzip fastdfs-nginx-module-master.zip
解压后进入 nginx 目录编译安装 nginx,并添加 fastdfs-nginx-module,我这里为了和原有Nginx进行区分,新安装的Nginx取名为nginx_fdfs
# 创建nginx安装目录
mkdir -p /usr/local/nginx_fdfs
cd /usr/local/fastdfs/nginx-1.19.10
# 配置,指定安装路径,添加模块
./configure --prefix=/usr/local/nginx_fdfs --add-module=/usr/local/fastdfs/fastdfs-nginx-module-master/src
# 编译
make
# 安装
make install
安装完成后
把 fastdfs-nginx-module-master/src 目录下的 mod_fastdfs.conf
拷贝到 /etc/fdfs 目录下,这样才能正常启动 Nginx
cp /usr/local/fastdfs/fastdfs-nginx-module-master/src/mod_fastdfs.conf /etc/fdfs/
在 /opt/fastdfs/ 目录下创建 nginx_mod 目录
mkdir -p /opt/fastdfs/nginx_mod
修改 mod_fastdfs.conf 配置文件
vi /etc/fdfs/mod_fastdfs.conf
#日志目录
base_path=/opt/fastdfs/nginx_mod
#tracker服务器的IP地址以及端口号
tracker_server=192.168.157.140:22122
#storage服务器的端口号(默认值)
storage_server_port=23000
#文件url中是否有 group 名
url_have_group_name = true
#存储路径
store_path0=/opt/fastdfs/storage/files
修改 nginx.conf 配置文件,添加一个 location
vi /usr/local/nginx_fdfs/conf/nginx.conf
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
# 拦截请求路径中包含 /group[1-9]/M0[0-9] 的请求,用fastdfs的Nginx模块进行转发
location ~ /group[1-9]/M0[0-9] {
ngx_fastdfs_module;
}
}
注:ngx_fastdfs_module 这个指令不是Nginx本身提供的,是扩展模块提供的,根据这个指令找到FastDFS提供的Nginx模块配置文件,然后找到Tracker,最终找到Storage。
# 测试
/usr/local/nginx_fdfs/sbin/nginx -c /usr/local/nginx_fdfs/conf/nginx.conf -t
# 启动
/usr/local/nginx_fdfs/sbin/nginx -c /usr/local/nginx_fdfs/conf/nginx.conf
# 停止
/usr/local/nginx_fdfs/sbin/nginx -c /usr/local/nginx_fdfs/conf/nginx.conf -s stop
# 重载
/usr/local/nginx_fdfs/sbin/nginx -c /usr/local/nginx_fdfs/conf/nginx.conf -s reload
检查
/usr/local/nginx_fdfs/sbin/nginx -V
上传一张图片
fdfs_test /etc/fdfs/client.conf upload /data/1440.jpg
访问http://192.168.157.140/group1/M00/00/00/wKidjGWfcrqASjDvAArtUI6z-8w526.jpg
根据自己服务器情况开放端口
#开放端口22122、23000、80、8080、8888
firewall-cmd --add-port=22122/tcp --permanent --zone=public
firewall-cmd --add-port=23000/tcp --permanent --zone=public
firewall-cmd --add-port=80/tcp --permanent --zone=public
firewall-cmd --add-port=8080/tcp --permanent --zone=public
firewall-cmd --add-port=8888/tcp --permanent --zone=public
#重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload
vi /etc/rc.d/rc.local
在底部增加如下
fdfs_trackerd /etc/fdfs/tracker.conf
fdfs_storaged /etc/fdfs/storage.conf
/usr/local/nginx_fdfs/sbin/nginx -c /usr/local/nginx_fdfs/conf/nginx.conf
修改文件权限
chmod +x /etc/rc.d/rc.local
编译 FastDFS 时,报错如下
gcc -Wall -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -g -O1 -DDEBUG_FLAG -c -o ../common/fdfs_global.o ../common/fdfs_global.c -I../common -I/usr/local/include
In file included from ../common/fdfs_global.c:21:0:
../common/fdfs_global.h:17:26: fatal error: sf/sf_global.h: No such file or directory
#include "sf/sf_global.h"
原因:
需要先编译和安装 libserverframe,新引入的网络框架库,下载地址:https://github.com/happyfish100
unzip libserverframe-master.zip
cd libserverframe-master/
./make.sh
./make.sh install
编译安装完后即可正常编译安装 FastDFS
熬夜写的,觉得有帮助来个赞吧!!!
更多技术干货,请持续关注程序员大佬超。
原创不易,转载请务必注明出处。