FastDFS 文件系统

FastDFS 学习笔记

一、核心概念

  1. 定义:开源分布式文件系统,用于解决海量非结构化数据(图片、视频等)的存储与管理。

  2. 适用场景:高并发、大容量的文件存储场景,如电商图片存储、短视频平台文件管理。

二、架构组件

1. Tracker 服务器

  • 功能:负责调度和负载均衡,记录 Storage 服务器状态(存储组、磁盘空间、在线状态)。

  • 特点:不存储实际文件数据,支持分布式集群部署,避免单点故障。

2. Storage 服务器

  • 功能:实际存储文件数据,以 “组(Group)” 为单位组织。

  • 数据冗余:同组内 Storage 互为副本,保障数据可靠性,默认副本数可配置。

3. 客户端(Client)

  • 功能:提供文件上传、下载接口,与 Tracker 和 Storage 交互完成操作。

三、文件上传流程

  1. 客户端请求 Tracker:告知需上传文件,获取目标 Storage 节点。

  2. Tracker 调度:根据组负载情况选择目标组及组内 Storage 服务器,返回 IP、端口和存储路径。

  3. 客户端传输文件:与目标 Storage 建立连接,发送文件数据。

  4. Storage 存储文件:生成唯一文件名(组名 / 路径 / 哈希值_原始文件名),存储文件并记录元数据。

  5. 组内数据同步:异步复制文件至同组其他 Storage 节点,确保冗余。

四、文件下载流程

  1. 解析文件名:从文件名提取组名和路径。

  2. 客户端请求 Tracker:获取目标组内可用的 Storage 服务器列表。

  3. 选择节点下载:根据负载或网络延迟选择节点,建立连接读取文件。

  4. 容错机制:若节点故障,自动切换至其他可用节点。

五、关键技术点

1. 文件名设计

  • 格式:组名 / 存储路径 / 文件哈希值_原始文件名。

  • 作用:定位文件存储位置,保证唯一性,校验文件完整性。

2. 数据冗余与高可用

  • 副本机制:同组内多副本存储,故障时自动切换。

  • 故障转移:Tracker 实时监控 Storage 状态,故障节点自动下线。

3. 负载均衡

  • Tracker 动态感知 Storage 负载,调整调度策略,实现集群资源均衡。

六、应用实践

1. 部署步骤

  • 安装 Tracker 和 Storage 服务。

  • 配置 Tracker 地址、Storage 组信息。

  • 启动服务并测试上传下载。

2. 与 Nginx 集成

  • 使用 Nginx 作为 FastDFS 的访问代理,提升访问性能和安全性。

  • 配置 Nginx 反向代理,将请求转发至 FastDFS。

七、优缺点总结

1. 优点

  • 轻量级设计,适合中小文件存储。

  • 高并发处理能力强,支持海量文件存储。

  • 架构简单,易于部署和维护。

2. 缺点

  • 对大文件存储支持相对较弱。

  • 缺乏文件管理高级功能(如文件版本控制)。

如果你还有其他需求,比如添加配置示例、增加流程图等,欢迎随时告诉我。

八,示例

配置环境

IP地址主机名备注
192.168.10.101tracker01跟踪服务器1
192.168.10.102tracker02跟踪服务器2
192.168.10.103storage1存储服务器1
192.168.10.104storage2存储服务器2
192.168.10.105nginx代理服务器
1.基础环境
[root@tracker01 ~]# systemctl stop firewalld   ###关闭防火墙 
[root@tracker01 ~]# setenforce 0  ###关闭内核安全机制

在除代理服务器上安装以下软件

