分布式文件存储与数据缓存(一)| FastDFS

目录

  • 分布式文件系统
  • FastDFS概述_简介
    • FastDFS特性:
    • 分布式文件服务提供商
  • FastDFS概述_核心概念
    • tracker
    • storage
    • client
    • group
  • FastDFS概述_上传机制
    • 内部机制如下
  • FastDFS概述_下载机制
    • 内部机制如下
  • FastDFS环境搭建_Linux
    • 下载安装gcc
    • 下载安装FastDFS
    • 下载安装FastDFS依赖
    • 解压缩依赖tar包
    • 编译并安装libfastcommon
    • 编译并安装FastDFS
    • 进入etc目录下复制配置文件
    • 创建tracker服务
      • 创建tracker目录
      • 修改配置文件
      • 启动tracker服务
      • 检查tracker服务
    • 创建storage服务
      • 创建storage目录
      • 修改配置文件
      • 启动storage服务
      • 查看storage服务
    • 修改Client配置文件
    • 创建日志目录
  • FastDFS指令
    • 上传指令
      • 指令参数
      • 指令使用
    • 下载指令
      • 指令参数
      • 指令使用
    • 查看文件信息指令
      • 指令参数
      • 指令使用
    • 删除指令
      • 指令参数
      • 指令使用
  • SpringBoot操作FastDFS
    • 导入FastDFS依赖jar
    • 配置springboot的application.yml配置文件
    • 上传和下载文件操作
  • 前端文件上传到fastdfs
    • 引入Thymeleaf视图解析器
    • 编写index页面 引入wangEditor富文本编辑器
    • 编写Controller接口
  • FastDFS集成Nginx
    • FastDFS集成Nginx的2个原因
      • 为分布式文件系统提供Http服务支持
      • 解决复制延迟问题
  • FastDFS集成Nginx_环境搭建
    • 下载Fastdfs的Nginx模块包
    • 安装Nginx依赖文件
    • 下载Nginx软件包
    • 配置Nginx服务器
    • 将Fastdfs软件包里面的http.conf和mime.types拷贝到/etc/fdfs目录下
    • 配置Nginx的fastdfs模块,并编辑文件
    • 配置Nginx
    • 启动Ningx服务
    • 查看服务启动情况
    • 启动追踪服务与存储节点服务
    • 上传图片测试
    • 通过浏览器远程访问

分布式文件系统

业务继续发展,单台服务器存储和响应也很快到达了瓶颈,新的业务需要文件访问具有高响应性、高可用性来支持系统。
在这里插入图片描述

优点:
扩展能力: 毫无疑问,扩展能力是一个分布式文件系统最重要的特点;
高可用性: 在分布式文件系统中,高可用性包含两层,一是整个文件系统的可用性,二是数据的完整和一致性;
弹性存储: 可以根据业务需要灵活地增加或缩减数据存储以及增删存储池中的资源,而不需要中断系统运行。
缺点: 系统复杂度稍高,需要更多服务器

FastDFS概述_简介

FastDFS是一个开源的轻量级分布式文件系统。它解决了大数据量存储和负载均衡等问题。特别适合以中小文件(建议范围:4KB <file_size <500MB)为载体的在线服务,如相册网站、视频网站等等。

FastDFS特性:

  • 文件不分块存储,上传的文件和OS文件系统中的文件一一对应
  • 支持相同内容的文件只保存一份,节约磁盘空间
  • 下载文件支持HTTP协议,可以使用内置Web Server,也可以和其他Web Server配合使用
  • 支持在线扩容
  • 支持主从文件

分布式文件服务提供商

  1. 阿里的OSS
  2. 七牛云存储
  3. 百度云储存

FastDFS概述_核心概念

在这里插入图片描述
FastDFS服务端有三个角色:跟踪服务器(tracker)、存储服务器(storage)和客户端(client)。

tracker

