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

FastDFS分布式存储

目录

一:介绍

二:FastDFS 原理

1.FastDFS架构

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)为载体的
在线服务。

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 cluster 来服务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.文件的上传

  1. 客户端向 Tracker Server 发送上传请求,获取可用的 Storage Server 信息。
  2. Tracker Server 根据负载均衡策略(如轮询、存储空间优先等),返回一台 Storage Server 的地址和端口。
  3. 客户端直接与该 Storage Server 建立连接,发送文件数据。
  4. Storage Server 接收文件并存储,生成唯一的文件标识(File ID),返回给客户端。

3.文件的下载

  1. 客户端向 Tracker 发送文件下载请求,携带文件标识(File ID)。
  2. Tracker 根据 File ID 解析出文件所在的 Storage 组和节点信息,返回给客户端。
  3. 客户端直接与目标 Storage 通信,请求下载文件。
  4. Storage 返回文件数据,客户端接收并保存。

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向0同步到进度为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备注
openeuler2C4Gtracker01192.168.10.101跟踪服务器1
openeuler2C4Gtracker02192.168.10.102跟踪服务器2
openeuler2C4Gstorage1192.168.10.103存储服务器1
openeuler2C4Gstorage2192.168.10.104存储服务器2
openeuler2C4Gnginx192.168.10.105代理服务器

1.基础环境

关闭防火墙,内核安全机制

2.安装libfastcommon

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

3.安装编译FastDFS

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

4.配置tracker服务器

修改配置文件

tracker节点

#修改的内容如下:
disabled=false      #启用配置文件

port=22122 # tracker 服务器端口(默认 22122)

base_path=/fastdfs/tracker    #存储日志和数据的根目录

store group=group1    #设置存储组名称
创建指定目录,启动服务

5.配置Storage服务

修改配置文件

#修改的内容如下:

disabled=false    #启用配置文件

port=23000  # storage 服务端口

base path=/fastdfs/storage      #数据和日志文件存储根目录

store path0=/fastdfs/storage     #第一个存储目录 

tracker server=192.168.10.101:22122# tracker 服务器 IP 和端囗tracker server=192.168.10.102:22122 # tracker 服务器 IP 和端囗

group name=group1         #需要和 tracker 中的组名保持一致

http.server port=8888      # http 访问文件的端口

创建基础数据目录,启动 storage 服务器

备注:
重启用如下命令:

/etc/fdfs/storage.conf restart

6.配置client

在任意一个 Fastdfs 节点上配置

#修改以下配置,其它保持默认

base path=/fastdfs/tracker

tracker server=192.168.10.101:22122    # tracker 服务器 IP 和端囗

tracker server=192.168.10.102:22122        # tracker 服务器 IP 和端囗

7.测试上传文件

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的配置文件

编译安装nginx

配置FastDFS

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 的部分配置文件到/etc/fdfs 目录

在/fastdfs/storage 文件存储目录下创建软连接,将其链接到实际存放数据的目录

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

# 添加以下内容:
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;
    }
}

浏览器访问图片

http://192.168.10.103/group1/M00/00/00/wKgKZ2givpCAeaAYAArXDtvrj5I361_big.jpg

9.部署代理

192.168.10.105/group1/M00/00/00/wKgKZ2givpCAeaAYAArXDtvrj5I361_big.jpg

相关文章:

  • web3 资讯网址
  • Web 架构之 Kubernetes 弹性伸缩策略设计
  • 如何将 iPhone 中的短信导出为 PDF
  • C/C++ 面试复习笔记(6)
  • 一[3]、ubuntu18.04环境 利用 yolov8 训练开源列车数据集,并实现列车轨道检测
  • Java基于SpringBoot的牙科诊所管理系统,附源码+文档说明
  • Springboot实现Java程序和线程池的优雅关闭
  • 计算机视觉之三维重建(深入浅出SfM与SLAM核心算法)—— 1. 摄像机几何
  • Oracle DG库手动注册归档日志的两种方法
  • 【报错解决】RTX4090 nvrtc: error: invalid value for --gpu-architecture (-arch)
  • Android 手机操作系统的14个常见问题以及解决办法
  • PostgreSQL认证怎么选?PGCP中级认证、PGCM高级认证
  • Git 常用总结
  • 【Net】TCP/IP 协议
  • 《性能之巅》第十章 网络
  • 机器学习与深度学习20-数学优化
  • 如何彻底解决缓存击穿、缓存穿透、缓存雪崩
  • @Validation 的使用 Spring
  • LeetCode--29.两数相除
  • 【慧游鲁博】【13】后端 · 文物图片识别功能完善 · 个性化文物介绍
  • 甘州区建设局网站/淘宝指数查询入口
  • 网络推广和网站推广平台/seo课程哪个好
  • 寿县移动公司网站建设/域名注册需要多少钱?
  • 深圳做网站报价/万能软文模板
  • 做视频网站成本高吗/全国疫情最新数据
  • 做网站如何语音对话/seo综合查询怎么用的