[root@tracker01 ~]# ls
fastdfs-nginx-module_v1.16.tar.gz  libfastcommon-1.0.36.tar.gz
fastdfs-5.11.tar.gz  nginx1.19.5.tar.gz
  • fastdfs-5.11.tar.gz:FastDFS 核心软件包,包含 Tracker 服务器和 Storage 服务器的运行程序、配置文件及脚本。安装后,Tracker 可实现调度和负载均衡,Storage 则用于存储文件数据,是搭建 FastDFS 文件存储系统的基础 。
  • libfastcommon-1.0.36.tar.gz:FastDFS 的公共函数库软件包,提供了 FastDFS 运行过程中常用的基础函数,如网络通信、文件操作、内存管理等功能。FastDFS 和fastdfs-nginx-module都依赖该库,以保证程序正常运行。
  • fastdfs-nginx-module_v1.16.tar.gz:FastDFS 与 Nginx 的集成模块,用于实现 Nginx 对 FastDFS 存储文件的访问代理。通过配置该模块,Nginx 可以处理对 FastDFS 文件的 HTTP 请求,实现文件的上传、下载和访问,同时还能提升文件访问性能和安全性。
  • nginx-1.19.5.tar.gz:Nginx 是一款高性能的 Web 服务器和反向代理服务器。在与 FastDFS 结合使用时,Nginx 作为反向代理服务器,接收客户端的文件访问请求,并通过fastdfs-nginx-module模块将请求转发到对应的 FastDFS Storage 服务器,实现文件的高效访问;同时 Nginx 自身也可用于处理静态资源、负载均衡、HTTPS 加密等功能。
2.安装libfastcommon

在所有节点安装(代理服务器除外)

# 使用dnf包管理器安装zlib开发库、GCC编译器、libtool工具、PCRE开发库、libevent库
# -y参数表示自动确认安装,无需手动输入确认
[root@tracker01 ~]# dnf -y install zlib-devel gcc libtool pcre-devel libevent

# 解压libfastcommon库的压缩包,将文件释放到当前目录
[root@tracker01 ~]# tar xf libfastcommon-1.0.36.tar.gz 

# 进入解压后的libfastcommon库目录
[root@tracker01 ~]# cd libfastcommon-1.0.36

# 执行make.sh脚本,该脚本通常用于配置编译环境、生成编译所需文件
[root@tracker01 libfastcommon-1.0.36]# ./make.sh 

# 执行安装操作,将编译好的libfastcommon库安装到系统中
[root@tracker01 libfastcommon-1.0.36]# ./make install

# 切换到系统64位库目录
[root@tracker01 libfastcommon-1.0.36]# cd /usr/lib64/

# 将/usr/lib64目录下的libfastcommon.so库文件复制到/usr/lib目录下
# 由于/usr/lib目录下可能已存在同名文件,系统提示是否覆盖,输入y表示确认覆盖
[root@tracker01 lib64]# cp libfastcommon.so /usr/lib
cp: 是否覆盖 '/usr/lib/libfastcommon.so'?y

3.安装编译FastDFS

在所有节点安装(代理服务器除外)

# 使用tar命令解压fastdfs-5.11.tar.gz压缩包,xf参数中,x表示解压,f表示使用归档文件
# 执行后,FastDFS的源代码及相关文件将被释放到当前目录
[root@tracker01 ~]# tar xf fastdfs-5.11.tar.gz 

# 进入解压后的fastdfs-5.11目录,后续操作将基于该目录内的文件进行
[root@tracker01 ~]# cd fastdfs-5.11

# 使用&&连接两个命令,表示前一个命令执行成功后才执行后一个命令
# 先执行./make.sh脚本,该脚本通常用于配置编译环境、生成编译所需文件,例如检查系统依赖、设置编译参数
# 当./make.sh执行成功后,继续执行./make.sh install命令,该命令将编译好的FastDFS程序、配置文件等安装到系统指定位置
# 从而完成FastDFS的安装过程
[root@tracker01 fastdfs-5.11]# ./make.sh && ./make.sh install
4.配置tracker服务器

Tracker节点操作

修改配置文件按需更改

# 将FastDFS安装目录下的Tracker配置示例文件复制到系统配置目录
# 这样可以基于示例文件进行修改,生成实际可用的Tracker配置文件
[root@tracker01 fastdfs-5.11]# cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf 

