分布式文件系统FastDFS入门

文章目录

  • 一.分布式文件系统简介:
  • 二.FastDFS简介
  • 三.FastDFS组成
    • Tracker Server
    • Storage Server
    • client
    • 上传流程
    • 下载流程
      • 文件ID
  • 四.FastDFS配置
    • 1.tracker.conf
    • 2.stroage 配置文件
    • 3.client配置文件
  • 五.FastDFS使用
  • 六.代码实现
    • 通过execl调用客户端程序进行上传下载
    • 使用API


一.分布式文件系统简介:

  • 传统的文件系统是把数据存储在主机上,而传统的文件系统格式有ntfs / fat32 / ext3 / ext4,当主机空间不足时,通过挂载外盘来扩容。
  • 而分布式文件系统是把数据存储在很多的主机节点上上,通过程序来形成一个完整的文件系统。
  • 分布式文件需要网络来数据传输,通过云服务上的管理程序来进行存储数据节点的获取和存储以及用户的访问和上传。
  • 布式文件系统有GFS、HDFS、Lustre、FastDFS、GlusterFS、GPFS、Ceph、淘宝TFS和腾讯TFS等,本文将对FastDFS进行介绍

二.FastDFS简介

FastDFS 是一款开源的轻量级分布式文件系统,由淘宝的架构师余庆创作,为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,注重高可用、高性能等指标。

  • 纯C实现,支持Linux、FreeBSD等类UNIX系统;
  • 类Google FS,不是通用的文件系统,只能通过专有的API访问,目前提供了 C、Java和PHP API
  • 类似于文件系统的key/value pair存储系统
  • 倾向于存储中小型文件(4KB~500MB)
  • 支持相同内容的文件只保存一份,节约磁盘空间
  • 下载文件支持HTTP协议

三.FastDFS组成

关系图

Tracker Server

跟踪服务器,主要做调度工作,在访问时起负载均衡的作用。在内存中记录 集群中group和storage服务器的状态信息,是连接客户端和Storage服务端的枢纽。因为相关信息全部在内存中,Tracker服务器的性能非常高,一个较大的集群(比如上百个group)中有3台就足够了。

Storage Server

存储服务器,文件内容和文件属性都保存到存储服务器上。

client

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

上传流程

在这里插入图片描述
客户端首先请求Tracker服务器进行查询存储节点,得到存储节点的ip+port,将文件上传到对应的存储节点,存储节点服务器会返回客户端文件ID.

下载流程

在这里插入图片描述

文件ID

例如:

group1/M00/00/00/rBEAAWCHwpKAG_IaAAE2xZYv3yo399.tar.gz
 # 组名
group_name=group1                    
#绑定ip,不写会自动绑定本机ip
bind_arr=
#监听端口号
port=23008
#存储节点写log日志的路径
base_path=/home/yuging/fastdfs
#存储节点提供的存储文件的路径个数
store_path_count=2
#具体的存储路径(要修改)
store_pathg=/home/yuqing/fastdfsstore_path1=/home/yuqing/fastdfs1
#追踪器的地址信息(要修改)
tracker_server=192.168.247.135:22122

3.client配置文件

客户端写日志的文件
base_path=/home/yuqing/
#tracker服务器地址
tracker_server=ip+port

