FastDFs分布式存储

发布于:2025-07-01 ⋅ 阅读:(24) ⋅ 点赞:(0)

一、 FastDFS 原理

        FastDFS 是一个开源的轻量级分布式文件系统,纯 C 实现,目前提供了 C、Java 和 PHP API。功能包括:文件存储,文件同步,文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务。

        Fast DFS 系统有三个角色:跟踪服务器(Tracker Server)、存储服务器(Storage Server)和客户端(Client)。client 请求 Tracker server 进行文件上传、下载,通过 Tracker server 调度最终由 Storage server 完成文件上传和下载,在底层存储上通过逻辑的分组概念,使得通过在同组内配置多个 Storage,从而实现软 RAID10。

1、FastDFS 架构

1.1、Tracker server

        跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的 Storage server 和 group。
        每个 storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳。tracker 上的元信息都是由 storage 汇报的信息生成的,本身不需要持久化任何数据,这样使得 tracker 非常容易扩展,直接增加 tracker 机器即可扩展为 tracker cluster 来服务,cluster 里每个 tracker 之间是完全对等的,所有的 tracker 都接受 stroage 的心跳信息,生成元数据信息来提供读写服务,tracker 根据 storage 的心跳信息,建立 group=>[storage server list] 的映射表。

1.2、Storage server

        存储服务器,主要提供容量和备份服务;以 group 为单位,每个 group 内部可以有多台 storage server,数据互为备份。客户端上传的文件最终存储在 storage 服务器上。Storage server 没有实现自己的文件系统,而是利用操作系统的文件系统来管理文件,可以将 storage 称为存储服务器。storage 可配置多个数据存储目录,比如有 10 块磁盘,分别挂载在 /data/disk1-/data/disk10,则可将这 10 个目录都配置为 storage 的数据存储目录。

1.3、Client

        客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。FastDFS 向使用者提供基本文件访问接口,比如 upload、download、append、delete 等,以客户端库的方式提供给用户使用。

        跟踪服务器和存储节点可由一台或多台服务器构成,均可随时增加或下线且不影响线上服务;跟踪服务器中所有服务器对等,能根据压力情况随时增减 

2、文件的上传

        Storage server 会连接集群中所有的 Tracker server,定时向它们报告自己的状态,包括磁盘剩余空间、文件同步状况、文件上传下载次数等统计信息。

上传机制
步骤 操作对象 选择 / 分配规则
(1) tracker server 集群不止一个时,客户端上传文件可任选一个;接收上传请求后为文件分配 group,规则有 Round robin(group 间轮询 )、Specified group(指定确定 group )、Load balance(剩余存储空间多 group 优先 )
(2) storage server 选定 group 后,在 group 内选,规则有 Round robin(storage 间轮询 )、First server ordered by ip(按 ip 排序 )、First server ordered by priority(按优先级排序,优先级在 storage 上配置 )
(3) storage path 分配好 storage server 后,storage 为文件分配数据存储目录,规则有 Round robin(存储目录间轮询 )、剩余存储空间最多的优先
(4) 生成 Fileid(文件标识) 选定存储目录后,由 storage server ip、文件创建时间、文件大小、文件 crc32 和随机数拼接成二进制串,经 base64 编码;还会按 fileid 两次 hash 选两级 256*256 子目录之一存储文件
(5) 生成文件名 文件存储到子目录后生成,由 group、存储目录、两级子目录、fileid、文件后缀名(客户端指定,区分类型 )拼接而成

3、文件的下载

        在 download file 时,客户端可选择任意 tracker server;tracker 发送 download 请求给某个 tracker 需带上文件名信息,tracker 从文件名解析出文件的 group、大小、创建时间等信息,然后为该请求选一个 storage 服务器读请求 。

(1)定位文件相关流程:客户端上传文件后,存储服务器返回文件 ID,文件 ID 用于以后访问该文件的索引信息。

文件索引信息包含:组名,虚拟磁盘路径,数据两级目录,文件名 。

内容 说明
组名 文件上传后所在的 storage 组名称,文件上传成功后由 storage 服务器返回,需客户端自行保存
虚拟磁盘路径 storage 配置的虚拟路径,与磁盘选项 store_path 对应。配置 store_path0 则是 M00,配置 store_path1 则是 M01,以此类推
数据两级目录 storage 服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件
文件名 与文件上传时不同,由存储服务器根据特定信息生成,包含源存储服务器 IP 地址、文件创建时间戳、文件大小、随机数和文件扩展名等信息