# 切换到FastDFS的配置文件目录,后续将对配置文件进行编辑
[root@tracker01 fastdfs-5.11]# cd /etc/fdfs 

# 使用vim编辑器打开Tracker配置文件,进行参数配置
[root@tracker01 fdfs]# vim tracker.conf

# 在tracker.conf配置文件中设置base_path参数为/fastdfs/tracker
# base_path指定了Tracker服务器存储数据和日志的基础目录
base_path=/fastdfs/tracker

# 在tracker.conf配置文件中设置store_group参数为group1
# store_group指定了默认的文件存储组,文件上传时若无特殊指定,将存储到该组
store_group=group1

# 创建Tracker服务器数据存储目录
# -p参数表示如果目录的上级目录不存在,则自动创建
[root@tracker01 fdfs]# mkdir -p /fastdfs/tracker

# 启动FastDFS的Tracker服务
# 先重新加载systemd管理服务,确保系统识别服务配置变更
# 然后通过systemctl命令启动fdfs_trackerd服务
[root@tracker01 fdfs]# /etc/init.d/fdfs_trackerd start
重新加载 systemd:  [  确定  ]
正在启动 fdfs_trackerd (via systemctl)[  确定  ]

初次启动,会在/fastdfs/tracker 目录下生成两个文件 logs,data

启动

/etc/init.d/fdfs_trackerd start

重启

fdfs_trackerd /etc/fdfs/tracker restart

/etc/init.d/fdfs_trackerd restart

/etc/fdfs 该目录是我们在./make.sh install脚本文件生成

5.配置Storage服务

Storage节点操作

配置文件按需更改

# 将FastDFS安装目录下的Storage配置示例文件复制到系统配置目录
# 以此为基础修改生成实际使用的Storage配置文件
[root@storage1 fastdfs-5.11]# cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf 

# 使用vim编辑器打开Storage配置文件,对各项参数进行配置修改
[root@storage1 fastdfs-5.11]# vim /etc/fdfs/storage.conf

# 设置Storage服务器所属的组名,需与Tracker配置中的默认存储组一致,此处设为group1
group_name=group1

# 定义Storage服务器数据和日志存储的基础目录,所有存储相关操作以此目录为基准
base_path=/fastdfs/storage

# 指定第一个数据存储路径,用于存放实际文件数据,此处与base_path保持一致
store_path0=/fastdfs/storage

# 设置Tracker服务器的地址和端口,Storage通过此地址与Tracker通信获取调度信息
# 可配置多个Tracker服务器地址,增强服务的可靠性和容错性
tracker_server=192.168.10.101:22122
tracker_server=192.168.10.102:22122

# 设置Storage服务器提供HTTP服务的端口号,用于通过HTTP协议访问存储的文件
http.server_port=8888

# 创建Storage服务器数据存储目录,-p参数表示若上级目录不存在则自动创建
[root@storage1 fastdfs-5.11]# mkdir  -p /fastdfs/storage

# 启动FastDFS的Storage服务
# 先重新加载systemd管理服务,确保系统识别服务配置变更
# 然后通过systemctl命令启动fdfs_storaged服务
[root@storage1 fastdfs-5.11]# /etc/init.d/fdfs_storaged start
重新加载 systemd:  [  确定  ]
正在启动 fdfs_storaged (via systemctl)[  确定  ]

查看进程

[root@storage1 fastdfs-5.11]# ps -ef |grep fdfs_storaged
root        3047       1  0 16:23 ?        00:00:02 /usr/bin/fdfs_storaged /etc/fdfs/storage.conf
root        3063    2328  0 16:29 pts/1    00:00:00 grep --color=auto fdfs_storaged

启动服务

/etc/init.d/fdfs_storaged start

重启服务

/etc/init.d/fdfs_storaged restart

fdfs_storaged /etc/fdfs/storage.conf restart

6.配置Client

配置文件按需更改

# 将FastDFS安装目录下的客户端配置示例文件复制到系统配置目录
# 以此为基础创建实际使用的客户端配置文件
[root@tracker01 tracker]# cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf 