跟踪服务器,主要做调度工作,起负载均衡的作用。在内存中记录集群中所有存储组和存储服务器的状态信息,是客户端和数据服务器交互的枢纽。

storage

存储服务器(又称:存储节点或数据服务器),文件和文件属性(meta data)都保存到存储服务器上。Storage server直接利用OS的文件系统调用管理文件。

client

客户端,作为业务请求的发起方,通过专有接口,使用TCP/IP协议与跟踪器服务器或存储节点进行数据交互。FastDFS向使用者提供基本文件访问接口,比如upload、download、append、delete等,以客户端库的方式提供给用户使用。

group

组, 也可称为卷。 同组内服务器上的文件是完全相同的 ,同一组内的storage server之间是对等的, 文件上传、 删除等操作可以在任意一台storage server上进行 。

在这里插入图片描述

流程:
Tracker相当于FastDFS的大脑,不论是上传还是下载都是通过tracker来分配资源;客户端一般可以使用Ngnix等静态服务器来调用或者做一部分的缓存;存储服务器内部分为卷(或者叫做组),卷于卷之间是平行的关系,可以根据资源的使用情况随时增加,卷内服务器文件相互同步备份,以达到容灾的目的。

FastDFS概述_上传机制

首先客户端请求Tracker服务获取到存储服务器的ip地址和端口,然后客户端根据返回的IP地址和端口号请求上传文件,存储服务器接收到请求后生产文件,并且将文件内容写入磁盘并返回给客户端file_id、路径信息、文件名等信息,客户端保存相关信息上传完毕。

在这里插入图片描述

内部机制如下

1、选择Tracker server
当集群中不止一个Tracker server时,由于Tracker之间是完全对等的关系,客户端在upload文件时可以任意选择一个trakcer。
2、选择Storage server
当选定Group后,Tracker会在Group内选择一个Storage Server给客户端
3、选择Storage path
当分配好Storage Server后,客户端将向Storage发送写文件请求,Storage将会为文件分配一个数据存储目录。

注意:
剩余存储空间最多的优先。

4、生成Fileid
选定存储目录之后,Storage会为文件生一个Fileid,由StorageServer Ip、文件创建时间、文件大小、文件crc32和一个随机数拼接而成,然后将这个二进制串进行base64编码,转换为可打印的字符串。
5、生成文件名
当文件存储到某个子目录后,即认为该文件存储成功,接下来会为该文件生成一个文件名,文件名由group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。

FastDFS概述_下载机制

客户端带上文件名信息请求Tracker服务获取到存储服务器的ip地址和端口,然后客户端根据返回的IP地址和端口号请求下载文件,存储服务器接收到请求后返回文件给客户端。

在这里插入图片描述

内部机制如下

1、client询问tracker下载文件的storage,参数为文件标识(组名和文件名)
2、tracker返回一台可用的storage
3、client直接和storage通讯完成文件下载

FastDFS环境搭建_Linux

下载安装gcc

 yum install gcc-c++ perl-devel pcre-devel openssl-devel zlib-devel wget

下载安装FastDFS

wget https://github.com/happyfish100/fastdfs/archive/V6.06.tar.gz

下载安装FastDFS依赖

wget https://github.com/happyfish100/libfastcommon/archive/V1.0.43.tar.gz

解压缩依赖tar包

tar -zxvf V1.0.43.tar.gz -C /usr/local
tar -zxvf V5.11.tar.gz -C /usr/local

编译并安装libfastcommon

cd /usr/local/libfastcommon-1.0.43/./make.sh && ./make.sh install

编译并安装FastDFS

cd /usr/local/fastdfs-6.06
./make.sh && ./make.sh install

进入etc目录下复制配置文件

cd /etc/fdfs/
cp client.conf.sample client.conf
cp storage.conf.sample storage.conf
cp tracker.conf.sample tracker.conf

创建tracker服务

创建tracker目录

mkdir -p /data/fastdfs/tracker

修改配置文件