知道 FastDFS FID 的组成后,来看 FastDFS 通过 FID 定位需访问文件的方式:
(2)定位文件所在的 group:通过组名 tracker 快速定位客户端需访问的存储服务器组,选合适存储服务器供客户端访问。
(3)定位文件位置:存储服务器依据 “文件存储虚拟磁盘路径” 和 “数据文件两级目录”,快速定位到文件所在目录,再按文件名找到需访问文件 。

4、同步时间管理

        当一个文件上传成功后,客户端马上发起对该文件下载请求(或删除请求)时,tracker 是如何选定一个适用的存储服务器呢?其实每个存储服务器都需要定时将自身的信息上报给 tracker,这些信息就包括了本地同步时间(即,同步到的最新文件的时间戳)。而 tracker 根据各个存储服务器的上报情况,就能够知道刚刚上传的文件,在该存储组中是否已完成了同步。同步信息上报如下图:

写文件流程

        客户端写文件至 group 内一个 storage server 即视为写成功,该 storage server 写完后,由后台线程同步文件至同 group 内其他 storage server 。

binlog 与同步进度记录

        每个 storage 写文件后会写 binlog,binlog 含文件名等元信息(无文件数据 ),用于后台同步;storage 记录向同 group 内其他 storage 同步进度,进度以时间戳记录,需集群内 server 时钟同步,重启可续传 。

同步进度汇报与 tracker 处理

        storage 同步进度作为元数据汇报给 tracker;tracker 选读 storage 时参考同步进度,会整理 group 内各 storage 同步到其他 storage 的时间戳,取最小的作为对应 storage 的同步时间戳 ,如 group 内 A、B、C 三个 storage ,按规则为 C 及 A、B 生成同步时间戳 。

5、集成 Nginx

        FastDFS 通过 Tracker 服务器,将文件放在 Storage 服务器存储,但是同组存储服务器之间需要进入文件复制,有同步延迟的问题。
        假设 Tracker 服务器将文件上传到了 192.168.4.125,上传成功后文件 ID 已经返回给客户端。此时 FastDFS 存储集群机制会将这个文件同步到同组存储 192.168.4.126,在文件还没有复制完成的情况下,客户端如果用这个文件 ID 在 192.168.4.126 上取文件,就会出现文件无法访问的错误。
        而 fastdfs-nginx-module 可以重定向文件连接到文件上传时的源服务器取文件,避免客户端由于复制延迟导致的文件无法访问错误。
        另外,使用 nginx 反向代理后,后端可以以 HTTP 请求的方式来访问文件资源。访问 nginx 反向代理 + 上传文件时的 ID

二、FastDFs部署

资源列表

操作系统 配置 主机名 IP 备注
OpenEuler24 2C4G tracker01 192.168.10.101 跟踪服务器 1
OpenEuler24 2C4G tracker02 192.168.10.102 跟踪服务器 2
OpenEuler24 2C4G storage1 192.168.10.103 存储服务器 1
OpenEuler24 2C4G storage2 192.168.10.104 存储服务器 2
OpenEuler24 2C4G client 192.168.10.105 客户端
OpenEuler24 2C4G nginx 192.168.10.106 代理

1、基础环境布置

systemctl stop firewalld
setenforce 0

2、安装依赖环境

dnf -y install libtool zlib-devel pcre-devel libevent gcc
tar zxf libfastcommon-1.0.36.tar.gz
cd libfastcommon-1.0.36
./make.sh && ./make.sh install
cd /usr/lib64/
cp ./libfastcommon.so /usr/lib

3、源码编译Fastdfs

tar zxf fastdfs-5.11.tar.gz
cd fastdfs-5.11
./make.sh && ./make.sh install
cd /etc/fdfs/
cp tracker.conf.sample tracker.conf

4、配置tracker服务器

vim /etc/fdfs/tracker.conf

###编辑内容###
base_path=/fastdfs/tracker     #22行
store_group=group1             #53行


####创建base_path目录####
mkdir -p /fastdfs/tracker

####启动tracker服务####
/etc/init.d/fdfs_trackerd start

####查看监听####
ss -anpt | grep trackerd

初次启动,会在/fastdfs/tracker 目录下生成 logs、data 两个目录备注

5、配置storage服务器

cd /etc/fdfs/ && cp storage.conf.sample storage.conf && vim storage.conf

###编辑内容###
# 启用配置文件
disabled=false 
# storage 服务端口
port=23000 
# 数据和日志文件存储根目录
base_path=/fastdfs/storage 
# 第一个存储目录
store_path0=/fastdfs/storage 
# tracker 服务器 IP 和端口
tracker_server=192.168.10.101:22122 
# tracker 服务器 IP 和端口
tracker_server=192.168.10.102:22122 
#需要和 tracker 中的组名保持一致
group_name=group1 
# http 访问文件的端口
http.server_port=8888 