# 使用vim编辑器打开客户端配置文件进行参数设置
[root@tracker01 tracker]# vim /etc/fdfs/client.conf

# 设置客户端存储日志和临时文件的基础路径
# 该路径应指向已存在且有写入权限的目录,通常与Tracker服务器的base_path保持一致
base_path=/fastdfs/tracker

# 指定Tracker服务器的地址和端口
# 客户端通过此地址与Tracker服务器建立连接,获取文件存储和访问的调度信息
# 配置多个Tracker地址可实现高可用,客户端会自动选择可用的Tracker服务器
tracker_server=192.168.10.101:22122
tracker_server=192.168.10.102:22122
7.测试上传文件
# 使用FastDFS客户端命令行工具上传文件
# 参数说明:
#   fdfs_upload_file:FastDFS提供的文件上传工具
#   /etc/fdfs/client.conf:指定客户端配置文件路径,包含Tracker服务器地址等信息
#   nyy.jpg:要上传的本地文件路径(当前目录下的nyy.jpg文件)
[root@tracker01 ~]# fdfs_upload_file /etc/fdfs/client.conf nyy.jpg 

# 上传成功后返回的文件标识符(File ID)
# 格式说明:
#   group1:文件存储的组名(Storage组)
#   M00:存储服务器的卷名(Volume)
#   00/00:文件在存储服务器上的路径层级
#   wKgKZ2hiUgWAannpAAEHewm5-_k737.jpg:文件名(由FastDFS生成的唯一哈希值)
group1/M00/00/00/wKgKZ2hiUgWAannpAAEHewm5-_k737.jpg

查看

[root@tracker01 fdfs]# curl -I http://192.168.10.104/group1/M00/00/00/wKgKaGhibweACHHlAAEHewm5-_k529_big.jpg
HTTP/1.1 200 OK
Server: nginx/1.19.5
Date: Mon, 30 Jun 2025 11:08:28 GMT
Content-Type: image/jpeg
Content-Length: 67451
Last-Modified: Mon, 30 Jun 2025 11:03:35 GMT
Connection: keep-alive
Accept-Ranges: bytes

文件上传位置

[root@storage1 00]# ls
wKgKaGhibweACHHlAAEHewm5-_k529_big.jpg    wKgKaGhibweACHHlAAEHewm5-_k529.jpg-m
wKgKaGhibweACHHlAAEHewm5-_k529_big.jpg-m  wKgKZ2hiUgWAannpAAEHewm5-_k737.jpg
wKgKaGhibweACHHlAAEHewm5-_k529.jpg
[root@storage1 00]# pwd
/fastdfs/storage/data/00/00

8.在所有Storage节点安装Fastdfs-nginx-module和nginx

FastDFS 通过 Tracker 服务器,将文件放在 Storage 服务器存储,但是同组存储服务器之间需要进入文件复制,有同步延迟的问题。假设 Tracker 服务器将文件上传到了storage01,上传成功后文件 ID已经返回给客户端。此时 FastDFs 存储集群机制会将这个文件同步到同组存储 storage02,在文件还没有复制完成的情况下,客户端如果用这个文件ID在storage02 上取文件,就会出现文件无法访问的错误。而 fastdfs-nginx-module 可以重定向文件连接到源服务器取文件,避免客户端由于复制延迟导致的文件无法访问错误。(解压后的 fastdfs-nginx-module 在 nginx 安装时使用)
storage 上的 nginx 是用于访问具体的文件,并且需要使用 fastdfs 模块。

解压并修改fastdfs-nginx-module
# 解压FastDFS与Nginx的集成模块压缩包
# 将文件释放到当前目录,以便后续编译安装该模块
[root@storage1 ~]# tar xf fastdfs-nginx-module_v1.16.tar.gz 

# 进入解压后的fastdfs-nginx-module目录
[root@storage1 ~]# cd fastdfs-nginx-module