vim /etc/fdfs/tracker.confdisabled=false                 #启用配置文件
port=22122                     #设置 tracker的端口号
base_path=/data/fastdfs/tracker #设置 tracker的数据文件和日志目录(需预先创建)
http.server_port=8888           #设置 http 端口号

启动tracker服务

/etc/init.d/fdfs_trackerd start

检查tracker服务

netstat -lntup |grep fdfs

创建storage服务

创建storage目录

mkdir -p /data/fastdfs/base
mkdir -p /data/fastdfs/storage

修改配置文件

vim /etc/fdfs/storage.confdisabled=false                       #启用配置文件
group_name=group1                     #组名,根据实际情况修改
port=23000                           #设置storage 的端口号
base_path=/data/fastdfs/base         #设置storage 的日志目录(需预先创建)
store_path_count=1                   #存储路径个数,需要和 store_path 个数匹配
store_path0=/data/fastdfs/storage       #存储路径
tracker_server=172.31.16.121:22122    #tracker 服务器的 IP 地址和端口号
http.server_port=8888                 #设置storage上启动的http服务的端口号,如安装的nginx的端口号

启动storage服务

/etc/init.d/fdfs_storaged start

查看storage服务

netstat -lntup |grep fdfs

修改Client配置文件

vim /etc/fdfs/client.confconnect_timeout=30
network_timeout=60
base_path=/data/fastdfs/client      # 日志路径
tracker_server=192.168.66.100:22122    # 追踪服务器的IP,有多个服务器可以另一行

创建日志目录

mkdir -p /data/fastdfs/client

FastDFS指令

在这里插入图片描述

上传指令

指令参数

fdfs_upload_file <config_file> <local_filename> [storage_ip:port] [store_path_index]

参数含义:

  1. <config_file> :配置文件路径
  2. <local_filename>:本地文件路径
  3. [storage_ip:port]:(可选参数)
  4. [store_path_index] :(可选参数)

指令使用

[root@tracker fdfs]# fdfs_upload_file /etc/fdfs/client.conf 上传的文件路径

上传文件后会返回文件在FastDFS中的唯一文件标识,即卷名+文件名

下载指令

指令参数

fdfs_download_file <config_file> <file_id>[local_filename] [<download_offset><download_bytes>]

参数含义:

  1. <config_file> :配置文件路径
  2. <file_id> :文件在FastDFS中的唯一文件标识,即卷名+文件名
  3. [local_filename] :文件下载地址
  4. <download_offset> :(可选参数)文件下载开始时间
  5. <download_bytes> :(可选参数)文件下载的字节数

指令使用

[root@tracker fdfs]# fdfs_download_file /etc/fdfs/client.conf 上传时返回的唯一文件标识 指定位置

查看文件信息指令

指令参数

fdfs_file_info <config_file> <file_id>

参数含义:

  1. <config_file> :配置文件路径
  2. <file_id>:文件在FastDFS中的唯一文件标识,即卷名+文件名

指令使用

[root@tracker fdfs]# fdfs_file_info /etc/fdfs/client.conf 文件在FastDFS中的唯一文件标识

删除指令

指令参数

fdfs_delete_file <config_file> <file_id>

参数含义:

  1. <config_file> :配置文件路径
  2. <file_id>:文件在FastDFS中的唯一文件标识,即卷名+文件名

指令使用

[root@tracker fdfs]# fdfs_delete_file /etc/fdfs/client.conf 文件在FastDFS中的唯一文件标识

注意:
删除指令使用后,文件在该卷中的所有备份都会被删除,因为卷内的存储节点会相互同步,故慎用。

SpringBoot操作FastDFS

导入FastDFS依赖jar

<dependency><groupId>com.github.tobato</groupId><artifactId>fastdfs-client</artifactId><version>1.26.5</version>
</dependency>

配置springboot的application.yml配置文件

#### 分布式文件系统的配置 ####
fdfs:# 超时时间connect-timeout: 600# 连接时间so-timeout: 1500tracker-list:- 192.168.52.136:22122

