分布式文件系统FastDFS设计原理

2023-10-27

转自: http://blog.yunnotes.net/index.php/fastdfs_design/

FastDFS是一个开源的轻量级分布式文件系统,由跟踪服务器(tracker server)、存储服务器(storage server)和客户端(client)三个部分组成,主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务。

enter image description here

Storage server

Storage server(后简称storage)以组(卷,group或volume)为单位组织,一个group内包含多台storage机器,数据互为备份,存储空间以group内容量最小的storage为准,所以建议group内的多个storage尽量配置相同,以免造成存储空间的浪费。

以group为单位组织存储能方便的进行应用隔离、负载均衡、副本数定制(group内storage server数量即为该group的副本数),比如将不同应用数据存到不同的group就能隔离应用数据,同时还可根据应用的访问特性来将应用分配到不同的group来做负载均衡;缺点是group的容量受单机存储容量的限制,同时当group内有机器坏掉时,数据恢复只能依赖group内地其他机器,使得恢复时间会很长。

group内每个storage的存储依赖于本地文件系统,storage可配置多个数据存储目录,比如有10块磁盘,分别挂载在/data/disk1-/data/disk10,则可将这10个目录都配置为storage的数据存储目录。

storage接受到写文件请求时,会根据配置好的规则(后面会介绍),选择其中一个存储目录来存储文件。为了避免单个目录下的文件数太多,在storage第一次启动时,会在每个数据存储目录里创建2级子目录,每级256个,总共65536个文件,新写的文件会以hash的方式被路由到其中某个子目录下,然后将文件数据直接作为一个本地文件存储到该目录中。

Tracker server

Tracker是FastDFS的协调者,负责管理所有的storage server和group,每个storage在启动后会连接Tracker,告知自己所属的group等信息,并保持周期性的心跳,tracker根据storage的心跳信息,建立group==>[storage server list]的映射表。

Tracker需要管理的元信息很少,会全部存储在内存中;另外tracker上的元信息都是由storage汇报的信息生成的,本身不需要持久化任何数据,这样使得tracker非常容易扩展,直接增加tracker机器即可扩展为tracker cluster来服务,cluster里每个tracker之间是完全对等的,所有的tracker都接受stroage的心跳信息,生成元数据信息来提供读写服务。

Upload file

FastDFS向使用者提供基本文件访问接口,比如upload、download、append、delete等,以客户端库的方式提供给用户使用。

enter image description here

选择tracker server

当集群中不止一个tracker server时,由于tracker之间是完全对等的关系,客户端在upload文件时可以任意选择一个trakcer

选择存储的group

tracker接收到upload file的请求时,会为该文件分配一个可以存储该文件的group,支持如下选择group的规则:

1. Round robin,所有的group间轮询
2. Specified group,指定某一个确定的group
3. Load balance,剩余存储空间多多group优先

选择storage server

当选定group后,tracker会在group内选择一个storage server给客户端,支持如下选择storage的规则:

1. Round robin,在group内的所有storage间轮询
2. First server ordered by ip,按ip排序
3. First server ordered by priority,按优先级排序(优先级在storage上配置)

选择storage path

当分配好storage server后,客户端将向storage发送写文件请求,storage将会为文件分配一个数据存储目录,支持如下规则:

1. Round robin,多个存储目录间轮询
2. 剩余存储空间最多的优先

生成Fileid

选定存储目录之后,storage会为文件生一个Fileid,由storage server ip、文件创建时间、文件大小、文件crc32和一个随机数拼接而成,然后将这个二进制串进行base64编码,转换为可打印的字符串。

选择两级目录

当选定存储目录之后,storage会为文件分配一个fileid,每个存储目录下有两级256*256的子目录,storage会按文件fileid进行两次hash(猜测),路由到其中一个子目录,然后将文件以fileid为文件名存储到该子目录下。

生成文件名

当文件存储到某个子目录后,即认为该文件存储成功,接下来会为该文件生成一个文件名,文件名由group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。

enter image description here