# 进入模块的src目录,该目录包含模块的源代码和配置文件
[root@storage1 fastdfs-nginx-module]# cd src/

# 使用vim编辑器打开模块的配置文件,准备进行修改
[root@storage1 src]# vim config

# 以下是config文件中关键配置项的说明

# 设置Nginx模块名称为ngx_http_fastdfs_module
ngx_addon_name=ngx_http_fastdfs_module

# 将fastdfs模块添加到Nginx的HTTP模块列表中
# 这样Nginx在编译时会包含该模块
HTTP_MODULES="$HTTP_MODULES ngx_http_fastdfs_module"

# 指定模块源代码文件路径,让Nginx编译时包含该模块的C源代码
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_fastdfs_module.c"

# 设置编译时需要包含的头文件搜索路径
# 指向FastDFS和fastcommon库的头文件目录
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/local/include/fastcommon/"

# 设置编译时需要链接的库文件路径和库名称
# 指定fastcommon和fdfsclient库的位置和名称
CORE_LIBS="$CORE_LIBS -L/usr/lib -lfastcommon -lfdfsclient"

# 设置编译选项
# -D_FILE_OFFSET_BITS=64:支持大文件
# -DFDFS_OUTPUT_CHUNK_SIZE='256*1024':设置输出块大小为256KB
# -DFDFS_MOD_CONF_FILENAME='"/etc/fdfs/mod_fastdfs.conf"':指定模块配置文件路径
CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64 -DFDFS_OUTPUT_CHUNK_SIZE='256*1024' -DFDFS_MOD_CONF_FILENAME='\"/etc/fdfs/mod_fastdfs.conf\"'"

编译安装Nginx

# 解压Nginx源码包,准备编译安装Nginx
# 该版本为1.19.5,用户可根据需要选择其他版本
[root@storage1 ~]# tar xf nginx-1.19.5.tar.gz 

# 创建nginx用户,用于运行Nginx服务
# 这样可以避免使用root用户运行服务,提高安全性
[root@storage1 ~]# useradd nginx

# 进入解压后的Nginx源码目录
[root@storage1 ~]# cd nginx-1.19.5

# 将fastcommon库的头文件复制到FastDFS的头文件目录下
# 确保编译Nginx模块时能正确找到所需的头文件
[root@storage1 nginx-1.19.5]# cp /usr/include/fastcommon/* /usr/include/fastdfs/

# 执行Nginx的配置脚本,设置编译选项
[root@storage1 nginx-1.19.5]# ./configure --prefix=/usr/local/nginx --add-module=/root/fastdfs-nginx-module/src/ --with-cc-opt="-Wno-error=format-truncation"

# 配置选项说明:
# --prefix=/usr/local/nginx:指定Nginx的安装目录为/usr/local/nginx
# --add-module=/root/fastdfs-nginx-module/src/:添加FastDFS的Nginx模块,使Nginx能处理FastDFS文件请求
# --with-cc-opt="-Wno-error=format-truncation":忽略格式截断警告,避免编译时因警告而失败
注意:这里的-add-module后面的值就是刚刚拷贝的fastdfs-nginx-module的src
[root@storage1 nginx-1.19.5]# make && make install
[root@storage1 nginx-1.19.5]# ln -s /usr/local/nginx/sbin/* /usr/local/sbin/

配置Fastdfs

将fastdfs-nginx-module模块下的mod_fastdfs.conf文件拷贝到/etc/fdfs/目录

# 将FastDFS Nginx模块的配置示例文件复制到FastDFS配置目录
# mod_fastdfs.conf是Nginx与FastDFS交互的核心配置文件
[root@storage1 nginx-1.19.5]# cp /root/fastdfs-nginx-module/src/mod_fastdfs.conf  /etc/fdfs/

# 编辑FastDFS Nginx模块配置文件
[root@storage1 nginx-1.19.5]# vim /etc/fdfs/mod_fastdfs.conf 

# 设置Tracker服务器地址,支持多个地址(多行配置)
# Nginx通过这些地址与Tracker通信获取文件存储位置
tracker_server=192.168.10.101:22122
tracker_server=192.168.10.102:22122

