【中间件】fastDFS的相关知识

news2024/11/20 14:39:48

一、分布式文件系统

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

    // 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实现

我们需要看一看源码。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实时语音交互,打造更加智能便捷的应用

随着人工智能和自然语言处理技术的进步&#xff0c;用户对智能化和便捷化应用的需求不断增加。语音交互技术以其直观的语音指令&#xff0c;革新了传统的手动输入方式&#xff0c;简化了用户操作&#xff0c;让应用变得更加易用和高效。 通过语音交互&#xff0c;用户可以在不…

考研笔记之操作系统(三)- 存储管理

操作系统&#xff08;三&#xff09;- 存储管理 1. 内存的基础知识1.1 存储单元与内存地址1.2 按字节编址和按字编址1.3 指令1.4 物理地址和逻辑地址1.5 从写程序到程序运行1.6 链接1.6.1 静态链接1.6.2 装入时动态链接1.6.3 运行时动态链接 1.7 装入1.7.1 概念1.7.2 绝对装入1…

算法-汉诺塔问题(Hanoi tower)

介绍 汉诺塔是源于印度的一个古老传说的小游戏&#xff0c;简单来说就是有三根柱子&#xff0c;开始的时候&#xff0c;第一根柱子上圆盘由大到小&#xff0c;自下往上排列。这个小游戏要实现的目的呢&#xff0c;就是要把第一根柱子上的圆盘移到第三根的柱子上去&#xff1b;…

【重学 MySQL】四十四、相关子查询

【重学 MySQL】四十四、相关子查询 相关子查询执行流程示例使用相关子查询进行过滤使用相关子查询进行存在性检查使用相关子查询进行计算 在 select&#xff0c;from&#xff0c;where&#xff0c;having&#xff0c;order by 中使用相关子查询举例SELECT 子句中使用相关子查询…

带你0到1之QT编程:二十二、QChart类图表及折线图、直方图、饼图的三大可视化图表实战!

此为QT编程的第二十二谈&#xff01;关注我&#xff0c;带你快速学习QT编程的学习路线&#xff01; 每一篇的技术点都是很很重要&#xff01;很重要&#xff01;很重要&#xff01;但不冗余&#xff01; 我们通常采取总-分-总和生活化的讲解方式来阐述一个知识点&#xff01;…

09_OpenCV彩色图片直方图

import cv2 import numpy as np import matplotlib.pyplot as plt %matplotlib inlineimg cv2.imread(computer.jpeg, 1) img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) plt.imshow(img) plt.show()plot绘制直方图 plt.hist(img.ravel(), 256) #ravel() 二维降一维 256灰度级…

【JavaEE】http/https 超级详解

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【Java】登神长阶 史诗般的Java成神之路 &#x1f98a;一.定义 HTTP&#xff08;HyperText Transfer Protocol&#xff09;即超文本传输协议&#xff0c;他是应用非常广泛的应用层协议&#xff0c;是…

《PMI-PBA认证与商业分析实战精析》 第3章 需要评估

本章涵盖的考试重点&#xff1a; 需要评估的四项活动 需要评估四项活动的可交付成果 需要评估相关活动的技术 商业论证的内容 情境说明书的格式 目的、目标和商业论证的层次结构 成本收益分析的四种财务计价方法 需要评估领域就是聚焦在目标定义上。 商业分析师所需要…

ZenStack全栈开发工具(一)快速使用指南

简介 ZenStack是一个TypeScript工具&#xff0c;通过灵活的授权和自动生成的类型安全的 API/钩子来增强 Prisma ORM&#xff0c;从而简化全栈开发 数据库-》应用接口 数据库-》前端 参考官方网站&#xff1a;https://zenstack.dev/ 如果我们想做一个全栈开发的web应用程序&am…

目标检测技术的发展:从R-CNN、YOLO到DETR、DINO

“深度人工智能”是成都深度智谷科技旗下的人工智能教育机构订阅号&#xff0c;主要分享人工智能的基础知识、技术发展、学习经验等。此外&#xff0c;订阅号还为大家提供了人工智能的培训学习服务和人工智能证书的报考服务&#xff0c;欢迎大家前来咨询&#xff0c;实现自己的…

