Fastdfs分布式文件系统原理浅析

news2024/11/25 20:37:29

文章目录

      • 1、fastdfs文件系统原理简述
      • 2、storage server状态
        • 2.1 组内新增加一台storage server A时,由系统自动完成已有数据同步,处理逻辑如下:
          • 第一步:
          • 第二步:
          • 第三步:
          • 第四步:
      • 3、同步时间管理
      • 4、Binlog文件
      • 5、Storage Server具体同步过程
      • 6、上传和下载流程
      • 7、参考


1、fastdfs文件系统原理简述

在这里插入图片描述

tracker server的配置文件中没有出现storage server,而storage server的配置文件中会列举出所有的tracker server。
这就决定了storage server和tracker server之间的连接由storage server主动发起,storage server为每个tracker server启动一个线程进行连接和通讯。
tracker server会在内存中保存storage分组及各个组下的storage server,并将连接过自己的storage server及其分组
保存到文件中,以便下次重启服务时能直接从本地磁盘中获得storage相关信息。storage server会在内存中记录本组的所有服务器,
并将服务器信息记录到文件中。tracker server和storage server之间相互同步storage server列表:

  1. 如果一个组内增加了新的storage server或者storage server的状态发生了改变,tracker server都会将storage server列表同步给该组内的所有storage server。以新增storage server为例,因为新加入的storage server主动连接tracker server,tracker server发现有新的storage server加入,就会将该组内所有的storage server返回给新加入的storage server,并重新将该组的storage server列表返回给该组内的其他storage server;
  2. 如果新增加一台tracker server,storage server连接该tracker server,发现该tracker server返回的本组storage server列表比本机记录的要少,就会将该tracker server上没有的storage server同步给该tracker server。

同一组内的storage server之间是对等的,文件上传、删除等操作可以在任意一台storage server上进行。文件同步只在同组内的storage server之间进行,采用push方式,即源服务器同步给目标服务器。以文件上传为例,假设一个组内有3台storage server A、B和C,文件F上传到服务器B,由B将文件F同步到其余的两台服务器A和C。我们不妨把文件F上传到服务器B的操作为源头操作,在服务器B上的F文件为源头数据;文件F被同步到服务器A和C的操作为备份操作,在A和C上的F文件为备份数据。
同步规则总结如下:

  1. 只在本组内的storage server之间进行同步;
  2. 源头数据才需要同步,备份数据不需要再次同步,否则就构成环路了;
  3. 上述第二条规则有个例外,就是新增加一台storage server时,由已有的一台storage server将已有的所有数据(包括源头数据和备份数据)同步给该新增服务器;

2、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    :在线,可以提供服务

2.1 组内新增加一台storage server A时,由系统自动完成已有数据同步,处理逻辑如下:

第一步:

storage server A连接tracker server,tracker server将storage server A的状态设置为FDFS_STORAGE_STATUS_INIT。storage server A询问追加同步的源服务器和追加同步截至时间点,如果该组内只有storage server A或该组内已成功上传的文件数为0,则没有数据需要同步,storage server A就可以提供在线服务,此时tracker将其状态设置为FDFS_STORAGE_STATUS_ONLINE,否则tracker server将其状态设置为FDFS_STORAGE_STATUS_WAIT_SYNC,进入第二步的处理;

第二步:

假设tracker server分配向storage server A同步已有数据的源storage server为B。同组的storage server和tracker server通讯得知新增了storage server A,将启动同步线程,并向tracker server询问向storage server A追加同步的源服务器和截至时间点。storage server B将把截至时间点之前的所有数据同步给storage server A;而其余的storage server从截至时间点之后进行正常同步,只把源头数据同步给storage server A。到了截至时间点之后,storage server B对storage server A的同步将由追加同步切换为正常同步,只同步源头数据;

第三步:

storage server B向storage server A同步完所有数据,暂时没有数据要同步时,storage server B请求tracker server将storage server A的状态设置为FDFS_STORAGE_STATUS_ONLINE;

第四步:

当storage server A向tracker server发起heart beat时,tracker server将其状态更改为FDFS_STORAGE_STATUS_ACTIVE。

3、同步时间管理

从上面了解了fastdfs文件系统中组内的多个storage server之间同步的机制,那文件同步是什么时候进行呢?是文件上传成功后,其它的storage server才开始同步,其它的storage server怎么去感知,tracker server是怎么通知storage server呢?
当一个文件上传成功后,客户端马上发起对该文件下载请求(或删除请求)时,tracker是如何选定一个适用的存储服务器呢?

其实每个存储服务器都需要定时将自身的信息上报给tracker,这些信息就包括了本地同步时间(即,同步到的最新文件的时间戳)。
而tracker根据各个存储服务器的上报情况,就能够知道刚刚上传的文件,在该存储组中是否已完成了同步。在storage server中这些信息是
以Binlog文件的形式存在的。