####创建base_path目录####
mkdir -p /fastdfs/storage

####启动tracker服务####
/etc/init.d/fdfs_storaged start

####查看监听####
ss -anpt | grep storaged

6、配置client节点

cd /etc/fdfs/ && cp client.conf.sample client.conf && vim client.conf

mkdir -p /fastdfs/client

7、测试

7.1、上传方法一:

fdfs_upload_file /etc/fdfs/client.conf test.jpg

7.2、上传方法二:

fdfs_test /etc/fdfs/client.conf upload  test.jpg

8、在所有 storage 节点安装 fastdfs-nginx-module 和 nginx

FastDFS 通过 Tracker 服务器将文件存于 Storage 服务器,同组 Storage 服务器间文件复制有同步延迟问题。如 Tracker 传文件到 storage01,成功返回文件 ID 给客户端后,FastDFS 存储集群机制会同步到同组 storage02 ,若文件未复制完,客户端用文件 ID 在 storage02 取文件会无法访问。

fastdfs-nginx-module 可重定向文件连接到源服务器取文件,避免因复制延迟致文件无法访问错误,解压后的该模块在 nginx 安装时使用。

storage 上的 nginx 用于访问具体文件,且需使用 fastdfs 模块 。

8.1、解压 fastdfs - nginx - module并修改配置文件

tar zxf fastdfs-nginx-module_v1.16.tar.gz
cd fastdfs-nginx-module && cd src  && vim config

###编辑内容###
ngx_addon_name=ngx_http_fastdfs_module
HTTP_MODULES="$HTTP_MODULES ngx_http_fastdfs_module"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_fastdfs_module.c"
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
CORE_LIBS="$CORE_LIBS -L/usr/lib -lfastcommon -lfdfsclient"
CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64 -DFDFS_OUTPUT_CHUNK_SIZE='256*1024' -DFDFS_MOD_CONF_FILENAME='\"/etc/fdfs/mod_fastdfs.conf\"'"

8.2、编译安装Nginx

tar zxf nginx-1.19.5.tar.gz
useradd nginx
cp /usr/include/fastcommon/* /usr/include/fastdfs/
cd nginx-1.19.5
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --add-module=/root/fastdfs-nginx-module/src/ --with-cc-opt="-Wno-error=format-truncation"
make && make install
ln -s /usr/local/nginx/sbin/* /usr/local/sbin/

8.3、配置FastDFs

cp /root/fastdfs-nginx-module/src/mod_fastdfs.conf  /etc/fdfs/
vim /etc/fdfs/mod_fastdfs.conf
###编辑内容###
# 连接超时时间(单位:秒 )
connect_timeout=10
# 用于存储日志的目录
base_path=/tmp  
# tracker 服务器 IP 和端口
tracker_server=192.168.10.101:22122  
# tracker 服务器 IP 和端口
tracker_server=192.168.10.102:22122  
# 表示是否需要在 url 中包含 group 名称,改为 true 时 url 会包含
url_have_group_name=true  
# 组名称,需和相关配置保持一致 
group_name=group1  
# storage 服务器服务端口 
storage_server_port=23000  
# 存储路径数量 
store_path_count=1  
# 存储路径 
store_path0=/fastdfs/storage  

cp /root/fastdfs-5.11/conf/http.conf /etc/fdfs
cp /root/fastdfs-5.11/conf/mime.types /etc/fdfs


# 创建从 FastDFS 数据目录到 M00 目录的符号链接
# 这允许通过 /fastdfs/storage/M00 路径访问实际存储的数据
ln -s /fastdfs/storage/data /fastdfs/storage/M00

8.4、配置Nginx

vim /usr/local/nginx/conf/nginx.conf
location /group1/M00 {

        ngx_fastdfs_module;

        }

9、部署代理

systemctl stop firewalld
setenforce 0
dnf -y install zlib-devel pcre-devel gcc 
tar zxf nginx-1.19.5.tar.gz
cd nginx-1.19.5
useradd nginx
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
make && make install
ln -s /usr/local/nginx/sbin/* /usr/local/sbin/
vim /usr/local/nginx/config/nginx.conf

###编辑内容###
upstream aaa {
    
    server 192.168.10.103:80;
    server 192.168.10.104:80;
    
    }

location / {
        
        proxy_pass http://aaa;
        
        }


#启动
nginx


网站公告

今日签到

点亮在社区的每一天
去签到