【中间件】fastDFS的相关知识

一、分布式文件系统

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

bash 复制代码
// 将追踪器和部署的主机的IP地址进程进行绑定,也可以不绑定
//如果不绑定,会自动绑定当前主机IP,如果是云服务器建议不要写
bind_addr=192.168.247.135

// 追踪器监听的端口
port=22122

// 追踪器存储日志信息的目录,xxx.pid文件,必须是一个存在的目录
base_path=/home/yuqing/fastdfs

3.2 storage配置文件

bash 复制代码
// 当前存储节点对应的主机属于哪一个组
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 客户端配置文件

bash 复制代码
// 客户端写log日志的目录
// 该路径必须存在
// 当前的用户对于路径中的文件有读写权限
// 当前的用户hrx
// 指定的路径属于root
base_path=/root/fastdfs/client

// 要连接的追踪器的地址信息
tracker_server=xxx.xxx.xxx.xxx:xxxx

3.4 fastDFS启动

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

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

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

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

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

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

bash 复制代码
# 上传
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状态检测

我们使用的命令是:

bash 复制代码
fdfs_monitor /etc/fdfs/client.conf

Storage Server的七种状态:

bash 复制代码
# 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函数,父进程,子进程,管道等

cpp 复制代码
/ 使用多进程进行上传和下载命令

// 利用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); // 关闭保存的标准输出

    // father
    close(pipefd[1]);
    char buffer[4096];
    read(pipefd[0], buffer, sizeof(buffer));

    std::cout << buffer << std::endl;

    // printf("dddddd");
    return 0;
}

4.2 使用fastDFS API实现

我们需要看一看源码。

相关推荐
RH2312114 小时前
2026.6.8Linux
java·数据库·中间件
理人综艺好会21 小时前
双Token机制在实际项目中的应用与实践
中间件·token
番茄去哪了1 天前
神领物流面试题(一)
java·大数据·中间件
念何架构之路1 天前
消息中间件
中间件
都说名字长不会被发现1 天前
Spring Boot Starter 中间件账号密码加密方案设计与实现
java·spring boot·后端·中间件
瀚高PG实验室2 天前
java中间件无法连接数据库
java·数据库·中间件·瀚高数据库
之歆2 天前
Day11_Express 深入解析:从中间件到项目实战
中间件·express
码农飞哥2 天前
RocketMQ消费接口设计实战:为什么HTTP回调接口必须吞掉所有异常,始终返回成功?
网络协议·http·中间件·消息队列·rocketmq
硅谷秋水2 天前
物理人工智能的驾驭工程:机器人中间件是驾驭层
人工智能·机器学习·语言模型·中间件·机器人
初中就开始混世的大魔王3 天前
6 Fast DDS-传输层
开发语言·c++·中间件·信息与通信