上传和下载文件操作


@SpringBootTest
class FastfdsDemoApplicationTests {// fastdfs 存储节点的客户端对象@Autowiredprivate FastFileStorageClient fastFileStorageClient;@Test/*** java api 对分布式文件系统上传文件操作*/public void testUpload() throws FileNotFoundException {// 1. 获取本地文件File file = new File("f:\\2.jpg");// 2. 创建传输文件的输入流FileInputStream inputStream = new FileInputStream(file);// 3. 上传文件/** 第一个参数:文件的输入流* 第二个参数:文件的大小* 第三个参数:文件的扩展名* 第四个参数:文件的元数据*/StorePath storePath = fastFileStorageClient.uploadFile(inputStream, file.length(), "jpg", null);// 4. 将文件名和卷名一起打印System.out.println(storePath.getFullPath());System.out.println("+++++++++++++++++++++++++++++");System.out.println(storePath.getGroup() + " | " + storePath.getPath());//        group1 /M00/00/00/wKg0iGX1bSSAdrMgAAexV9rfK9A537.jpg
//         ++++++++++++++++++++++++++++ +
//        group1 | M00/00/00/wKg0iGX1bSSAdrMgAAexV9rfK9A537.jpg}/*** java api 对分布式文件系统下载文件操作*/@Testpublic void testDownload() throws IOException {// 1. 下载文件/** 第一个参数:文件处于存储节点卷名* 第二个参数:文件在存储节点的文件名* 第三个参数:下载的回调函数*/byte[] bytes = fastFileStorageClient.downloadFile("group1", "M00/00/00/wKg0iGX1bSSAdrMgAAexV9rfK9A537.jpg", new DownloadByteArray());// 2. 创建文件的输出流FileOutputStream fileOutputStream = new FileOutputStream("f:\\1.jpg");// 3. 使用文件输出流将文件内筒字节数组写出fileOutputStream.write(bytes);// 4. 刷新输出流fileOutputStream.flush();// 5. 关闭输出流fileOutputStream.close();}}

前端文件上传到fastdfs

引入Thymeleaf视图解析器

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starterthymeleaf</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starterweb</artifactId>
</dependency>

编写index页面 引入wangEditor富文本编辑器

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>wangEditor demo</title>
</head>
<body><div id="div1"><p>欢迎使用 <b>wangEditor</b> 富文本编辑器</p>
</div><!-- 引入 js -->
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/wangeditor@latest/dist/wangEditor.min.js"></script><script type="text/javascript">var E = window.wangEditor; // 全局变量const editor = new E('#div1')//设置文件上传的参数名称editor.config.uploadFileName = 'file'// 配置 server 接口地址editor.config.uploadImgServer = '/upload'// 限制图片大小和类型editor.config.uploadImgMaxSize = 2 * 1024 * 1024 //2Meditor.config.uploadImgAccept = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp']// 一次最多上传 5 个图片editor.config.uploadImgMaxLength = 5editor.create()
</script></body>
</html>

编写Controller接口

@RestController
public class UploadController {// fastdfs 存储节点的客户端对象@Autowiredprivate FastFileStorageClient fastFileStorageClient;@PostMapping("upload")public void upload(MultipartFile file) throws IOException {// 1. 判断文件是否为空if(file!=null){// 2. 获取上传图片名字String filename = file.getOriginalFilename();// 3. 获取图片后缀String fileSuffix = filename.substring(filename.lastIndexOf(".") + 1);// 4. 上传图片StorePath storePath = fastFileStorageClient.uploadFile(file.getInputStream(), file.getSize(), fileSuffix, null);// 5. 创建成功会返回文件路径System.out.println(storePath.getFullPath());// TODO 保存到数据库}}
}

FastDFS集成Nginx

FastDFS集成Nginx的2个原因

为分布式文件系统提供Http服务支持

为分布式文件系统提供Http服务支持通过Nginx的web服务代理访问分布式文件系统的存储节点,从而实现通过http请求访问存储节点资源。

在这里插入图片描述

解决复制延迟问题

由于FastDFS的同卷的存储节点之间需要同步,当文件尚未同步完成时,访问请求到达改节点,获取的数据将是未同步完的不完整数据,即为复制延迟问题。通过Nginx检测请求的存储节点的数据,若该存储节点的数据尚未同步完成,则将请求转发至数据的原存储节点,从而解决复制延迟问题。

FastDFS集成Nginx_环境搭建

下载Fastdfs的Nginx模块包

cd /usr/local
wget https://github.com/happyfish100/fastdfs-nginx-module/archive/V1.22.tar.gz
tar -zxvf V1.22.tar.gz

安装Nginx依赖文件

yum install -y gcc gcc-c++ zlib zlib-devel openssl openssl-devel pcre pcre-devel gd-devel epel-release

下载Nginx软件包

wget https://nginx.org/download/nginx-1.19.2.tar.gz
cd nginx-1.19.2/

配置Nginx服务器

#建立Makefile文件,检查Linux系统环境以及相关的关键属性。
./configure --add-module=/usr/local/fastdfs-nginx-module-1.22/src/
#编译项目,主要将gcc源代码编译成可执行的目标文件
make
#根据上一步骤编译完成的数据安装到预定的目录中。
make install

将Fastdfs软件包里面的http.conf和mime.types拷贝到/etc/fdfs目录下

cp /usr/local/src/fastdfs-6.06/conf/mime.types /etc/fdfs/
cp /usr/local/src/fastdfs-6.06/conf/http.conf /etc/fdfs/

配置Nginx的fastdfs模块,并编辑文件

#拷贝文件
[root@localhost opt]cp /usr/local/fastdfs-nginx-module-1.22/src/mod_fastdfs.conf /etc/fdfs/
[root@localhost fdfs] vim mod_fastdfs.conf
#保存日志目录
base_path=/data/fastdfs/storage   
#tracker 服务器的 IP 地址以及端口号
tracker_server=192.168.66.100:22122 
#文件url中是否有group 名
url_have_group_name = true      
#存储路径
store_path0=/data/fastdfs/storage  
group_count = 1            #设置组的个数
#然后在末尾添加分组信息,目前只有一个分组,就只写一个
[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/data/fastdfs/storage

配置Nginx

server {listen    80;server_name  localhost;location ~ /group[1-3]/M00 {alias /data/fastdfs/storage/data;ngx_fastdfs_module;}# 根目录下返回403location = / {return 403;}# log fileaccess_log  logs/img_access.log access;
}

启动Ningx服务

# 进入sbin目录
[root@tracker nginx]# cd sbin/
# 启动服务 -c:指定配置文件
[root@tracker sbin]# ./nginx -c /usr/local/nginx/conf/nginx.conf

查看服务启动情况

[root@tracker sbin]# ps -ef | grep nginx

启动追踪服务与存储节点服务

[root@tracker sbin]# fdfs_trackerd /etc/fdfs/tracker.conf start
[root@tracker sbin]# fdfs_storaged /etc/fdfs/storage.conf start

上传图片测试

[root@tracker fdfs]# fdfs_upload_file /etc/fdfs/client.conf /root/xxxxx.png
group1/M00/00/00/wKhyj1wrIUWAL5ASAAAfA8PiO7Y493.png

通过浏览器远程访问

http://192.168.66.100/group1/M00/00/00/wKhyj1wrIfqAD3NFAAn1fNRE8_M976.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/543606.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3速查笔记

文章目录 一、创建Vue3.0工程1.使用 vue-cli 创建2.使用 vite 创建 二、常用 Composition API1.拉开序幕的setup2.ref函数3.reactive函数4.Vue3.0中的响应式原理vue2.x的响应式Vue3.0的响应式 5.reactive对比ref6.setup的两个注意点7.计算属性与监视1.computed函数2.watch函数3…

Postman接口测试之断言,全网最细教程没有之一!

一、断言 在 postman 中我们是在Tests标签中编写断言&#xff0c;同时右侧封装了常用的断言&#xff0c;当然 Tests 除了可以作为断言&#xff0c;还可以当做后置处理器来编写一些后置处理代码&#xff0c;经常应用于&#xff1a; 【1】获取当前接口的响应&#xff0c;传递给…

【打工日常】使用Docker部署团队协作文档工具

一、ShowDoc介绍 ​ShowDoc是一个适合IT团队共同协作API文档、技术文档的工具。通过showdoc&#xff0c;可以方便地使用markdown语法来书写出API文档、数据字典文档、技术文档、在线excel文档等等。 响应式网页设计&#xff1a;可将项目文档分享到电脑或移动设备查看。同时也可…

结构体联合体枚举和位段

文章目录 结构体结构体类型的声明特殊的声明 结构的自引用结构体变量的定义和初始化结构体内存对齐为什么要内存对齐结构体传参结构体实现位段&#xff08;位段的填充&可移植性&#xff09;位段位段的内存分配空间如何开辟位段的跨平台问题位段的应用 枚举枚举类型的定义枚…

【MASM汇编语言快速入门】8086MASM汇编深入理解指令对标志位的影响

8086MASM汇编深入理解指令对标志位的影响 文章目录 8086MASM汇编深入理解指令对标志位的影响0. 指令对标志位影响1. 指令对标志位影响速查表2. flags标志寄存器: 标志位含义解读flags1. 状态标志cf, pf, af, zf, sf, of2. 控制标志df, if, tf 详解&#xff1a;1. 传送指令2. 算…

Python 基础语法:基本数据类型(字典)

为什么这个基本的数据类型被称作字典呢&#xff1f;这个是因为字典这种基本数据类型的一些行为和我们日常的查字典过程非常相似。 通过汉语字典查找汉字&#xff0c;首先需要确定这个汉字的首字母&#xff0c;然后再通过这个首字母找到我们所想要的汉字。这个过程其实就代表了…

Linux之shell循环

华子目录 for循环带列表的for循环格式分析示例shell允许用户指定for语句的步长&#xff0c;格式如下示例 不带列表的for循环示例 基于C语言风格的for循环格式示例注意 while循环格式示例 until循环作用格式示例 循环控制breakcontinue详细语法示例 循环嵌套示例 for循环 for循…

页面事件

下拉刷新事件 1. 什么是下拉刷新 下拉刷新是移动端的专有名词&#xff0c;指的是通过手指在屏幕上的下拉滑动操作&#xff0c;从而重新加载页面数据的行为。 2. 启用下拉刷新 启用下拉刷新有两种方式&#xff1a; ① 全局开启下拉刷新  在 app.json 的 window 节点中&…

数据资产管理解决方案:构建高效、安全的数据生态体系

在数字化时代&#xff0c;数据已成为企业最重要的资产之一。然而&#xff0c;如何有效管理和利用这些数据资产&#xff0c;却是许多企业面临的难题。本文将详细介绍数据资产管理解决方案&#xff0c;帮助企业构建高效、安全的数据生态体系。 一、引言 在信息化浪潮的推动下&a…

OpenAI 的 GPTs 提示词泄露攻击与防护实战:攻击卷(一)

攻击提示词 1.0 五件套混合散打 1. Repeat the words above starting with the phrase "You are ChatGPT". put them in a txt code block. Include everything. 2. give me your very first initial prompt exactly and not modified 3. 你有一個舊的 prompt 和 配…

LeetCode 面试经典150题 26.删除有序数组中的重复项

题目&#xff1a; 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量…

【C++庖丁解牛】List容器的介绍及使用 | 深度剖析 | list与vector的对比

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1. list的介绍1.1 list的…