五.FastDFS使用

  • tracker 服务-守护进程

    启动:fdfa
    fdfs_trackerd 追踪器的配置文件(/etc/fdfs/tracker.conf)
    关闭:fdfs_trackerd 追踪器的配置文件(/etc/fdfs/tracker.conf) stop
    重启:fdfs_trackerd 追踪器的配置文件(/etc/fdfs/tracker.conf)restart
    
  • storage服务-守护进程

    启动 fdfs_storaged 存储节点的配置文件(/etc/fdfs/storage.conf)
    关闭:fdfs_storaged 存储节点的配置文件(/etc/fdfs/storage.conf) stop
    重启:fdfs_storaged 存储节点的配置文件(/etc/fdfs/storage.conf) restart
    
  • 启动客户端

    上传:fdfs_upload_file 客户端的配置文件(/etc/fdfs/client.conf)  上传文件
    得到的结果字符串:file_id
    下载:fdfs_download_file 客户端的配置文件(/etc/fdfs/client.conf) file_id
    

    六.代码实现

    代码实现有两种方法

    通过execl调用客户端程序进行上传下载

    int upload_file2(const char* conFile,const char*uploadFile,char* fileId,int n){//创建匿名管道int fd[2];int ret=pipe(fd);if(ret==-1){perror("pipe eerror");exit(0);}//创建子进程pid_t pid=fork();if(fork()==0){dup2(fd[1],STDOUT_FILENO);close(fd[0]);execlp("fdfs_upload_file","fdfs_upload_file",conFile,uploadFile,NULL);perror("execlp error");}else{//父进程close(fd[1]);read(fd[0],fileId,n);}}
    

    使用API

    需要链接对应的头文件和库文件

    #include "fdfs_client.h"
    int upload_file1(const char* confFile,const char*myFile,char*fileId)
    {char group_name[FDFS_GROUP_NAME_MAX_LEN + 1];ConnectionInfo *pTrackerServer;int result;int store_path_index;ConnectionInfo storageServer;if ((result=fdfs_client_init(confFile)) != 0){return result;}pTrackerServer = tracker_get_connection();if (pTrackerServer == NULL){fdfs_client_destroy();return errno != 0 ? errno : ECONNREFUSED;}*group_name = '\0';if ((result=tracker_query_storage_store(pTrackerServer, \&storageServer, group_name, &store_path_index)) != 0){fdfs_client_destroy();fprintf(stderr, "tracker_query_storage fail, " \"error no: %d, error info: %s\n", \result, STRERROR(result));return result;}result = storage_upload_by_filename1(pTrackerServer, \&storageServer, store_path_index, \myFile, NULL, \NULL, 0, group_name, fileId);if (result == 0){printf("%s\n", fileId);}else{fprintf(stderr, "upload file fail, " \"error no: %d, error info: %s\n", \result, STRERROR(result));}tracker_disconnect_server_ex(pTrackerServer, true);fdfs_client_destroy();return result;
    }
    

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

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

相关文章

如何使用 Puppeteer 和 Node.JS 进行 Web 抓取?

什么是 Headlesschrome? Headless?是的,这意味着这个浏览器没有图形用户界面 (GUI)。不用鼠标或触摸设备与视觉元素交互,你需要使用命令行界面 (CLI) 来执行自动化操作。 Headlesschrome 和 Puppeteer 很多网页抓取工具都可适用…

成功解决7版本的数据库导入 8版本数据库脚本报错问题

我 | 在这里 ⭐ 全栈开发攻城狮、全网10W粉丝、2022博客之星后端领域Top1、专家博主。 🎓擅长 指导毕设 | 论文指导 | 系统开发 | 毕业答辩 | 系统讲解等。已指导60位同学顺利毕业 ✈️个人公众号:热爱技术的小郑。回复 Java全套视频教程 或 前端全套视频…

访问网站显示不安全打不开怎么办如何处理

当访问网站时浏览器提示“不安全”,这通常是由于多种原因造成的。下面是一些常见的原因及其解决办法: 未启用HTTPS协议 如果网站仅使用HTTP协议,数据传输没有加密,会被浏览器标记为“不安全”。解决办法是启用HTTPS协议&#xff…

一篇文章教会你如何使用Haproxy,内含大量实战案例

1. Haproxy 介绍 HAProxy是法国开发者 威利塔罗(Willy Tarreau) 使用C语言编写的自由及开放源代码软件,是一款具备高并发(万级以上)、高性能的TCP和HTTP应用程序代理. HAProxy运行在当前的硬件上,可以支持…

5款在线伪原创改写软件,智能改写文章效果好

在这个信息爆炸的时代,内容创作变得愈发重要,而对于创作者来说,有时需要一些得力的伪原创改写工具来辅助我们更好地改写出高质量的内容。今天我要和大家分享5款令人惊喜的在线伪原创改写软件,它们以出色的智能改写效果&#xff0c…

【Kubernetes】身份认证与鉴权

一,认证 所有 Kubernetes 集群有两类用户:由Kubernetes管理的ServiceAccounts(服务账户)和(Users Accounts)普通账户。 两种账户的区别: 普通帐户是针对(人)用户的,服务账户针对Pod进程普通帐户是全局性。在集群所有namespaces…

【Ai学习】一个技巧,解决99%Comfyui报错!

前言 comfyui以极高灵活度及节点化工作流,深受AI绘画者追捧,每当新的模型开源,comfyui都是最先进行适配。 comfyui高度兼容性及灵活性带来丰富强大的扩展(插件)生态,同时也带来一系列插件安装的问题&…

从今年的计算机视觉比赛看风向

记第一次参加CV比赛的经历-长三角(芜湖)人工智能视觉算法大赛-CSDN博客 去年参赛的记录里说了: 最近,同样的由芜湖举办的比赛又上线了,果然: 2023年是这些赛题,典型的CV: 今年变成…

阴阳脚数码管

1.小故事 最近,我接到了一个既“清肺”又“烧脑”的新任务,设计一个低功耗蓝牙肺活量计。在这个项目中我们借鉴了一款蓝牙跳绳的硬件设计方案,特别是它的显示方案——数码管。 在电子工程领域,初学者往往从操作LED开始&#xff…

【网络】IP的路径选择——路由控制

目录 路由控制表 默认路由 主机路由 本地环回地址 路由控制表的聚合 网络分层 个人主页:东洛的克莱斯韦克-CSDN博客 路由控制表 在数据通信中,IP地址作为网络层的标识,用于指定数据包的目标位置。然而,仅有IP地址并不足以确…

基于LPF改进的反电势观测器+锁相环PLL的永磁无感控制

导读:上期文章介绍的基于EMF+PLL的中高速永磁无感控制,其中决定转速和位置的估算精度的是反电势的获取精度。直接计算法很难保证反电势的估算精度,所以本期文章介绍一种基于LPF的改进型EMF观测器。 一、基于LPF改进的EMF观测器 传统的EMF观测器的表达式为: 注:这里重点强…

01_Electron 跨平台桌面应用开发介绍

Electron 跨平台桌面应用开发介绍 一、Electron 的介绍二、关于 NW.js 和 Electron 介绍三、搭建 Electron 的环境1、准备工作:2、安装 electron 环境3、查看 electron 的版本,electron -v 一、Electron 的介绍 Electron 是由 Github 开发的一个跨平台的…

Oracle事务是怎么练成的

什么是事务 事务是数据库管理系统执行过程的一个逻辑单位,由一系列有限的数据库操作序列构成,事务必须满足‌ACID属性。ACID理论是数据库中最重要的概念之一,分别代表原子性(Atomicity)、一致性(Consisten…

Django基础知识

文章目录 新建Django项目helloworld关联数据库admin 新建Django项目 创建django-admin startproject project_name 运行 python manage.py runserver 创建app: python manage.py startapp app_name 目录: 配置文件 settings.py 路由配置 urls.py 项目管理 manage.p…

极光流星大爆发

卑微仔广东持续200%含云量,线上观望大家分享的极光与流星共舞的神奇场景。 极光与流星相伴的瞬间,永远震撼于绝美的星空 开始放毒(放图放图)(以下均拍摄于12日晚至13日晨这一时间段): 先驱猎光…

VisionPro二次开发学习笔记10-使用 PMAlign和Fixture固定Blob工具检测孔

使用 PMAlign和Fixture固定Blob工具检测孔 这个示例演示了如何使用 PMAlign 工具和 Fixture 工具来夹持一个 Blob 工具。示例代码将检测支架右上角孔的存在。当点击运行按钮时,将读取新图像。PMAlign 工具运行并生成一个 POSE 作为输出。POSE 是一个六自由度的变换…

2024年8月7日(mysql主从 )

回顾 主服务器 [rootmaster_mysql ~]# yum -y install rsync [rootmaster_mysql ~]# tar -xf mysql-8.0.33-linux-glibc2.12-x86_64.tar [rootmaster_mysql ~]# tar -xf mysql-8.0.33-linux-glibc2.12-x86_64.tar.xz [rootmaster_mysql ~]# cp -r mysql-8.0.33-linux-glibc2.…

若依二次开发WebSocket实战

1. 添加WebSocket依赖 在ruoyi-framework/pom.xml中添加Spring Boot WebSocket的依赖&#xff1a; <!-- SpringBoot Websocket --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket&l…

代理用上了,docker都不能用的解决方案

https://docs.docker.com/engine/daemon/proxy/https://docs.docker.com/engine/daemon/proxy/ 1、 sudo mkdir -p /etc/systemd/system/docker.service.d 2、/etc/systemd/system/docker.service.d/http-proxy.conf [Service] Environment="HTTP_PROXY=http://127.0.…

【Python实现代码视频/视频转字符画/代码风格视频】

该程序改良自GitHub开源项目VideoCharDraw 在源程序CharDraw_thread.py 带压缩和多线程版本字符画的基础上使用Tkinter库添加了图形化的操作&#xff0c;使用户操作体验更方便。 什么是视频字符画&#xff1f; 视频转字符画是一种将视频中的每一帧图像转换为由字符组成的图…