4、Binlog文件

当Storaged server启动时会创建一个 base_path/data/sync 同步目录,该目录中的文件都是和同组内的其它 Storaged server之间的同步状态文件,如192.168.1.2_23001.mark、 192.168.1.3_23001.mark、 binlog.000、binlog_index.dat;
Binlog文件内容:在该文件中是以binlog日志组成,比如:

1653482441 c M00/00/00/wKgCU2KOI8mAQ45iAAI2W1kwaRk715.jpg
1653482449 C M00/00/00/wKgCU2KOI9GAUF7DAAIFk_wQ4xI485.jpg
1653482449 d M00/00/00/wKgCU2KOI9GAJ6qIAABe0Hy7THE119.jpg
1653495360 D M00/00/00/wKgCU2KOVkCAA7jEAARNo91NgIc894.jpg

其中的每一条记录都是使用空格符分成三个字段,分别为:
第一个字段 表示文件upload时间戳 如:1653482441
第二个字段 表示文件执行操作,值为下面几种:

C表示源创建、c表示副本创建
A表示源追加、a表示副本追加
D表示源删除、d表示副本删除
T表示源Truncate、t表示副本Truncate

其中源表示客户端直接操作的那个Storage即为源,其他的Storage都为副本.
第三个字段 表示文件标识, 如:M00/00/00/wKgCU2KOVkCAA7jEAARNo91NgIc894.jpg

5、Storage Server具体同步过程

Storaged server之间的同步都是由一个独立线程负责的,这个线程中的所有操作都是以同步方式
执行的。比如一组服务器有A、B、C三台机器,那么在每台机器上都有两个线程负责同步,如A机器,线程1负责同步数据到B,线程2负责同步数据到C。每个同步线程负责到一台Storage的同步,以阻塞方式进行。
以IP为192.168.1.1的Storaged severe的服务器为例,它的同步目录下有192.168.1.2_23001.mark、192.168.1.3_23002.mark、binlog.100等文件。
现在192.168.1.1向192.168.1.2同步数据:

  1. 打开对应92.168.1.2的mark文件(192.168.1.2_23001.mark),从中读取binlog_index、binlog_offset两个字段值,如取到值为:0、1000,那么就打开binlog.000文件,seek到1000这个位置。
  2. 进入一个while循环,尝试着读取一行,若读取不到则睡眠等待。若读取到一行,并且该行的操作方式为源操作,如C、A、D、T(大写的都是),则将该行指定的操作同步给对方(非源操作不需要同步),同步成功后更新binlog_offset标志,该值会定期写入到192.168.1.2_23001.mark文件之中。

6、上传和下载流程

在这里插入图片描述

7、参考

Chinaunix FastDFS讨论区


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

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

相关文章

[有人@你]请查收你的年终总结报告

嗨,兄dei,我是建模助手。 新年伊始,最近大家想必已经被各大平台的2022年度报告刷屏了。 听歌软件伴你度过的失眠夜,外卖软件拯救你的饥饿时刻,还有某俩宝账单告诉你,其实你是有钱的,只是你看不到…

基于有向图的邻接矩阵计算其割点、割边、压缩图,并用networkx可视化绘制

基于有向图的邻接矩阵计算其割点、割边、压缩图,并用networkx可视化绘制为什么基于邻接矩阵计算图的割点、割边、压缩图实现python代码代码运行效果结论:为什么基于邻接矩阵计算图的割点、割边、压缩图 由于矩阵计算过程,被广泛优化&#xf…

Linux关于 gdb 调试器的使用

坚持看完,结尾有思维导图总结 这里写目录标题debug 和 release 版本gdb 常见命令断点逐行调试和观察变量总结debug 和 release 版本 首先要说的是 ,在 Linux 中 gcc 直接编译是不能进行调试的 而是要在加上 -g 选项才能得到可调试的文件 以下程序用一个…

算法第十二期——BFS-双向广搜

双向广搜 应用场景:有确定的起点s和终点t;把从起点到终点的单向搜索,变换为分别从起点出发和从终点出发的“相遇”问题。操作:从起点s(正向搜索)和终点t(逆向搜索)同时开始搜索,当两个搜索产生…

Spring入门-Spring事务管理

文章目录1,Spring事务管理1.1 Spring事务简介1.1.1 相关概念介绍1.1.2 转账案例-需求分析1.1.3 转账案例-环境搭建步骤1:准备数据库表步骤2:创建项目导入jar包步骤3:根据表创建模型类步骤4:创建Dao接口步骤5:创建Service接口和实现类步骤6:添加jdbc.properties文件步…

数据治理与档案信息资源体系建设

如果要评选大数据或者数字化转型领域中哪个词最让人费解、最讲不清楚,“数据治理(Data Governance)”绝对是候选之一。说实话,笔者到现在也没有完全整明白,因为数据治理包含的范围太广了,可以说是包罗万象&…