# 启用URL中包含组名的模式(默认true)
# 例如:http://nginx-server/group1/M00/00/00/xxx.jpg
url_have_group_name =true

# 指定当前Storage服务器所属的组名
group_name=group1

# Storage服务器提供服务的端口(与storage.conf中的相同)
storage_server_port=23000

# 存储路径数量(通常为1)
store_path_count=1

# 第一个存储路径(与storage.conf中的store_path0一致)
store_path0=/fastdfs/storage

# 复制FastDFS的HTTP配置文件到配置目录
# http.conf包含FastDFS的HTTP服务相关配置
[root@storage1 nginx-1.19.5]# cp /root/fastdfs-5.11/conf/http.conf  /etc/fdfs/

# 复制MIME类型配置文件到配置目录
# mime.types定义了文件扩展名与MIME类型的映射关系
[root@storage1 nginx-1.19.5]# cp /root/fastdfs-5.11/conf/mime.types /etc/fdfs/

# 创建软链接,将实际存储目录映射到M00目录
# FastDFS存储文件时实际使用/data目录,但URL中使用/M00
# 此软链接确保Nginx能正确访问到实际文件
[root@storage1 nginx-1.19.5]# ln -s /fastdfs/storage/data/ /fastdfs/storage/M00

配置Nginx

修改nginx.conf文件,在http指令块中新增如下配置

# 匹配以/group1/M00开头的URL路径,通常对应FastDFS存储的文件请求
location /group1/M00 {
    # 启用ngx_fastdfs_module模块处理该路径请求
    # 该模块负责与FastDFS tracker和storage服务器通信
    # 将客户端请求转发到FastDFS集群获取实际文件内容
    ngx_fastdfs_module;
}

9.部署代理
[root@nginx ~]# dnf -y install gcc pcre-devel zlib-devel
[root@nginx ~]# tar xf nginx-1.19.5.tar.gz 
[root@nginx ~]# cd nginx-1.19.5
[root@nginx nginx-1.19.5]# useradd nginx
[root@nginx nginx-1.19.5]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install
[root@nginx nginx-1.19.5]# ln -s /usr/local/nginx/sbin/* /usr/local/sbin/
[root@nginx nginx-1.19.5]# vim /usr/local/nginx/conf/nginx.conf
http {
    # 包含MIME类型映射文件,用于识别不同文件类型对应的Content-Type
    include       mime.types;
    # 默认文件类型设为二进制流,确保未知类型文件能正确传输
    default_type  application/octet-stream;

    # 注释掉的日志格式配置,可记录客户端IP、请求时间、状态码等详细信息
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    # 注释掉的访问日志配置,可将请求信息记录到指定文件
    #access_log  logs/access.log  main;

    # 启用高效文件传输模式,减少用户空间到内核空间的拷贝
    sendfile        on;
    # 注释掉的TCP优化选项,可在数据包满时再发送
    #tcp_nopush     on;

    # 注释掉的长连接超时设置(0表示禁用)
    #keepalive_timeout  0;
    # 长连接超时时间设为65秒
    keepalive_timeout  65;

    # 注释掉的Gzip压缩功能,可减小传输数据量
    #gzip  on;

    # 定义名为group1的上游服务器组,用于负载均衡
    upstream group1 {
      # 指定两个后端服务器,可处理真实业务请求
      server 192.168.10.103:80;
      server 192.168.10.104:80;
      # 默认使用轮询算法分发请求
    }

    # 定义一个监听80端口的虚拟主机
    server {
        listen       80;
        server_name  localhost;

        # 设置响应字符集为UTF-8,避免中文乱码
        charset utf-8;

        # 注释掉的主机访问日志配置
        #access_log  logs/host.access.log  main;

        # 根路径请求(所有请求)的处理规则
        location / {
          # 将请求代理转发到upstream定义的服务器组
          proxy_pass http://group1;
        }

验证

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值