文件同步

写文件时,客户端将文件写至group内一个storage server即认为写文件成功,storage server写完文件后,会由后台线程将文件同步至同group内其他的storage server。

每个storage写文件后,同时会写一份binlog,binlog里不包含文件数据,只包含文件名等元信息,这份binlog用于后台同步,storage会记录向group内其他storage同步的进度,以便重启后能接上次的进度继续同步;进度以时间戳的方式进行记录,所以最好能保证集群内所有server的时钟保持同步。

storage的同步进度会作为元数据的一部分汇报到tracker上,tracke在选择读storage的时候会以同步进度作为参考。

比如一个group内有A、B、C三个storage server,A向C同步到进度为T1 (T1以前写的文件都已经同步到B上了),B向C同步到时间戳为T2(T2 > T1),tracker接收到这些同步进度信息时,就会进行整理,将最小的那个做为C的同步时间戳,本例中T1即为C的同步时间戳为T1(即所有T1以前写的数据都已经同步到C上了);同理,根据上述规则,tracker会为A、B生成一个同步时间戳。

Download file

客户端upload file成功后,会拿到一个storage生成的文件名,接下来客户端根据这个文件名即可访问到该文件。

enter image description here

跟upload file一样,在download file时客户端可以选择任意tracker server。

tracker发送download请求给某个tracker,必须带上文件名信息,tracke从文件名中解析出文件的group、大小、创建时间等信息,然后为该请求选择一个storage用来服务读请求。由于group内的文件同步时在后台异步进行的,所以有可能出现在读到时候,文件还没有同步到某些storage server上,为了尽量避免访问到这样的storage,tracker按照如下规则选择group内可读的storage。

1. 该文件上传到的源头storage
   - 源头storage只要存活着,肯定包含这个文件,源头的地址被编码在文件名中。
2. 文件创建时间戳==storage被同步到的时间戳 且(当前时间-文件创建时间戳) > 文件同步最大时间(如5分钟)
   - 文件创建后,认为经过最大同步时间后,肯定已经同步到其他storage了。
3. 文件创建时间戳 < storage被同步到的时间戳。
   - 同步时间戳之前的文件确定已经同步了 
4. (当前时间-文件创建时间戳) > 同步延迟阀值(如一天)。
   - 经过同步延迟阈值时间,认为文件肯定已经同步了。

小文件合并存储

小文件合并存储主要解决如下几个问题:

1. 本地文件系统inode数量有限,从而存储的小文件数量也就受到限制。
2. 多级目录+目录里很多文件,导致访问文件的开销很大(可能导致很多次IO
3. 按小文件存储,备份与恢复的效率低

FastDFS在V3.0版本里引入小文件合并存储的机制,可将多个小文件存储到一个大的文件(trunk file),为了支持这个机制,FastDFS生成的文件fileid需要额外增加16个字节

1. trunk file id
2. 文件在trunk file内部的offset
3. 文件占用的存储空间大小 (字节对齐及删除空间复用,文件占用存储空间>=文件大小)

每个trunk file由一个id唯一标识,trunk file由group内的trunk server负责创建(trunk server是tracker选出来的),并同步到group内其他的storage,文件存储合并存储到trunk file后,根据其offset就能从trunk file读取到文件。

文件在trunk file内的offset编码到文件名,决定了其在trunk file内的位置是不能更改的,也就不能通过compact的方式回收trunk file内删除文件的空间。但当trunk file内有文件删除时,其删除的空间是可以被复用的,比如一个100KB的文件被删除,接下来存储一个99KB的文件就可以直接复用这片删除的存储空间。

HTTP访问支持

FastDFS的tracker和storage都内置了http协议的支持,客户端可以通过http协议来下载文件,tracker在接收到请求时,通过http的redirect机制将请求重定向至文件所在的storage上;除了内置的http协议外,FastDFS还提供了通过apache或nginx扩展模块下载文件的支持。

enter image description here

其他特性

FastDFS提供了设置/获取文件扩展属性的接口(setmeta/getmeta),扩展属性以key-value对的方式存储在storage上的同名文件(拥有特殊的前缀或后缀),比如/group/M00/00/01/some_file为原始文件,则该文件的扩展属性存储在/group/M00/00/01/.some_file.meta文件(真实情况不一定是这样,但机制类似),这样根据文件名就能定位到存储扩展属性的文件。

以上两个接口作者不建议使用,额外的meta文件会进一步“放大”海量小文件存储问题,同时由于meta非常小,其存储空间利用率也不高,比如100bytes的meta文件也需要占用4K(block_size)的存储空间。

FastDFS还提供appender file的支持,通过upload_appender_file接口存储,appender file允许在创建后,对该文件进行append操作。实际上,appender file与普通文件的存储方式是相同的,不同的是,appender file不能被合并存储到trunk file。

问题讨论

从FastDFS的整个设计看,基本上都已简单为原则。比如以机器为单位备份数据,简化了tracker的管理工作;storage直接借助本地文件系统原样存储文件,简化了storage的管理工作;文件写单份到storage即为成功、然后后台同步,简化了写文件流程。但简单的方案能解决的问题通常也有限,FastDFS目前尚存在如下问题(欢迎探讨)。

数据安全性

  • 写一份即成功:从源storage写完文件至同步到组内其他storage的时间窗口内,一旦源storage出现故障,就可能导致用户数据丢失,而数据的丢失对存储系统来说通常是不可接受的。
  • 缺乏自动化恢复机制:当storage的某块磁盘故障时,只能换存磁盘,然后手动恢复数据;由于按机器备份,似乎也不可能有自动化恢复机制,除非有预先准备好的热备磁盘,缺乏自动化恢复机制会增加系统运维工作。
  • 数据恢复效率低:恢复数据时,只能从group内其他的storage读取,同时由于小文件的访问效率本身较低,按文件恢复的效率也会很低,低的恢复效率也就意味着数据处于不安全状态的时间更长。
  • 缺乏多机房容灾支持:目前要做多机房容灾,只能额外做工具来将数据同步到备份的集群,无自动化机制。

存储空间利用率

  • 单机存储的文件数受限于inode数量
  • 每个文件对应一个storage本地文件系统的文件,平均每个文件会存在block_size/2的存储空间浪费。
  • 文件合并存储能有效解决上述两个问题,但由于合并存储没有空间回收机制,删除文件的空间不保证一定能复用,也存在空间浪费的问题

负载均衡

  • group机制本身可用来做负载均衡,但这只是一种静态的负载均衡机制,需要预先知道应用的访问特性;同时group机制也导致不可能在group之间迁移数据来做动态负载均衡。

备注

  • 以上内容大部分为个人的理解,不能代表FastDFS的真实情况,发现问题请帮忙指出。
  • 本文的配图均来自互联网,Chinaunix FastDFS讨论区UC技术博客,如涉及版权问题,请联系我删除。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分布式文件系统FastDFS设计原理 的相关文章

  • 服务器硬件系统之维护拆装教程

    服务器硬件系统之维护拆装教程 在进行电缆连接 插拔 时 通过该电缆连接 或将要连接 的设备应当是没有加电的 即应当先将设备的电源关掉 然后再进行电缆连接 插拔 操作 否则 如果带电进行电缆连接 有可能会对设备造成无法预料的损坏 1 在增加服
  • 已下载1万次,PyPI库发现116 个恶意软件包,感染Windows 和 Linux 系统

    安全人员在 Python 包索引 PyPI 仓库中识别出116个恶意软件包 旨在通过定制后门程序感染 Windows 和 Linux 系统 网络安全研究人员在 Python 包索引 PyPI 仓库中识别出116个恶意软件包 旨在通过定制后门
  • 服务器的丢包率高怎么办

    网络出现丢包状况了怎么办 具体情况可以从以下几点来判断 1 有可能是线路故障导致的 所以可以用光纤打光仪先判断是否是光纤的问题 2 对于设备方面来说 很多都是网络接口的光纤接触不良等 3 也可能是操作系统的问题 比如网卡问题和网络运营线路问
  • Centos8破解Root密码

    注 Centos7同理 1 重启Centos8系统后 在启动页面中选中第一行 按 e 键进入界面 2 找到linux开头所在行的找到 ro 改为上 rw init sysroot bin bash 同时按下 Ctrl X 跳转到紧急模式 3
  • linux 定时任务crontab编写

    使用命令 crontab e 0 0 sh opt maxwellToMysql create data log sh 编写完保存
  • 服务器3M固定带宽什么意思?够用吗?

    云服务器3M固定带宽是什么意思 速度快吗 3M固定带宽是指云服务器的公网带宽 用于在外网提供服务的 3M带宽的下载速度是384KB 秒 上传速度是1280KB 秒 对于个人博客或流量不多的企业官网速度还是挺快的 阿里云服务器网aliyunf
  • 猫头虎博主的MySQL救援指南:轻松解决初始化问题(nysqld: Can create directort :mysgl mysg! 9-winx64 data errno such file o)

    博主猫头虎的技术世界 欢迎来到 猫头虎的博客 探索技术的无限可能 专栏链接 精选专栏 面试题大全 面试准备的宝典 IDEA开发秘籍 提升你的IDEA技能 100天精通Golang Go语言学习之旅 领域矩阵 猫头虎技术领域矩阵 深入探索各技
  • 华为认证 | HCIP和HCIE难度差多了?

    许多有志于在ICT领域发展的人士 都希望获得华为的HCIP或HCIE认证 那么 考取这些认证到底 需要多少钱 HCIP和HCIE的 难度又存在怎样的差异 下面将为您揭晓答案 01 考华为HCIE多少钱 考试费用 华为HCIE认证考试的费用主
  • 性能分析与调优: Linux 内存观测工具

    目录 一 实验 1 环境 2 vmstat 3 PSI 4 swapon 5 sar 6 slabtop 7 numstat 8 ps 9 top 10 pmap 11 perf 12 bpftrace 二 问题 1 接口读写报错 2 sl
  • AIDL通信过程中设置死亡代理

    概述 在进行进程间通信的过程中 如何服务端进程由于某种原因异常终止 我们的远程调用就会失败 影响我们的功能 那么怎么样能够知道服务端进程是否终止了呢 那就是给Binder设置死亡代理 下面看看如何设置 Override public voi
  • Nexus5596交换机支持3层需要的子卡

    3层子卡 nexus5596如果没有这块子卡 无法支持3层特性 TEST Cisco N5596 1 show modu Mod Ports Module Type Model Status 1 48 O2 32X10GBase T 16X
  • 进程间通信

    进程间通信 进程间通信介绍 进程间通信目的 数据传输 一个进程需要将它的数据发送给另一个进程 资源共享 多个进程之间共享同样的资源 通知事件 一个进程需要向另一个或一组进程发送消息 通知它 它们 发生了某种事件 如进程终止 时要通知父进程
  • 6类典型场景的无线AP选型和部署方案

    你们好 我的网工朋友 前段时间刚给你们来了篇解决无线频繁断网的技术文 解决无线频繁断网 这个办法值得收藏 不少朋友私聊 说想再聊聊无线AP的选型和部署方案 这不就安排上了 无线网络覆盖项目中 无线AP的合理选型和部署非常重要 在设计施工中
  • Linux中如何查看开启了哪些端口?

    在Linux中 端口是设备与外界通讯交流的出口 常用于指TCP IP协议中的端口 其按照端口号可以分为三类 分别是 公认端口 注册端口 动态端口 那么Linux中如何查看开启了哪些端口 以下是常用命令介绍 1 使用netstat命令 net
  • 自定义编写zabbix_agent脚本

    vi usr lib systemd system zabbix agent servicce Unit Description Zabbix Agent After syslog target After network target S
  • 如何解决Mybatis-plus与Mybatis不兼容的问题:An attempt was made to call a method that does not exist. The attempt

    博主猫头虎的技术世界 欢迎来到 猫头虎的博客 探索技术的无限可能 专栏链接 精选专栏 面试题大全 面试准备的宝典 IDEA开发秘籍 提升你的IDEA技能 100天精通Golang Go语言学习之旅 领域矩阵 猫头虎技术领域矩阵 深入探索各技
  • Jenkins流水线怎么做?

    问CHAT Jenkins流水线怎么做 CHAT回复 Jenkins流水线是一种创建 测试和部署应用程序的方法 以下是为Jenkins创建流水线的步骤 1 安装Jenkins 首先你需要在你的服务器上安装Jenkins 这个过程可能会根据你
  • 2种方法,教你使用Python实现接口自动化中的参数关联

    通常在接口自动化中 经常会参数关联的问题 那么什么是参数关联 参数关联就是上一个接口的返回值会被下一个接口当做参数运用 其中Python中可以实现参数关联的方法有很多种 今天小编给大家介绍下 如何通过Python来实现接口自动化中的参数关联
  • messages,CentOS 7不收集日志或不存在 /var/log/messages

    var log message var log secure等都不记录了 并且都是空文件 重启机器 reboot 无效 重启日志 systemctl start rsyslog 无效 怀疑空间不足 删除 var log messages 重
  • 网工内推 | 上市公司同程、科达,五险一金,年终奖,最高12k*15薪

    01 同程旅行 招聘岗位 网络工程师 职责描述 1 负责职场 门店网络规划 建设 维护 2 负责网络安全及访问控制 上网行为管理和VPN设备的日常运维 3 负责内部相关网络自动化和系统化建设 4 优化与提升网络运行质量 制定应急预案 人员培

随机推荐

  • 各平台电脑开启虚拟化的方法

    1 Intel平台笔记本 进入BIOS 选择 Configuration 选项 找到 Intel Virtual Technology 改成Enable 2 AMD平台笔记本 进入BIOS 选择 Configuration 的选项 找到 S
  • 使用非负最小二乘回(NNLS)归进行细胞类型转移

    2019年发表在Nature上的文章 The single cell transcriptional landscape of mammalian organogenesis 在方法部分提到 使用NNLS non negative line
  • 西门子传动系统出现这些故障提示原因分析

    1 F002 Pre charging 预充电故障 对整流单元来说 其可能原因为 主进线开关断开或没有闭合 整流单元 例 复卷机整流单元四个熔断器断路 导致传动点出现F008 直流母线电压过低 在更换熔断器后 启动整流器时出现F002 原因
  • bios sgx需要开启吗_华硕主板BIOS解读:新手装机必备篇(必须收藏)

    史上最全BIOS解读 中英文对译 一字一句解析 让你从此不在BIOS中迷路 本期讲解模板BIOS来自华硕TUF X570 GAMING WIFI 今天讲解的内容为新手装机必须经历的内容 新手装机常用到的BIOS选项 并且附上中英文翻译对照
  • 快速排序算法的三种实现

    1 普通快速排序 快速排序思路 随机取一个标定点 v 将 v 放置到合适的位置 保证 v 左边的元素都小于等于 v v 右边的元素都大于 v 然后再继续分别对左边元素和右边的元素做同样的排序动作 直到整个数组有序 那么怎么实现这个快速排序呢
  • Vue-Loader 打包单文件组件实战

    本文是我在学习过程中记录学习的点点滴滴 目的是为了学完之后巩固一下顺便也和大家分享一下 日后忘记了也可以方便快速的复习 Vue Loader 打包单文件组件 前言 一 webpack 结合 Vue Loader 打包单文件组件基本认识 1
  • java 分配算法

    原文地址 http blog csdn net qq 30085577 article details 52756715 版权声明 本文为博主原创文章 未经博主允许不得转载 java view plain copy 随机分配 public
  • Mathorcup数学建模竞赛第二届-【妈妈杯】A题:最佳飞行队列(附带赛题解析&获奖论文及MATLAB代码)

    目录 赛题描述 论文 摘要 一 问题重述 二 模型假设及符号说明 1 模型假设
  • you need to resolve your current index first 解决办法

    前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到教程 从一个分支A切换到另一个分支B后 对切换后的B分支进行pull操作 因为pull操作实际上包含了fetch merge操作 在执行 merge
  • Box2D一:基础知识

    一 box2d基础知识 1 关于 Box2D 是一个用于游戏的 2D 刚体仿真库 从游戏的视角来看 物理引擎就是一个程序性动画 procedural animation 的系统 而不是由动画师去移动你的物体 1 核心概念 刚体 rigid
  • 量化建模时常见的数据穿越问题

    这篇文章将会介绍一下量化建模时常见的数据穿越问题 何为数据穿越 对于t时刻训练得到的模型必须用t时刻之前的数据训练 如果t时刻用到t时刻以后的数据则会产生数据穿越问题 我碰到比较多的数据穿越问题主要有三种 1 训练集和测试集有交叉 2 特征
  • Kali 安装之腾讯云经验遇到坑

    目录 一 准备工作 二 制作镜像 导入kail ios镜像 安装KALI系统 KALI系统安装过程中出现报错 安装 cloud init 制作云镜像 VMDK QCOW 腾讯云导入kali镜像 使用问题 1 无法ssh协议登录 2 重新命名
  • FFMPEG录屏(11)---- aresample重采样pcm

    本文利用ffmpeg中的filter对pcm数据进行重采样 参考官网例子 filtering audio c 初始化filter int filter aresample init const FILTER CTX ctx in const
  • 好像还挺好玩的GAN6——Keras搭建LSGAN最小二乘GAN

    好像还挺好玩的GAN6 Keras搭建LSGAN最小二乘GAN 学习前言 什么是LSGAN 神经网络构建 1 Generator 2 Discriminator 训练思路 实现全部代码 学习前言 据说这个大宝贝的生成效果比较好 让我试试 什
  • Java编程规范(一)

    最近在看一本有关Java编程规范的书 书中精炼阐述了使用java语言时应该遵循的一些原则 接下来的一段时间我将在这里总结我的学习内容 也希望这一系列文章能够对有需要的人有所帮助 不考虑任何编码规范的代码往往存在很多Bug 严重情况下还会制约
  • python迭代器好处_关于Python中迭代器的作用

    迭代器的定义 含有 iter 方法和 next 方法的就是迭代器 即 iterate 含有 iter 方法就可以使用for循环 即iterable 可迭代的 Iterable 可迭代的 gt iter 只要含有 iter 方法的都是可迭代的
  • 小米9能刷鸿蒙系统吗,超大乌龙之后,网友:小米真的不可能会使用鸿蒙系统吗?...

    这几天网上传得沸沸扬扬的华为鸿蒙系统即将在小米手机上使用一事 真的是把大家都给忽悠过去了 就连笔者都差点信以为真 没办法 现在 大忽悠 的IT忽悠手段都太高明 把雷军和任正非的出镜视频剪辑到了一起 还让大家误以为是小米和华为偷偷开了个会 会
  • fio verify数据校验失败

    fio3 7使用verify校验失败 使用本地文件系统也是失败 不知道那块配置的问题 感觉是参数冲突引起的 ioengine psync directory dirs name test bs 4K sync sync numjobs nu
  • 【机器学习 - 2】:数据集的处理

    文章目录 训练集和数据集分离 获取最优模型 超参数 寻找最优模型 网格搜索的使用 训练集和数据集分离 训练集和数据集分离的原理 当我们获取一个数据集时 我们需要将其一小部分拿出来作为测试集 剩余的作为训练集 例如对于一个训练集 将其20 作
  • 分布式文件系统FastDFS设计原理

    转自 http blog yunnotes net index php fastdfs design FastDFS是一个开源的轻量级分布式文件系统 由跟踪服务器 tracker server 存储服务器 storage server 和客