FastDFS分布式存储
·
目录
FasterDFS核心架构与组件
FastDFS 采用 C/S 架构,由以下核心组件构成:
- Tracker Server(跟踪服务器)
- 负责调度请求,管理存储节点状态(如负载、磁盘空间)。
- 客户端通过 Tracker 获取文件存储位置,实现负载均衡。
- 通常部署 2-3 台(高可用场景)。
- Storage Server(存储服务器)
- 实际存储文件,支持多组(Group)和组内多副本(Replication)。
- 每组可独立扩展,适合不同业务隔离(如图片组、视频组)。
- 默认使用 2 副本(可配置),确保数据冗余。
- Client(客户端)
- 提供文件上传/下载/删除等 API,支持 HTTP 和原生协议。
- 上传时自动分配存储节点,返回文件唯一标识(如
group1/M00/00/00/xxx.jpg)。
关键特性
- 高性能
- 单组存储节点可支持 1000+ QPS,适合高并发场景(如电商图片、短视频封面)。
- 文件分片存储(默认 256KB 分块),减少磁盘碎片。
- 高可用
- Tracker 无状态,可水平扩展。
- Storage 组内副本同步,支持自动故障切换。
- 低成本
- 使用普通服务器(无需专用存储硬件),适合中小型团队。
- 支持异步上传(先返回文件 ID,后台传输数据)。
- 扩展性
- 动态扩容:新增 Storage 节点后,数据自动均衡。
- 支持多租户:通过 Group 隔离不同业务数据。
典型应用场景
- 图片/视频存储
- 电商网站商品图片、社交平台用户头像、短视频封面。
- 示例:某电商平台使用 FastDFS 存储 10 亿级商品图片,单日访问量超 10 亿次。
- 日志/文档存储
- 日志文件、用户上传的文档(如 PDF、Word)。
- 示例:某金融公司用 FastDFS 存储交易日志,保留 1 年数据。
- CDN 边缘节点
- 作为 CDN 的源站,配合 Nginx 提供 HTTP 访问。
- 示例:某视频网站通过 FastDFS + Nginx 实现全球加速。
与其他系统的对比
| 特性 | FastDFS | Ceph | MinIO |
|---|---|---|---|
| 适用场景 | 小文件、高并发 | 块/对象/文件混合存储 | 对象存储(S3 兼容) |
| 部署复杂度 | 低(3 节点起步) | 高(需专业运维) | 中(支持 Kubernetes) |
| 性能 | 高(小文件优化) | 中(通用场景) | 中(依赖磁盘 I/O) |
| 成本 | 低(普通服务器) | 高(需 SSD/NVMe) | 中(支持机械盘) |
部署建议
- 硬件配置
- Tracker:4 核 8GB 内存(轻量级)。
- Storage:16 核 32GB 内存 + SSD(推荐 NVMe)。
- 网络:万兆网卡(高并发场景)。
- 监控方案
- 集成 Prometheus + Grafana 监控磁盘空间、I/O 延迟。
- 设置告警规则(如磁盘使用率 > 80%)。
- 备份策略
- 定期将数据备份到对象存储(如 S3)或磁带库。
- 使用
fdfs_monitor工具检查节点健康状态。
常见问题
- 文件访问 404
- 检查 Storage 节点是否启动,
/fastdfs/storage/data目录是否存在。 - 确认文件 ID 中的 Group 和路径是否正确。
- 检查 Storage 节点是否启动,
- 上传失败
- 检查 Tracker 配置的
base_path是否有写入权限。 - 确保 Storage 的
tracker_server地址正确。
- 检查 Tracker 配置的
- 性能瓶颈
- 单组 Storage 节点建议不超过 10 台。
- 使用
iostat -x 1监控磁盘 I/O 利用率。
文件的上传
客户端请求流程
- 连接 Tracker
- 客户端随机选择一个 Tracker Server 发起上传请求。
- Tracker 根据各 Storage 组的负载和磁盘空间,返回一个可用的 Storage 节点地址。
- 上传文件到 Storage
- 客户端直接与返回的 Storage 节点通信,上传文件。
- Storage 将文件存储到本地磁盘,并生成唯一标识(如
group1/M00/00/00/xxx.jpg)。
- 返回文件 ID
- Storage 将文件 ID 返回给客户端,客户端后续可通过此 ID 访问文件。
文件 ID 结构解析
group1/M00/00/00/xxx.jpg |
- group1:存储组名(可配置,如图片组、视频组)。
- M00:存储路径前缀(由
store_path0决定)。 - 00/00:二级目录(自动生成,避免单目录文件过多)。
- xxx.jpg:文件名(由 Storage 自动生成,通常为哈希值)。
文件的下载
直接访问流程
- 解析文件 ID
- 客户端从文件 ID 中提取 Group 名(如
group1)和路径(如M00/00/00/xxx.jpg)。
- 客户端从文件 ID 中提取 Group 名(如
- 连接 Tracker
- 客户端向 Tracker 请求
group1对应的 Storage 节点地址。
- 客户端向 Tracker 请求
- 下载文件
- 客户端直接与 Storage 节点通信,通过路径下载文件。
HTTP 访问流程(通过 Nginx)
- 拼接 URL
- 格式:
http://Storage节点IP/group1/M00/00/00/xxx.jpg。
- 格式:
- Nginx 处理请求
- Nginx 通过
mod_fastdfs模块解析路径,定位到 Storage 节点的实际文件。 - 如果文件不存在,返回 404;否则返回文件内容。
- Nginx 通过
同步时间管理
同步类型
- 主从同步(默认)
- 文件上传时,Storage 节点会同步到组内其他节点(默认 2 副本)。
- 同步延迟通常在毫秒级,但受网络带宽和磁盘 I/O 影响。
- 异步通知机制
- 主节点完成写入后,通过 TCP 连接通知从节点拉取数据。
- 从节点定期检查未同步的数据(通过
sync_wait_msec和sync_interval参数控制)。
关键配置参数
在 Storage 节点的配置文件 storage.conf 中:
sync_wait_msec=50 # 主节点等待从节点响应的超时时间(毫秒) | |
sync_interval=0 # 0 表示实时同步,>0 表示定时同步间隔(毫秒) | |
sync_start_time=00:00 # 定时同步的开始时间(如 00:00) | |
sync_end_time=23:59 # 定时同步的结束时间 |
- 实时同步(推荐):
设置sync_interval=0,确保数据实时一致,但可能增加网络负载。 - 定时同步(适合低峰期):
设置sync_interval=3600000(1 小时),在业务低峰期同步,减少对高峰期性能的影响。
时间管理的重要性
时间戳的作用
- 文件版本控制:
FastDFS 使用时间戳标记文件创建和修改时间,用于同步和过期清理。 - 故障恢复:
当节点重启后,通过时间戳判断哪些数据需要同步。
时间不同步的影响
- 数据不一致:
如果 Storage 节点时间不一致,可能导致同步逻辑错误(如主节点认为从节点已同步,但实际未完成)。 - 日志混乱:
时间戳错误会导致监控和故障排查困难。
时间同步方案
NTP(网络时间协议)
- 推荐方案:
所有 Tracker 和 Storage 节点部署 NTP 服务,同步到同一时间源(如阿里云 NTP 服务器)。 - 配置示例:
硬件时钟同步(可选)# 安装 NTPyum install -y ntp# 配置 NTP 服务器(如阿里云)echo "server ntp.aliyun.com iburst" > /etc/ntp.conf# 启动服务systemctl enable ntpdsystemctl start ntpd# 手动同步时间(测试用)ntpdate ntp.aliyun.com
- 适用场景:
对时间精度要求极高的场景(如金融交易),可配置硬件时钟(如 GPS 授时)。 - 成本:
需要专用硬件,成本较高,一般分布式系统无需此方案。
同步延迟监控与优化
监控同步状态
-
使用
fdfs_monitor工具:fdfs_monitor /etc/fdfs/client.conf list_all_servers输出示例:
[storage server id=103]IP: 192.168.10.103total space: 100GBfree space: 50GBlast sync time: 2023-10-01 12:00:00 # 最后一次同步时间sync to src ip: 192.168.10.104 delay: 0ms # 同步延迟 -
关键指标:
sync delay:同步延迟,应小于 100ms(实时同步场景)。last sync time:最后一次同步时间,应与当前时间接近。
优化同步性能
- 调整网络带宽:
- 使用万兆网卡或链路聚合(如 LACP),提升同步吞吐量。
- 优化磁盘 I/O:
- 使用 SSD 或 NVMe 存储,减少同步时的磁盘瓶颈。
- 减少同步数据量:
- 避免频繁上传大文件,或通过 CDN 缓存热点数据。
故障处理与恢复
同步中断处理
- 现象:
fdfs_monitor显示sync delay持续增大,或last sync time长时间未更新。 - 解决方案:
- 检查网络连通性(
ping和telnet测试)。 - 检查 Storage 节点日志(
/fastdfs/storage/logs/storaged.log)。 - 重启同步服务(谨慎操作,可能影响业务):
/etc/init.d/fdfs_storaged restart
- 检查网络连通性(
数据不一致恢复
- 手动同步工具:
FastDFS 提供fdfs_file_info和fdfs_download_file工具,可手动对比和修复数据。 - 重建副本:
如果从节点数据损坏,可删除该节点数据,并重新加入组(会自动从主节点同步)。
集成Nginx
- HTTP 访问支持
- FastDFS 默认通过 Tracker 和 Storage 的私有协议通信,集成 Nginx 后可通过 HTTP 直接访问文件(如
http://ip/group1/M00/00/00/xxx.jpg)。
- FastDFS 默认通过 Tracker 和 Storage 的私有协议通信,集成 Nginx 后可通过 HTTP 直接访问文件(如
- 负载均衡与高可用
- Nginx 可作为反向代理,均衡多个 Storage 节点的请求,避免单点故障。
- 静态资源优化
- 利用 Nginx 的缓存、压缩和连接复用功能,提升文件下载速度。
集成 Nginx 的步骤
安装 Nginx 和 FastDFS 的 Nginx 模块
-
安装依赖
yum install -y gcc pcre-devel zlib-devel openssl-devel -
下载并编译 Nginx
wget http://nginx.org/download/nginx-1.24.0.tar.gztar -zxvf nginx-1.24.0.tar.gzcd nginx-1.24.0 -
下载并编译 FastDFS 的 Nginx 模块
wget https://github.com/happyfish100/fastdfs-nginx-module/archive/refs/tags/V1.23.tar.gztar -zxvf V1.23.tar.gz -
编译 Nginx 并集成模块
./configure \--add-module=/path/to/fastdfs-nginx-module-1.23/src \--with-http_ssl_modulemake && make install
配置 Nginx
-
复制 FastDFS 模块配置文件
cp /etc/fdfs/mod_fastdfs.conf /etc/fdfs/ -
修改
mod_fastdfs.conftracker_server=192.168.10.101:22122 # Tracker 地址url_have_group_name=true # URL 中包含 Group 名store_path0=/fastdfs/storage/data # Storage 数据目录 -
创建 Nginx 配置文件
在/etc/nginx/conf.d/下创建fastdfs.conf:server {listen 80;server_name localhost;location /group1/M00 {ngx_fastdfs_module;root /fastdfs/storage/data;expires 30d; # 缓存 30 天}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}} -
启动 Nginx
nginx -t # 测试配置nginx # 启动
关键配置解析
mod_fastdfs.conf 核心参数
| 参数 | 说明 |
|---|---|
tracker_server | Tracker 地址,支持多个(用空格分隔)。 |
url_have_group_name | 必须设为 true,否则 URL 中无法包含 Group 名。 |
store_path0 | Storage 的数据目录,需与 FastDFS 的 store_path0 一致。 |
group_count | 如果配置了多个 Group,需指定 Group 数量。 |
Nginx 配置优化
- 缓存控制
expires 30d; # 浏览器缓存 30 天,减少重复请求 - Gzip 压缩
gzip on;gzip_types text/plain application/json application/javascript text/css; - 连接复用
keepalive_timeout 65;keepalive_requests 1000;
实验部署环境
两台追踪服务器、两台存储服务器、一台Nginx做方向代理
基础环境搭载
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 关闭SELinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
# 安装必要依赖
dnf install -y gcc libtool pcre-devel zlib-devel openssl-devel
安装FastDFS基础环境
# 创建安装目录
mkdir -p /usr/local/fastdfs
# 下载并安装 libfastcommon
cd /usr/local/src
tar -zxvf V1.0.48.tar.gz
cd libfastcommon-1.0.48
./make.sh
./make.sh install
# 下载并安装 FastDFS
cd /usr/local/src
tar -zxvf V6.08.tar.gz
cd fastdfs-6.08
./make.sh
./make.sh install
# 创建配置文件目录
mkdir -p /etc/fdfs
cp conf/* /etc/fdfs/
配置追踪服务器(Tracker Server)
在101和102上执行操作:
# 编辑追踪服务器配置文件
vim /etc/fdfs/tracker.conf
# 修改以下参数:
disabled=false # 启用服务
port=22122 # 监听端口
base_path=/data/fastdfs/tracker # 数据和日志存储路径
http.server_port=8080 # HTTP端口
store_lookup=0 # 存储服务器选择策略:0=轮询
store_group=group1 # 存储组名称
store_server=0 # 同组内服务器选择策略:0=轮询
tracker_server=192.168.10.101:22122 # 其他追踪服务器地址(本节点填自己)
tracker_server=192.168.10.102:22122 # 其他追踪服务器地址
log_level=info # 日志级别
max_connections=256 # 最大连接数
创建数据目录并启动服务
# 创建数据目录
mkdir -p /data/fastdfs/tracker
# 启动追踪服务
systemctl start fdfs_trackerd
systemctl enable fdfs_trackerd
# 检查服务状态
systemctl status fdfs_trackerd
配置存储服务器 (Storage Server)
在103和104上操作:
# 编辑存储服务器配置文件
vim /etc/fdfs/storage.conf
# 修改以下参数:
disabled=false # 启用服务
group_name=group1 # 存储组名称
port=23000 # 监听端口
base_path=/data/fastdfs/storage # 数据和日志存储路径
store_path_count=1 # 存储路径数量
store_path0=/data/fastdfs/storage # 第一个存储路径
tracker_server=192.168.10.101:22122 # 追踪服务器地址
tracker_server=192.168.10.102:22122 # 追踪服务器地址
http.server_port=8888 # HTTP端口
log_level=info # 日志级别
sync_wait_msec=500 # 同步等待时间(毫秒)
sync_interval=0 # 同步间隔(秒)
sync_start_time=00:00 # 同步开始时间
sync_end_time=23:59 # 同步结束时间
创建数据目录并启动服务
# 创建数据目录
mkdir -p /data/fastdfs/storage
# 启动存储服务
systemctl start fdfs_storaged
systemctl enable fdfs_storaged
# 检查服务状态
systemctl status fdfs_storaged
配置客户端(Client)
105操作
# 编辑客户端配置文件
vim /etc/fdfs/client.conf
# 修改以下参数:
base_path=/data/fastdfs/client # 基础路径
tracker_server=192.168.10.101:22122 # 追踪服务器地址
tracker_server=192.168.10.102:22122 # 追踪服务器地址
log_level=info # 日志级别
connect_timeout=2 # 连接超时时间(秒)
network_timeout=30 # 网络超时时间(秒)
http.tracker_http_port=8080 # 追踪服务器HTTP端口
创建数据目录
# 创建数据目录
mkdir -p /data/fastdfs/client
配置Nginx访问FastDFS
103、104上操作
# 下载并安装 Nginx
dnf install -y nginx
# 下载并安装 FastDFS-Nginx 模块
cd /usr/local/src
tar -zxvf V1.22.tar.gz
cd fastdfs-nginx-module-1.22
# 修改配置文件
vim src/config
# 将:
# CORE_INCS="$CORE_INCS /usr/local/include/fastdfs /usr/local/include/fastcommon/"
# 修改为:
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
# 复制配置文件
cp src/mod_fastdfs.conf /etc/fdfs/
# 编辑 FastDFS-Nginx 模块配置文件
vim /etc/fdfs/mod_fastdfs.conf
# 修改以下参数:
connect_timeout=2 # 连接超时时间(秒)
tracker_server=192.168.10.101:22122 # 追踪服务器地址
tracker_server=192.168.10.102:22122 # 追踪服务器地址
storage_server_port=23000 # 存储服务器端口
group_name=group1 # 存储组名称
url_have_group_name=true # URL包含组名
store_path_count=1 # 存储路径数量
store_path0=/data/fastdfs/storage # 第一个存储路径
# 复制 FastDFS 的 MIME 类型配置
cp /usr/local/src/fastdfs-6.08/conf/mime.types /etc/fdfs/
# 配置 Nginx
vim /etc/nginx/nginx.conf
# 在 http 块中添加:
include /etc/nginx/conf.d/*.conf;
# 创建 FastDFS 专用配置
vim /etc/nginx/conf.d/fastdfs.conf
# 添加以下内容:
server {
listen 80;
server_name localhost;
location ~ /group([0-9])/M00 {
ngx_fastdfs_module;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
# 启动 Nginx
systemctl start nginx
systemctl enable nginx
# 检查 Nginx 状态
systemctl status nginx
测试FastDFS安装
# 创建测试文件
echo "This is a test file for FastDFS" > /tmp/test.txt
# 上传文件
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /tmp/test.txt
# 输出示例:
# group1/M00/00/00/wKjIgF_2xI6Ae53dAAAB6uA7H9o334.txt
# 使用浏览器访问文件
# http://192.168.10.103/group1/M00/00/00/wKjIgF_2xI6Ae53dAAAB6uA7H9o334.txt
# 或
# http://192.168.10.104/group1/M00/00/00/wKjIgF_2xI6Ae53dAAAB6uA7H9o334.txt
更多推荐



所有评论(0)