《Linux系统下FastDFS分布式存储与Nginx 整合部署全流程详解》
1. FastDFS介绍
1.1 什么是FastDFS
FastDFS 是用 c 语言编写的一款开源的分布式文件系统。 FastDFS 为互联网量身定制,充分考虑了 冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用 FastDFS 很容易搭建一套 高性能的文件服务器集群提供文件上传、下载等服务。
1.2 FastDFS架构
FastDFS 架构包括 Tracker server 和 Storage server。客户端请求 Tracker server 进行文件上传、 下载,通过 Trackerserver 调度最终由 Storage server 完成文件上传和下载。
Trackerserver 作用是负载均衡和调度,通过 Trackerserver 在文件上传时可以根据一些策略找到 Storageserver 提供文件上传服务。可以将 tracker 称为追踪服务器或调度服务器。
Storageserver 作用是文件存储,客户端上传的文件最终存储在 Storage 服务器上,Storage server 没有实现自己的文件系统而是利用操作系统 的文件系统来管理文件,可以将 storage 称为存储服 务器。
如下图:
1.2.1 Tracker 集群
FastDFS 集群中的 Tracker server 可以有多台,Trackerserver 之间是相互平等关系同时提供服务,Trackerserver 不存在单点故障。客户端请求 Trackerserver 采用轮询方式,如果请求的 tracker 无法提供服务则换另一个 tracker。
1.2.2 Storage 集群
Storage 集群采用了分组存储方式。 storage 集群由一个或多个组构成,集群存储总容量为集群中所 有组的存储容量之和。 一个组由一台或多台存储服务器组成,组内的Storage server之间是平等关系,不同组的 Storageserver 之间不会相互通信,同组内的Storageserver 之间会相互连接进行文件同步,从 而保证同组内每个 storage 上的文件完全一致的。一个组的存储容量为该组内存储服务器容量最小的那 个,由此可见组内存储服务器的软硬件配置最好是一致的。
采用分组存储方式的好处是灵活、可控性较强。比如上传文件时,可以由客户端直接指定上传到的 组也可以由 tracker 进行调度选择。 一个分组的存储服务器访问压力较大时,可以在该组增加存储服务器来扩充服务能力(纵向扩容)。当系统容量不足时,可以增加组来扩充存储容量(横向扩容)
1.2.3 Storage 状态收集
Storage server 会连接集群中所有的 Tracker server,定时向他们报告自己的状态,包括磁盘剩余 空间、文件同步状况、文件上传下载次数等统计信息。
1.2.4 文件上传流程
客户端上传文件后存储服务器将文件 ID 返回给客户端,此文件 ID 用于以后访问该文件的索引信 息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。
group1 /M00 /02// WKgDrE34E8WAAAAAAAAGKEIYJK42378.sh
n 组名:文件上传后所在的 storage 组名称,在文件上传成功后有 storage 服务器返回,需要客户 端自行保存。n 虚拟磁盘路径: storage 配置的虚拟路径,与磁盘选项 store_path*对应。如果配置了 store_path0 则是 M00,如果配置了 store_path1 则是 M01,以此类推。n 数据两级目录: storage 服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。n 文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器 IP 地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。
1.2.5 文件下载流程
tracker 根据请求的文件路径即文件 ID 来快速定义文件。 比如请求下边的文件:
group1 /M00 /02// WKgDrE34E8WAAAAAAAAGKEIYJK42378.sh
通过组名 tracker 能够很快的定位到客户端需要访问的存储服务器组是 group1,并选择合适的存储 服务器提供客户端访问。存储服务器根据“文件存储虚拟磁盘路径”和“数据文件两级目录”可以很快定位到文件所在目录,并根 据文件名找到客户端需要访问的文件。
1.3 FastDFS 为什么要结合 Nginx?
我们在使用 FastDFS 部署一个分布式文件系统的时候,通过 FastDFS 的客户端 API来进行文件的上 传、下载、删除等操作。同时通过 FastDFS 的 HTTP 服务器来提供 HTTP服务。但是 FastDFS 的 HTTP 服务较为简单,无法提供负载均衡等高性能的服务,所以FastDFS 的开发者——淘宝的架构师余庆同学,为我们提供了 Nginx 上使用的 FastDFS 模块(也可以叫 FastDFS 的 Nginx 模块)。其使用非常简单。
FastDFS 通过 Tracker 服务器,将文件放在 Storage 服务器存储,但是同组之间的服务器需要复制文件,有延迟的问题.假设 Tracker 服务器将文件上传到了 192.168.1.80,文件 ID 已经返回客户端,这时,后台 会将这个文件复制到 192.168.1.30,如果复制没有完成,客户端就用这个 ID 在 192.168.1.30 取文件,肯定 会出现错误。这个 fastdfs-nginx-module 可以重定向连接到源服务器取文件,避免客户端由于复制延迟的 问题,出现错误。
2. 整合部署流程
2.1 准备工作
注:本次的安装部署以及后续的测试都是在内部的局域网中进行的,所以需要修改本机的域名,方便后续的测试。
1. 修改Hosts文件。
vim /etc/hosts# 添加以下内容(IP替换为本机地址)192.168.6.110 file.upload.com
2. 安装编译依赖。
yum install -y gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
2.2 安装依赖库与FastDFS
注: 本次部署安装所需的依赖包如下,可自行带官网下载。
2.2.1 安装libfastcommon
1. 解压。
tar -zxvf libfastcommon-1.0.7.tar.gz -C /usr/local
2. 编译。
cd /usr/local/libfastcommon-1.0.7 ./make.sh && ./make.sh install
3. 创建软链接。
# 创建软连接ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so
2.2.2 安装FastDFS
1. 解压。
tar -zxvf FastDFS_v5.05.tar.gz -C /usr/local
2. 编译。
cd /usr/local/FastDFS./make.sh && ./make.sh install
3. 创建软链接。
# 创建软连接ln -s /usr/bin/fdfs_trackerd /usr/local/bin ln -s /usr/bin/fdfs_storaged /usr/local/bin
2.3 配置Tracker服务
2.3.1 修改配置文件
cd /etc/fdfscp tracker.conf.sample tracker.conf vim tracker.conf
# 提供服务的端口port=22122# Tracker 数据和日志目录地址(根目录必须存在,子目录会自动创建)base_path=/upload_file/fastdfs/tracker# HTTP 服务端口http.server_port=8899
2.3.2 启动服务
1. 创建基础目录。
mkdir -p /upload_file/fastdfs/tracker
2. 放行端口。
firewall-cmd --add-port=22122/tcp --permanent firewall-cmd --reloadfirewall-cmd --zone=public --list-ports #查看端口是否放行
3. 启动Tracker服务。
service fdfs_trackerd start
4. 查看Tracker服务。
ps aux | grep fdfs_trackerdnetstat -tunlp | grep fdfs_trackerd netstat -tunlp | grep 22122
5. 设置开机自启动。
chkconfig fdfs_trackerd onchkconfig --list fdfs_trackerd #检查开机自启动是否成功
6. 查看目录结构.
data: storage_groups.dat:存储分组信息 storage_servers.dat:存储服务器列表logs: trackerd.log: tracker server 日志文件
2.4 配置Storage服务
2.4.1 修改配置文件
cd /etc/fdfscp storage.conf.sample storage.conf vim storage.conf
# 配置文件是否不生效,false 为生效disabled=false # 指定此 storage server 所在 组(卷)group_name=group1# storage server 服务端口port=23000# 心跳间隔时间,单位为秒 (这里是指主动向 tracker server 发送心跳)heart_beat_interval=30# Storage 数据和日志目录地址(根目录必须存在,子目录会自动生成)base_path=/upload_file/fastdfs/storage# 存放文件时 storage server 支持多个路径。这里配置存放文件的基路径数目,通常只配一个目录。store_path_count=1# 逐一配置 store_path_count 个路径,索引号基于 0。# 如果不配置 store_path0,那它就和 base_path 对应的路径一样。store_path0=/upload_file/fastdfs/file# FastDFS 存储文件时,采用了两级目录。这里配置存放文件的目录个数。 # 如果本参数只为 N(如: 256),那么 storage server 在初次运行时,会在 store_path 下自动创建 N * N 个存放文件的子目录。subdir_count_per_path=256# tracker_server 的列表 ,会主动连接 tracker_server# 有多个 tracker server 时,每个 tracker server 写一行tracker_server=file.upload.com:22122# 允许系统同步的时间段 (默认是全天) 。一般用于避免高峰同步产生一些问题而设定。sync_start_time=00:00sync_end_time=23:59# 访问端口http.server_port=8899
2.4.2 启动服务
1. 创建基础目录。
mkdir -p /upload_file/fastdfs/storage mkdir -p /upload_file/fastdfs/file
2. 放行端口。
firewall-cmd --add-port=23000/tcp --permanent firewall-cmd --reloadfirewall-cmd --zone=public --list-ports #查看端口是否放行
3. 启动Tracker服务。
service fdfs_storaged start
4. 查看Tracker服务。
ps aux | grep fdfs_storagednetstat -tunlp | grep fdfs_storaged netstat -tunlp | grep 23000
5. 检查Storage和Tracker是否在通信。
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
6. 设置开机自启动。
chkconfig fdfs_storaged onchkconfig --list fdfs_storaged #检查开机自启动是否成功
7. 查看目录结构。
Storage目录: base_path目录: data: logs: store_path0目录: N*N个子目录
2.5 文件上传测试
2.5.1 配置Client
cd /etc/fdfscp client.conf.sample client.confvim client.conf
base_path=/upload_file/fastdfs/client tracker_server=file.upload.com:22122
2.5.2 上传文件
1. 创建基础目录。
mkdir -p /upload_file/fastdfs/client
2. 上传测试。
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf image01.png# 返回示例 : group1/M00/00/00/wKgGbmgB_wqAMvwaAAfd-3Ali1Y874.png
3. 返回文件ID号解析。
group1: 组名M00: 磁盘/00/00: 目录wKgGbmgB_wqAMvwaAAfd-3Ali1Y874.png: 文件名
注:安装到此步骤,文件只能上传但是不能下载,下载文件需结合nginx。
2.6 Nginx集成与配置
注: nginx的安装可参考下文的nginx的安装与删除步骤,这里就不在过多阐述。
2.6.1 配置nginx
1. 解压nginx安装包后,到nginx安装目录。
cd /usr/local/nginx-1.26.3/
./configure --add-module=/usr/local/fastdfs-nginx-module/src --prefix=/usr/local/nginx --with-http_realip_module --with-http_stub_status_module --with-http_ssl_module --with-pcre
2. 编译安装。
make && make install
3. 查看nginx是否安装成功。
/usr/local/nginx/sbin/nginx -V
2.6.2 安装FastDFS-Nginx模块
tar -zxvf fastdfs-nginx-module_v1.16.tar.gz -C /usr/local cd /usr/local/nginx-1.26.3./configure --add-module=/usr/local/fastdfs-nginx-module/src -- prefix=/usr/local/nginxmake && make install
2.6.3 修改配置文件
cp /usr/local/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs vim /etc/fdfs/mod_fastdfs.conf
# Tracker Servertracker_server=file.upload.com:22122 # StorageServer 默认端口storage_server_port=23000# 如果文件ID的uri中包含/group**,则要设置为true url_have_group_name = true# Storage 配置的store_path0路径,必须和storage.conf中的一致 store_path0=/upload_file/fastdfs/file
2.6.4 修改nginx配置
修改nginx安装目录 conf目录 的 nginx.conf文件。
location ~/group([0-9])/M00 { ngx_fastdfs_module;}
2.6.4 启动Nginx
systemctl start nginx systemctl status nginx
2.6.5 上传下载测试
1. 放行端口。
firewall-cmd --add-port=8899/tcp --permanent firewall-cmd --reloadfirewall-cmd --zone=public --list-ports
2. 上传测试。
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf image02.png
3. 下载测试。
http://192.168.186.100:8899/group1/M00/00/00/wKi6ZGgDZyiANa5sAAOSq96enwo370.png# IP地址替换为自己的实际IP地址 # 8899: nginx监听端口号
3. 常见问题
3.1 严重错误: fdfs_define.h:没有那个文件或目录
1. 修改配置文件。
vim /usr/local/fastdfs-nginx-module/src/config
# 修改以下内容ngx_module_incs="/usr/include/fastdfs /usr/include/fastcommon/"CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
2. 重新编译安装。
cd /usr/local/nginx-1.26.3make clean # 清理旧编译文件./configure --add-module=/usr/local/fastdfs-nginx-module/src --prefix=/usr/local/nginx --with-http_realip_module --with-http_stub_status_module --with-http_ssl_module --with-pcremake && make install
3.2 include file "http.conf" not exists, line: "#include http.conf"
1. 解决方案: 可从FastDFS的源码中复制。
cp /usr/local/FastDFS/conf/http.conf /etc/fdfs
2. 重启nginx服务。
systemctl restart nginx systemctl status nginx
3.3 open file /etc/fdfs/mime.types fail
1. 解决方案: 缺什么补什么。
# 查找Nginx的mime.types路径(通常位于以下位置之一)ls /etc/nginx/mime.typesls /usr/local/nginx/conf/mime.types# 复制文件到FastDFS配置目录(假设路径为/usr/local/nginx/conf/mime.types)cp /usr/local/nginx/conf/mime.types /etc/fdfs/
2. 重启nginx服务。
systemctl restart nginxsystemctl status nginx
4. 附加: nginx的安装与卸载
4.1 安装
4.1.1 准备工作
# 安装编译依赖sudo yum install -y gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
下载失败可更换yum源(下载成功可忽略) (这边测试使用的centos版本是7.x,如果是centos8.x版本,请 手动更改版本号)。
1. 备份原有配置。
cd /etc/yum.repos.d/mkdir backupmv *.repo backup/ # 备份所有.repo文件到backup目录
2. 下载新YUM源配置文件。
# 重新下载阿里云源配置wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos- 7.repo
3. 修改配置文件。
sed -i 's/$releasever/7/g' /etc/yum.repos.d/CentOS-Base.repo # 手动指定系统版本号
4. 重建缓存。
yum clean all && yum makecache
4.1.2 解压
nginx的压缩包可自行到nginx官网下载。
tar -zxvf nginx-1.26.3.tar.gz -C /usr/localcd usr/local/nginx-1.26.3
4.1.3 配置编译选项
./configure --prefix=/usr/local/nginx --with-http_realip_module --with-http_stub_status_module --with-http_ssl_module --with-pcre
选项解析:
--prefix=/usr/local/nginx 指定nginx的安装目录--with-http_realip_module 启用真实客户端IP解析模块--with-http_stub_status_module 启用 基础状态监控模块 --with-http_ssl_module 启用 SSL/TLS 加密支持模块--with-pcre 指定 PCRE 库路径(Perl 兼容正则表达式库)
4.1.4 编译安装
make && make install
4.1.5 创建Systemd服务文件
vim /usr/lib/systemd/system/nginx.conf
[Unit]Description=Nginx Web ServerAfter=network.target[Service]chk=1&type=forkingPIDFile=/usr/local/nginx/logs/nginx.pidExecStart=/usr/local/nginx/sbin/nginxExecReload=/usr/local/nginx/sbin/nginx -s reloadExecStop=/usr/local/nginx/sbin/nginx -s quitPrivateTmp=true[Install]WantedBy=multi-user.target
4.1.6 重载配置并启动
sudo systemctl daemon-reloadsudo systemctl start nginxsudo systemctl stop nginxsudo systemctl restart nginxsudo systemctl enable nginx # 设置开机自启动sudo systemctl is-enabled nginx #enabled
4.1.7 验证
放开端口。
systemctl status nginxfirewall-cmd --add-port=80/tcp --permanent firewall-cmd --reloadfirewall-cmd --zone=public --list-ports
浏览器访问。
4.2 卸载
4.2.1 停止nginx服务
sudo systemctl stop nginx
4.2.2 关闭开机自启动
sudo systemctl disable nginxsudo systemctl is-enabled nginx #验证是否关闭开机自启动
4.2.3 删除源码安装目录
rm -rf /usr/local/nginx
4.2.4 删除Systemd服务文件
rm /usr/lib/systemd/system/nginx.service
4.2.5 检验是否删除成功
sudo systemctl status nginx # 应提示 "Unit nginx.service could not be found"which nginx