【中间件】fastDFS的相关知识

news/2024/12/22 1:17:22/

一、分布式文件系统

1.1 传统的文件系统

我们在Linux中学习的文件系统就是传统的文件系统:

传统的文件系统格式:

  • ntfs/fat32/ext3/ext4

可以被挂载和卸载,就是一般一个盘可以分成多个盘,每一盘都可以挂载到不同的目录路径中。

1.2 分布式文件系统

       文件系统的全部,不在同一个主机上,而是在很多的主机上,多个分散的文件系统组合在一起,形成了一个完整的文件系统。

分布式文件系统:

  • 需要有网络
  • 多台主机不需要在同一个地点
  • 需要管理者
  • 编写应用层的管理程序,不需要编写

二、fastDFS介绍

2.1 fastDFS框架中的三个角色

  • 追踪器(Tracker)管理者 - 守护进程,管理存储节点
  • 存储节点(storage)- 守护进程,存储节点是有多个的
  • 客户端 - 不是守护进程,这是我们自己编写的代码。文件的上传和文件的下载

2.2 fastDFS三个角色之间的关系

  • 追踪器:最先启动追踪器
  • 存储节点:第二个启动的角色,存储节点启动之后,会单独开一个线程,汇报当前存储节点的容量,和剩余容量,汇报数据的同步情况,汇报数据被下载的次数
  • 客户端:最后启动:上传:连接追踪器询问存储节点的信息;下载:连接追踪器询问存储节点的信息

上传文件的步骤:

  1. 我要上传1G的文件,询问哪个存储节点有足够的容量
  2. 追踪器查询,得到结果
  3. 追踪器将查到的存储节点的IP + 端口发送给客户端
  4. 通过得到的IP和端口连接存储节点
  5. 将文件内容发送给存储节点

下载文件的步骤:

  1. 询问一下,要下载的文件在哪一个存储节点中
  2. 追踪器查询,得到结果
  3. 追踪器将查到的存储接地那的IP + 端口发送给客户端
  4. 通过得到的IP和端口连接存储节点
  5. 下载文件

2.3 fastDFS集群(了解即可)

2.3.1 追踪器集群

  • 为什么要集群?因为要避免单点故障!!!
  • 多个tracker如何工作?进行轮询工作!!!
  • 如何使用集群?修改配置文件!!!

2.3.2 存储节点集群

  • fastDFS管理存储节点的方式:通过分组的方式完成的。
  • 集群方式:横向扩容 - 增加容量;纵向扩容 - 数据备份
  • 如何实现?通过修改配置文件进行实现。

三、fastDFS的配置文件

配置文件的默认位置:/etc/fdfs

3.1 tracker配置文件

// 将追踪器和部署的主机的IP地址进程进行绑定,也可以不绑定
//如果不绑定,会自动绑定当前主机IP,如果是云服务器建议不要写
bind_addr=192.168.247.135// 追踪器监听的端口
port=22122// 追踪器存储日志信息的目录,xxx.pid文件,必须是一个存在的目录
base_path=/home/yuqing/fastdfs

3.2 storage配置文件

// 当前存储节点对应的主机属于哪一个组
group_name=group1// 当前存储节点和所在的主机进行IP地址的绑定,如果不写,有fastdfs自动绑定
bind_addr=// 存储节点绑定的端口
port=23000// 存储节点写log日志的路径
base_path=/home/yuqing/fastdfs// 存储节点提供的存储文件的路径个数
store_path_count=2// 具体的存储路径
store_path0=/home/yuqing/fastdfs
store_path1=/home/yuqing/fastdfs1// 追踪器的地址信息
tracker_server=192.168.247.135:22122
tracker_server=192.168.247.136:22122

3.3 客户端配置文件

// 客户端写log日志的目录
// 该路径必须存在
// 当前的用户对于路径中的文件有读写权限
// 当前的用户hrx
// 指定的路径属于root
base_path=/root/fastdfs/client// 要连接的追踪器的地址信息
tracker_server=xxx.xxx.xxx.xxx:xxxx

3.4 fastDFS启动

启动程序在   /usr/bin/fdfs_*

3.4.1 第一个启动追踪器 - 守护进程

# 启动
fdfs_trackerd 追踪器的配置文件(/etc/fdfs/tracker.conf)
# 关闭
fdfs_trackerd 追踪器的配置文件(/etc/fdfs/tracker.conf) stop
# 重启
fdfs_trackerd 追踪器的配置文件(/etc/fdfs/tracker.conf) restart

3.4.2 第二个启动存储节点 - 守护进程

# 启动
fdfs_storaged 存储节点的配置文件(/etc/fdfs/stroga.conf)
# 关闭
fdfs_storaged 存储节点的配置文件(/etc/fdfs/stroga.conf) stop
# 重启
fdfs_storaged 存储节点的配置文件(/etc/fdfs/stroga.conf) restart

3.4.3 最后启动客户端 -- 普通进程

# 上传
fdfs_upload_file 客户端的配置文件(/etc/fdfs/client.conf) 要上传的文件
# 得到的结果字符串: group1/M00/00/00/wKj3h1vC-PuAJ09iAAAHT1YnUNE31352.c
# 下载
fdfs_download_file 客户端的配置文件(/etc/fdfs/client.conf) 上传成功之后得到的字符串(fileID)

3.4.4 fastDFS状态检测

我们使用的命令是:

fdfs_monitor /etc/fdfs/client.conf

Storage Server的七种状态:

# FDFS_STORAGE_STATUS:INIT :初始化,尚未得到同步已有数据的源服务器
# FDFS_STORAGE_STATUS:WAIT_SYNC :等待同步,已得到同步已有数据的源服务器
# FDFS_STORAGE_STATUS:SYNCING :同步中
# FDFS_STORAGE_STATUS:DELETED :已删除,该服务器从本组中摘除
# FDFS_STORAGE_STATUS:OFFLINE :离线
# FDFS_STORAGE_STATUS:ONLINE :在线,尚不能提供服务
# FDFS_STORAGE_STATUS:ACTIVE :在线,可以提供服务

3.5 对于file_id的解释

3.5.1 group1

  • 文件上传到了存储节点的哪一个组中
  • 如果有多个组,这个组名是可变的

3.5.2 M00 - 虚拟目录

  • 和存储节点的配置项有映射

3.5.3 00/00

  • 实际的路径是可变的

3.5.4 wKhS_WirEOJDKSFNFLSNkdfsfs43356.md

  • 文件名包含的信息
  • 采用Base64编码:包含的字段有源Storage server IP地址,文件创建的时间,文件的大小,文件的CRC32校验码(循环冗余校验) ,随机数

四、上传下载代码的实现

4.1 使用多进程的方式实现

我们需要使用的技术有:execl函数,父进程,子进程,管道等

/ 使用多进程进行上传和下载命令// 利用exec命令来执行命令
// 利用父子进程,利用父进程创建出子进程
// 先将输出进行重定向#include <iostream>
#include <string>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <gflags/gflags.h>// fdfs_upload_file /etc/fdfs/client.conf code/search/test/simhash.cc// 上传文件的功能
int main()
{// 保存当前标准输出int save_stdout = dup(STDOUT_FILENO);// 先创建出管道int pipefd[2];int n = pipe(pipefd);if (n < 0){std::cerr << "创建管道失败!!!" << std::endl;}// 将标准输出重定向到管道的写端,由于在执行完exec函数后会将虚拟地址空间替换dup2(pipefd[1], STDOUT_FILENO);// 创建出子进程,让子进程执行语句pid_t id = fork();if (id == 0) // child{close(pipefd[0]);// 让子进程利用execlp函数执行指令execlp("fdfs_upload_file", "fdfs_upload_file", "/etc/fdfs/client.conf", "../search/test/simhash.cc", NULL);exit(0);}// 恢复当前标准输出dup2(save_stdout, STDOUT_FILENO);close(save_stdout); // 关闭保存的标准输出// fatherclose(pipefd[1]);char buffer[4096];read(pipefd[0], buffer, sizeof(buffer));std::cout << buffer << std::endl;// printf("dddddd");return 0;
}

4.2 使用fastDFS API实现

我们需要看一看源码。


http://www.ppmy.cn/news/1534878.html

相关文章

AWS IoT Core for Amazon Sidewalk

目录 1 前言2 AWS IoT2.1 准备条件2.2 创建Credentials2.2.1 创建user2.2.2 配置User 2.3 本地CLI配置Credentials 3 小结 1 前言 在测试Sidewalk时&#xff0c;device发送数据&#xff0c;网关接收到&#xff0c;网关通过网络发送给NS&#xff0c;而此处用到的NS是AWS IoT&am…

手写mybatis之创建简单的映射器代理工厂

前言 我们使用 JDBC 的时候&#xff0c;需要手动建立数据库链接、编码 SQL 语句、执行数据库操作、自己封装返回结果等。但在使用 ORM 框架后&#xff0c;只需要通过简单配置即可对定义的 DAO 接口进行数据库的操作了。 我们就来解决 ORM 框架第一个关联对象接口和映射类的问题…

MATLAB算法实战应用案例精讲-【数模应用】Kaplan Meier(附MATLAB和R语言代码实现)

目录 几个相关概念 生存分析 (survival analysis) 事件 (event) 生存时间 (survival time) 删失(censoring) 生存函数 (survival function) 算法原理 什么是Kaplan Meier 生存曲线解读 SPSSAU SPSSPRO 1、作用 2、输入输出描述 3、案例示例 4、案例数据 5、案…

R 语言 data.table 大规模数据处理利器

前言 最近从一个 python 下的 anndata 中提取一个特殊处理过的单细胞矩阵&#xff0c;想读入R用来画图&#xff08;个人比较喜欢用R可视化 &#xff09;&#xff0c;保存之后&#xff0c;大概几个G的CSV文件&#xff0c;如果常规方法读入R&#xff0c;花费的时间比较久&#x…

第T2周:TensorFlow实现彩色图片分类(CIFAR10数据集),并实现自己的真实图片分类

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目标&#xff1a; 加载CIFAR-10数据集进行训练&#xff0c;然后能够对彩色图片进行分类 具体实现&#xff1a; &#xff08;一&#xff09;环境&#xff1a; 语…

Carsim安装记录

打开Carsim的dataBase被自己删掉了&#xff0c;导致车辆类型啥的都不全&#xff0c;没有完整的数据库&#xff0c;遂重装&#xff0c;记录一下安装后的过程 跟着B站UP安装的&#xff0c;安装教程https://www.bilibili.com/video/BV1P54y1274L/?vd_source4fe7704e89d3e1f677aa3…

小程序用户截屏事件

原生小程序&#xff1a; wx.setScreenBrightness({value: 0.5 }); 参数值&#xff1a; value屏幕亮度值&#xff0c;范围 0~1&#xff0c;0 最暗&#xff0c;1 最亮 uniapp&#xff1a; uni.setScreenBrightness({value: 0.5 }); 参数值&#xff1a; value屏幕亮度值&a…

音频驱动视频人物说话的技术路线

音频驱动视频人物说话的技术路线和步骤&#xff1a; 音频驱动视频人物说话的技术路线和步骤 音频驱动视频人物说话是一种涉及多学科交叉的技术&#xff0c;主要用于生成看起来像是视频中人物在说话的合成视频。该技术广泛应用于娱乐、教育、虚拟现实等领域。以下是实现这一技术…