当前位置: 首页 > news >正文

FastDFS分布式储存

目录

一:介绍

二:FastDFS原理

1.FastDFS架构

1.1Tracker server

1.2Storage server

1.3Client

2.文件的上传

3.文件的下载

4.同步时间管理

5.集成Nginx

三:FastDFS部署

资源列表

1.基础环境

2.安装libfastcommon

3.安装编译FastDFS

4.配置tracker服务器

5.配置Storage服务

6.配置client

7.测试上传文件

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

9.部署代理


一:介绍

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


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

二:FastDFS原理

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

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

1.FastDFS架构

1.1Tracker server

跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的 Storage server 和 group,

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

1.2Storage server

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

1.3Client

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

      增加或者下线不会影响线上服务,其中跟踪服务器中所有服务器是对等,可以根据服务器压力情况随时增加或减少。

2.文件的上传

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

上传的内部机制如下:

(1)选择 tracker server
当集群中不止一个 tracker server 时,由于 tracker 之间是完全对等的关系,客户端在 upload 文件时可以任意选择一个 tracker。当 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 则是 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。

      每个 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 接收到这些同步进度信息时,就会进行整理,将最小的那个做为 C 的同步时间戳,本例中 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部署

FastDFS 下载地址:https://github.com/happyfish100
(1)fastdfs
(2)libfastcommon
(3)fastdfs-nginx-module
(4)nginx-1.18.0

资源列表
操作系统配置主机名IP备注
OpenEuler242C4Gtracker01192.168.10.101跟踪服务器 1
OpenEuler242C4Gtracker02192.168.10.102跟踪服务器 2
OpenEuler242C4Gstorage1192.168.10.103存储服务器 1
OpenEuler242C4Gstorage2192.168.10.104存储服务器 2
OpenEuler242C4Gnginx192.168.10.105代理服务器

1.基础环境

#在所有节点上关闭防火墙和selinux
systemctl stop firewalld
setenforce 0

2.安装libfastcommon

dnf -y install zlib-devel gcc libtool pcre-devel 
dnf -y install libevent#上传安装软件包
libfastcommon-1.0.36.tar.gz
fastdfs-5.11.tar.gz#解压软件包
tar zxvf libfastcommon-1.0.36.tar.gz
cd libfastcommon-1.0.36
./make.sh		#编译
./make.sh	 install 		#安装
cd /usr/lib64
ll libfast*		#查看以libfast开头的内容
cp libfastcommon.so /usr/lib		#覆盖原有模块文件

3.安装编译FastDFS

tar zxvf fastdfs-5.11.tar.gz
cd fastdfs-5.11
./make.sh		#编译
./make.sh	 install 		#安装

4.配置tracker服务器

(追踪节点):
cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
#修改配置文件
vim /etc/fdfs/tracker.conf#修改的内容如下:disabled=false 	# 启用配置文件port=22122 	#tracker服务器端口(默认 22122)base_path=/fastdfs/tracker 	# 存储日志和数据的根目录store_group=group1 	#设置存储组名称
#创建base_path指定目录
mkdir -p /fastdfs/tracker
#启动tracker服务器
/etc/init.d/fdfs_tracker start

5.配置Storage服务

存储节点):
cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
#修改配置文件
vim /etc/fdfs/storage.conf#修改的内容如下:url_have_group_name=Turedisabled=false 	#启用配置文件port=23000 	#storage服务端口base_path=/fastdfs/storage # 数据和日志文件存储根目录store_path0=/fastdfs/storage 	#第一个存储目录tracker_server=192.168.10.201:22122 tracker_server=192.168.10.202:22122 #tracker 服务器 IP 和端口group_name=group1 #需要和 tracker 中的组名保持一致http.server_port=8888 		# http 访问文件的端口#创建基础数据目录
mkdir -p /fastdfs/storage
#启动storage服务器,并检查进程
/etc/init.d/fdfs_storaged start
ps -ef | grep fastdfs_storaged

6.配置client

cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
#创建base_path指定目录
mkdir -p /fastdfs/tracker
#修改配置文件
vim /etc/fdfs/client.conf#修改的内容如下:base_path=/fastdfs/tracker 	# 存储日志和数据的根目录tracker_server=192.168.10.201:22122 tracker_server=192.168.10.202:22122 

7.测试上传文件

上传文件(图片logo.jpg)
fdfs_upload_file /etc/fdfs/client.conf logo.jpg
方法2:
fdfs_test /etc/fdfs/client.conf upload logo.jpg#在104上进行查看
cd /fastdfs/storage
cd data/
ll

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

#解压安装包
tar zxvf fastdfs-nginx-module_v1.16.tar.gz
cd fastdfs-nginx-module/
cd src/
vim config#修改路径#解压安装包
tar zxvf nginx-1.19.5.tar.gz
cd nginx-1.19.5
cp /usr/include/fastcommon/* /usr/include/fastdfs/
#编译安装
./configure --prefix=/usr/local/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/
#配置fastDFS
cd fastdfs-nginx-module
cd src/
cp mod_fastdfs.conf /etc/fdfs/
vim /etc/fdfs/mod_fastdfs.conf#修改参数如下:connect_timeout=10
base_path=/tmp #用户存储日志的
tracker_server=192.168.10.201:22122 
tracker_server=192.168.10.202:22122#tracker 服务器 IP 和端口
tracker_url_have_group_name=true 
#(这个表示是否需要增加一个上述自定义名字的需要,改为 true,url 中包含 group 名称)
group_name=group1
storage_server_port=23000
store_path.count=1
store_path0=/fastdfs/storagecd fastdfs-5.11
cd conf/
#复制fastdfs的部分配置文件到/etc/fdfs
cp http.conf /etc/fdfs
cp mime.types /etc/fdfs
#创建软链接
ln -s /fastdfs/storage/data /fastdfs/storage/M00
vim /usr/local/nginx/conf/nginx.conf
添加内容:location /group1/M00 {ngx_fastdfs_module;}#启用nginx配置文件
/usr/local/nginx/sbin/nginx -t浏览器访问:
http://192.168.10.203/group1/M00/00/00/图片.jpg
http://192.168.10.204/group1/M00/00/00/图片.jpg

9.部署代理

#部署环境安装
dnf -y install zlib-devel gcc pcre-devel
#上传安装软件
nginx-1.19.5.tar.gz
#解压安装包
tar zxvf 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/nginx /usr/local/sbin
vim /usr/local/nginx/conf/nginx.conf

相关文章:

  • 【Linux】regmap子系统
  • WEB JWT
  • Java程序员如何设计一个高并发系统?
  • Go 语言安装指南:并解决 `url.JoinPath` 及 `Exec format error` 问题
  • 全栈监控系统架构
  • 大白话解释蓝牙的RPC机制
  • LeetCode 2917.找出数组中的K-or值
  • Linux612 chroot_list开放;FTP服务ftp:get put,指定上传路径报错553;ftp查看文件夹权限
  • Vulkan学习笔记4—图形管线基础
  • ubuntu20.04 安装Mujoco 及 Isaac Gym 仿真器
  • 紫光展锐完成优化升级,支持Android 16,以科技创新共赴智能体验新篇章
  • 常见的测试工具及分类
  • 系统功耗管理
  • 从零搭建智能家居:香橙派+HomeAssistant实战指南
  • 【android bluetooth 框架分析 04】【bt-framework 层详解 6】【Properties介绍】
  • Springboot仿抖音app开发之消息业务模块后端复盘及相关业务知识总结
  • php反序列化漏洞学习
  • [安卓按键精灵辅助工具]一些安卓端可以用的雷电模拟器adb命令
  • 关于安卓dialogFragment中,EditText无法删除文字的问题
  • Android NTP自动同步时间机制
  • 如何学做网站优化/品牌软文案例
  • netbean做网站/信息流广告
  • 建设网站大全/seo sem是啥
  • 做招聘网站需要哪些手续/真正免费的网站建站
  • 个人网页简历设计/建网站seo
  • 与国外公司合作网站建设上海公司/百度推广优化怎么做的