[FlareOn3]Challenge11

载入PE. 32 bit&#xff0c;无壳. 载入IDA&#xff08;32bit&#xff09;. 寻找main函数. int __cdecl main(int argc, const char **argv, const char **envp) {char Buffer[128]; // [esp0h] [ebp-94h] BYREFchar *Str1; // [esp80h] [ebp-14h]char *Str2; // [esp84h] [eb…

ROS理论与实践学习笔记——2 ROS通信机制之常用API

"API" 是 "Application Programming Interface" 的缩写&#xff0c;指的是应用程序编程接口。API是一组定义了不同软件组件如何互相通信的规范。它允许不同的软件系统之间共享功能&#xff0c;提供一种标准的方式来访问某个软件组件的功能或数据。 详细内…

JavaScript模块化-CommonJS规范和ESM规范

1 ES6模块化 1.1 ES6基本介绍 ES6 模块是 ECMAScript 2015&#xff08;ES6&#xff09;引入的标准模块系统&#xff0c;广泛应用于浏览器环境下的前端开发。Node.js环境主要使用CommonJS规范。ESM使用import和export来实现模块化开发从而解决了以下问题&#xff1a; 全局作用…

《安富莱嵌入式周报》第343期:雷电USB4开源示波器正式发布,卓越的模拟前端低噪便携示波器,自带100W电源的便携智能烙铁,NASA航空航天锂电池设计

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 更新一期视频教程 【授人以渔】CMSIS-RTOS V2封装层专题视频&#xff0c;一期视频将常用配置和用法梳理清楚&#xff0…

Win10系统插入带有麦克风的耳机_麦克风不起作用_解决方法_亲测成功---Windows运维工作笔记054

今天我在使用讯飞输入法的时候,想通过讯飞的语音输入法来提高自己的输入效率。 但是这个时候发现一个问题就是我插入我的台式机的是一个带有麦克风的耳机。 但是发现我这个耳机没有办法被电脑识别出麦克风来,所以说就没办法使用讯飞输入法的语音输入功能来直接输入文字了。…

Qt 窗口中鼠标点击事件的坐标探讨

// 鼠标点击事件 void Widget::mousePressEvent(QMouseEvent *event) {/*event->pos()、event->windowPos()和event->localPos()都表示鼠标点击位置在窗口中的位置&#xff0c;它们的值都是一样的&#xff0c;区别在于event->pos()是QPoint类型&#xff0c;event-&…

操作系统-磁盘管理

存储管理中的磁盘管理涉及到几个核心概念&#xff1a;磁道、扇区、磁头、盘面。 磁道&#xff1a;磁盘表面的同心圆&#xff0c;用于记录数据。每个磁道可以存储相同量的信息。 扇区&#xff1a;磁道被进一步划分的更小单元&#xff0c;通常是磁道的最小存储单位。一个常见的扇…

【新闻转载】Storm-0501:勒索软件攻击扩展到混合云环境

icrosoft发出警告&#xff0c;勒索软件团伙Storm-0501近期调整了攻击策略&#xff0c;目前正将目标瞄准混合云环境&#xff0c;旨在全面破坏受害者的资产。 该威胁行为者自2021年首次露面&#xff0c;起初作为Sabbath勒索软件行动的分支。随后&#xff0c;他们开始分发来自Hive…

C++发邮件:如何轻松实现邮件自动化发送?

C发邮件的详细步骤与教程指南&#xff1f;如何在C中发邮件&#xff1f; 无论是定期发送报告、通知客户还是管理内部沟通&#xff0c;自动化邮件系统都能显著提升工作效率。AokSend将详细介绍如何使用C发邮件&#xff0c;实现邮件自动化发送&#xff0c;帮助您轻松管理邮件通信…

10/1 力扣 49.字母异位词分组

基本知识&#xff1a; 关于字符串的排序&#xff1a; 1.多个字符串排序 1.1使用python内置的sorted() 使用该函数后原对象并不发生变化 1.2若多个字符串使用列表进行存储&#xff0c;使用列表的sort()方法 使用该函数后原对象原地变化 2.对单个字符串里的字母进行排序 使…