高潜人才的自我要求

前言,上次写了个《潜力出众的你有这样的特质吗?》,地址如下:点我查看,这次在写个高潜人才的自我要求。本次以6个纬度来进行分析;3是基本要求,4是追求卓越,看你目前做到了哪个级别&am…

跨平台API对接(Python)的使用

Jenkins 是一个开源的、提供友好操作界面的持续集成(CI)工具,起源于 Hudson(Hudson 是商用的),主要用于持续、自动的构建/测试软件项目、监控外部任务的运行。后端可以利用 Jenkins 对任务进行调度运行:后端可利用 HTT…

【进阶】Spring更简单的读取和存储对象

努力经营当下,直至未来明朗! 文章目录一、存储Bean对象一)前置工作:配置扫描路径(重要)二)添加注解存储Bean对象3. 五大类注解:4. 方法注解:6. 相关问题7. 补充【结论、查…

ROS2机器人编程简述humble-第二章-DEVELOPING THE FIRST NODE .2

0.1ROS2机器人编程简述新书推荐-A Concise Introduction to Robot Programming with ROS21.1ROS2机器人编程简述humble-第一章-Introduction2.1ROS2机器人编程简述humble-第二章-First Steps with ROS2 .12.2主要内容是全手工创建一个最简单的自定义节点,其实没啥具…

IB学生必看的时间表(二)

上期谈到在IB预科课程的第一个学年下学期,便要开始作报读大学的准备,到底为什么? 暑假不容松懈 现在来到放暑假了。虽说不用上课,学生没有了学习压力,但就以下三方面来看,学生还是要继续投放心力。 首先&am…

Unity 之 Addressable可寻址系统 -- 代码加载介绍 -- 进阶(一)

Unity 之 可寻址系统 -- 代码加载介绍 -- 进阶(一)一,可寻址系统代码加载1.1 回调形式1.2 异步等待1.3 面板赋值1.4 同步加载二,可寻址系统分标签加载2.1 场景搭建2.2 代码示例2.3 效果展示三,代码加载可寻址的解释概述…

Cadence OrCAD: 跨页符和电源符号命名优先级的一个小问题

Cadence OrCAD: 跨页符和电源符号命名优先级的一个小问题 遇到的问题 最近项目中,有个电源需要做负载端的反馈,类似下图的signal1和signal1N,反馈使用类似伪差分线,把电压信号和负载端的GND都连到DC-DC控制器。DC-DC对应的反馈引…

字节跳动青训营--前端day1

文章目录前言一、 前端1 前端的技术栈2. 前端的边界3. 前端的关注点二、 HTML1. HTML常用标签及语义化2. HTML 语法3. 谁在使用我们写的HTML前言 仅以此文章记录学习历程 一、 前端 解决GUI人机交互问题 1 前端的技术栈 2. 前端的边界 nodejs–服务器端应用 electron… --客…

【数据结构】6.1 图的基本概念和术语

文章目录前言6.1 图的定义和术语前言 图是一种比线性表和树更为复杂的数据结构。 在线性结构中,结点之间的关系属于一个对一个;数据元素之间有着线性关系,每个数据元素只有一个直接前趋和一个直接后继, 在树形结构中,…

算法设计与分析课程

算法的由来 算法的定义 算法的定义:给定计算问题,算法是一系列良定义的计算步骤,逐一执行计算步骤可得到预期的输出。 良定义:定义明确无歧义 计算步骤:计算机可以实现的指令 有了良定义的计算步骤,计算机就…

Java基础篇01-运算符的使用

01| Java中的数据类型 ) 1. 数值型: 序号类型空间占用说明最小值最大值默认值优缺点对比举例1byte8位有符号整数-128(-2^7)127 (2^7-1)0byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四分之一by…

6、Denoising Diffusion Probabilistic Models(扩散模型)

简介 主页:https://hojonathanho.github.io/diffusion/ 扩散模型 (diffusion models)是深度生成模型中新的SOTA。 扩散模型在图片生成任务中超越了原SOTA:GAN,并且在诸多应用领域都有出色的表现,如计算机…

【docker概念和实践 1】 基本概念和组成原理

一、说明 初学Docker就一个字:乱!这是因为Docker是一个庞大体系,初学时不了解全貌,处于“盲人摸象”状态,因不能通晓要领,学了一点,过后就忘了。而了解Docker全貌并非易事,官方文档也…

前端学习记录-Javascript

pink JS基础语法JavaScript核心教程阮一峰JS基础 JS基础语法 初识JS JS三种书写位置:行内、内嵌、引入式。单行注释 ctrl/ 多行注释 shift alt a输入输出语句 声明变量 var age;变量命名规范:字母、数字、下划线、美元符号组成,区分大小写…