FastDFS分布式存储

前言

在大数据与云计算飞速发展的今天,海量非结构化数据(如图片、视频、文档)的存储与管理成为企业面临的重大挑战。传统单机存储方案受限于容量、性能和可靠性,已难以满足高并发、高可用和横向扩展的需求。FastDFs 作为一款开源的轻量级分布式文件系统,凭借其简洁高效的设计、良好的横向扩展能力及低成本的实现方案,成为中小型企业构建私有云存储或处理海量文件场景的优选方案。本课件将带您系统了解 FastDFs 的核心架构、工作原理,并手把手演示其单机及集群环境的搭建流程,结合实际应用场景剖析其优缺点,帮助您快速掌握这一技术工具,为分布式存储系统的实践与应用奠定基础

一. 介绍

FastDFS 是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等

FastDFs 为互联网量身定制,充分考虑了几余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用 FastDFS 很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务

二. FastDFS 原理

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

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

1. FastDFS 架构

(1)Tracker server

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

(2)Storage server

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

(3)Client

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

在这里插入图片描述
跟踪服务器和存储节点都可以由一台或多台服务器构成,跟踪服务器和存储节点均可以随时增加或者下线不会影响线上服务,其中跟踪服务器中所有服务器是对 等,可以根据服务器压力情况随时增加或减少

2. 文件的上转

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

上传的内部机制如下:

(1)选择tracker server
当集群中不止一个 tracker server 时,由于 tracker 之间是完全对等的关系,客户端在 upload 文件时可以任意选择一个 trakcer。当 tracker 接收到 upload file 的请求时,会为该文件分配一个可以存储该文件的group,支持如下选择 group 的规则:
Round robin,所有的 group 间轮询
Specified group,指定某一个确定的 group
Load balance,剩余存储空间多 group 优先

(2)选择storage server
当选定 group 后,tracker 会在 group 内选择一个 storage server 给客户端,支持如下选择 storage 的规则:
Round robin,在group 内的所有 storage 间轮询
First server ordered by ip,按ip排序
First server ordered by priority,按优先级排序(优先级在 storage 上配置)

(3)选择storage path
当分配好 storage server 后,客户端将向 storage 发送写文件请求,storage 将会为文件分配一个数据存储目录,支持如下规则:
Round robin,多个存储目录间轮询
剩余存储空间最多的优先

(4)生成Fileid(文件标识)
选定存储目录之后,storage 会为文件生一个Fileid,由 storage server ip、文件创建时间、文件大小、文件 crc32 和一个随机数拼接而成,然后将这个二进制串进行 base64编码,转换为可打印的字符串。 选择两级目录 当选定存储目录之后,storage 会为文件分配一个 fileid,每个存储目录下有两级 256*256 的子目录,storage 会按文件 fileid进行两次 hash(猜测),路由到其中一个子目录,然后将文件以 fileid 为文件名存储到该子目录下

(5)生成文件名
当文件存储到某个子目录后,即认为该文件存储成功,接下来会为该文件生成一个文件名,文件名由 group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。

3. 文件的下载

在这里插入图片描述
跟upload file一样,在download file时客户端可以选择任意 tracker server。tracker发送 download 请求给某个 tracker,必须带上文件名信息,tracke 从文件名中解析出文件的 group、大小、创建时间等信息,然后为该请求选择一个 storage 服务器用来读请求

(1)定位文件

客户端上传文件后存储服务器将文件 ID返回给客户端,此文件 ID用于以后访问该文件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名

group1 /M00 /02/44/ WKGDrE34E8WAAAAAAAAGKEIYJK42378.sh

组名:文件上传后所在的 storage 组名称,在文件上传成功后有 storage 服务器返
回,需要客户端自行保存

虚拟磁盘路径:storage配置的虚拟路径,与磁盘选项store_path*对应。如果配置了 store path0 则是 MO0,如果配置了 store path1 则是 M01,以此类推

数据两级目录:storage服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件

文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器 IP 地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息

知道 FastDFS FID的组成后,我们来看看 FastDFs 是如何通过这个精巧的FID 定位到需要访问的文件:

(2)定位文件所在的 group

通过组名 tracker能够很快的定位到客户端需要访问的存储服务器组,并将选择合适的存储服务器提供客户端访问

(3)定位文件位置

存储服务器根据“文件存储虚拟磁盘路径”和“数据文件两级目录”可以很快定位到文件所在目录,并根据文件名找到客户端需要访问的文件

在这里插入图片描述

4. 同步时间管理

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

在这里插入图片描述

写文件时,客户端将文件写至 group内一个 storage server 即认为写文件成功,storageserver 写完文件后,会由后台线程将文件同步至同group 内其他的 storage server

每个storage 写文件后,同时会写一份 binlog,binlog 里不包含文件数据,只包含文件名等元信息,这份binlog用于后台同步,storage 会记录向 group 内其他 storage 同步的进度,以便重启后能接上次的进度继续同步;进度以时间戳的方式进行记录,所以最好能保证集群内所有 server 的时钟保持同步

storage 的同步进度会作为元数据的一部分汇报到tracker上,tracke 在选择读storage 的时候会以同步进度作为参考。比如一个 group 内有 A、B、C三个 storage server,A向C同步到进度为T1(T1以前写的文件都已经同步到B上了),B向C同步到时间戳为T2(T2 >T1),tracker 接收到这些同步进度信息时,就会进行整理,将最小的那个做为(的同步时间戳,本例中T1即为C的同步时间戳为 T1(即所有T1以前写的数据都已经同步到C上了);同理,根据上述规则,tracker 会为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备注
OpenEuler242C4Gtrcaker01192.168.10.101跟踪服务器1
OpenEuler242C4Gtrcaker02192.168.10.102跟踪服务器2
OpenEuler242C4Gstorage1192.168.10.103存储服务器1
OpenEuler242C4Gstorage2192.168.10.104存储服务器2
OpenEuler242C4Gnginx192.168.10.105代理服务器

1. 基础环境

①:关闭firewalld防火墙

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld

②:关闭内核安全机制

[root@localhost ~]# setenforce 0
[root@localhost ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/sysconfig/selinux 

2. 安装libfastcommon

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

## 安装依赖软件包
[root@localhost ~]# dnf -y install gcc zlib-devel libtool pcre-devel libevent

## 解压安装包
[root@localhost ~]# tar zxf libfastcommon-1.0.36.tar.gz 

## 切换解压包
[root@localhost ~]# cd libfastcommon-1.0.36

## 编译
[root@localhost libfastcommon-1.0.36]# ./make.sh

## 安装
[root@localhost libfastcommon-1.0.36]# ./make.sh install

## 切换 64 位共享库
[root@localhost libfastcommon-1.0.36]# cd /usr/lib64

## 查看当前目录以 'libfast'开头的所有文件
[root@localhost lib64]# ll libfast*
-rwxr-xr-x. 1 root root 779632  4716:37 libfastcommon.so
lrwxrwxrwx. 1 root root     20 127日 01:29 libfastjson.so -> libfastjson.so.4.3.0
lrwxrwxrwx. 1 root root     20 127日 01:29 libfastjson.so.4 -> libfastjson.so.4.3.0
-rwxr-xr-x. 1 root root  55856 127日 01:30 libfastjson.so.4.3.0

## 为 libfastcommon.so 的共享库文件复制到 /usr/lib 目录
[root@localhost lib64]# cp libfastcommon.so /usr/lib
cp: 是否覆盖 '/usr/lib/libfastcommon.so'?y
[root@localhost lib64]#

3. 安装编译 FastDFS

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

## 解压安装包
[root@localhost ~]# tar zxf fastdfs-5.11.tar.gz 

## 切换解压包
[root@localhost ~]# cd fastdfs-5.11

## 编译
[root@localhost fastdfs-5.11]# ./make.sh

## 安装
[root@localhost fastdfs-5.11]# ./make.sh install

4. 配置 tracker 服务器

Tracker 节点操作

[root@localhost ~]# cd /etc/fdfs/
[root@localhost fdfs]# ls
client.conf.sample  storage.conf.sample  storage_ids.conf.sample  tracker.conf.sample
[root@localhost fdfs]# cp tracker.conf.sample tracker.conf
[root@localhost fdfs]# vim tracker.conf
## 启用配置文件
disabled=false
## tracker 服务器端口(默认 22122)
port=22122
## 存储日志和数据的根目录
base_path=/fastdfs/tracker
## 设置存储组名称
store_group=group1

## 启动tracker 服务
[root@localhost fdfs]# /etc/init.d/fdfs_trackerd start
重新加载 systemd:  [  确定  ]
正在启动 fdfs_trackerd (via systemctl)[  确定  ]
## 重启服务
[root@localhost fdfs]# fdfs_trackerd /etc/fdfs/tracker.conf restart
waiting for pid [2639] exit ...
starting ...

5. 配置 Storage 服务

Storage 节点操作

[root@localhost ~]# cd /etc/fdfs/
[root@localhost fdfs]# ls
client.conf.sample  storage.conf.sample  storage_ids.conf.sample  tracker.conf.sample
[root@localhost fdfs]# cp storage.conf.sample storage.conf
[root@localhost fdfs]# 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_server=192.168.10.102:22122
## 需要和 tracker 中的组名保持一致
group_name=group1
## http 访问文件的端口
http.server_port=8888


## 创建基础数据目录
[root@localhost fdfs]# mkdir -p /fastdfs/storage
## 启动 storage 服务器,并检查进程
[root@localhost fdfs]# /etc/init.d/fdfs_storaged start
重新加载 systemd:  [  确定  ]
正在启动 fdfs_storaged (via systemctl)[  确定  ]
[root@localhost fdfs]# ps -ef | grep fdfs_storaged
root        3002       1 26 14:28 ?        00:00:06 /usr/bin/fdfs_storaged /etc/fdfs/storage.conf
root        3014    2041  0 14:28 pts/1    00:00:00 grep --color=auto fdfs_storaged
[root@localhost fdfs]# fdfs_storaged /etc/fdfs/storage.conf restart
waiting for pid [3338] exit ...
starting ...

6. 配置 client

在任意一个 Fastdfs 节点上配置

[root@localhost ~]# mkdir -p /fastdfs/tracker/
[root@localhost ~]# cd /etc/fdfs/
[root@localhost fdfs]# ls
client.conf.sample  storage.conf.sample  storage_ids.conf.sample  tracker.conf  tracker.conf.sample
[root@localhost fdfs]# cp client.conf.sample client.conf
[root@localhost fdfs]# vim client.conf
base_path=/fastdfs/tracker
tracker_server=192.168.10.101:22122
tracker_server=192.168.10.102:22122

7. 测试上传文件

上转文件的两种方式

[root@localhost ~]# fdfs_upload_file /etc/fdfs/client.conf logo.png
[root@localhost ~]# fdfs_test /etc/fdfs/client.conf upload logo.png

在这里插入图片描述

在 Storage 节点上查看上转内容

在这里插入图片描述

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

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

①:解压并修改 fastdfs-nginx-module的配置文件

在这里插入图片描述

在这里插入图片描述

②:编译安装Nginx

解包;配置;编译安装

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

③:配置 FastDFS

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

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

复制 FastDFs 的部分配置文件到/etc/fdfs 目录

在这里插入图片描述

④:配置 Nginx

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

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

在这里插入图片描述
在这里插入图片描述

⑤:打开浏览器测试

浏览器访问图片

http://192.168.10.103/group1/M00/00/00/wKgKaGhCqaeAW3bWAABYaDn_Xo8397_big.png
http://192.168.10.104/group1/M00/00/00/wKgKaGhCqaeAW3bWAABYaDn_Xo8397_big.png

在这里插入图片描述
在这里插入图片描述

9. 部署代理

①:关闭firewalld防火墙和Selinux安全机制,并安装依赖包

在这里插入图片描述

②:解包,配置。编译,安装

在这里插入图片描述
在这里插入图片描述

③:修改nginx.conf 配置文件

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

在这里插入图片描述
在这里插入图片描述

重启服务

在这里插入图片描述

④:浏览器访问测试

http://192.168.10.105/group1/M00/00/00/wKgKaGhCqaeAW3bWAABYaDn_Xo8397_big.png

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值