Java常见面试题-13-FastDFS

文章目录

  • [FastDFS 是什么?](#FastDFS 是什么?)
  • [FastDFS 组成](#FastDFS 组成)
  • [FastDFS 的流程](#FastDFS 的流程)
  • [FastDFS 如何现在组内的多个 storage server 的数据同步?](#FastDFS 如何现在组内的多个 storage server 的数据同步?)

FastDFS 是什么?

FastDFS 是一个开源的轻量级分布式文件系统 ,它可以对文件进行管理,功能包括: 文件存储 、文件同步 、文件访问 (文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、 视频网站等等。

FastDFS 组成

  1. Storage server(存储服务器)
    Storage server 一般都是以组(group)为组织单位,一个组中有多个 Storageserver, 数据互为备份 (意味着每个 Storageserver 的内容是一致的,他们之间没有主从之分),组的存储空间以组内最小的 Storage server 为准,所以为了避免浪费存储空间最好的话每个 Storage server 的配置最好相同。
  2. Tracker server(调度服务器、追踪服务器)
    Tracker server 主要负责管理所有的 Storage server 和 group ,每个 storage 在启动后会连接 Tracker,告知自己所属的 group 等信息,并保持周期性的心跳,tracker 根据 storage 的心跳信息,建立 group==>storage server list的映射表。

FastDFS 的流程

  1. 选择 tracker server
    当集群中不止一个 tracker server 时,由于 tracker 之间是完全对等的关系,客户端在 upload 文件时可以任意选择一个 trakcer。
  2. 选择存储的 group
    当 tracker 接收到 upload file 的请求时,会为该文件分配一个可以存储该文件的 group,支持如下选择 group 的规则:
    • Round robin,所有的 group 间轮询。
    • Specified group,指定某一个确定的 group。
    • Load balance,剩余存储空间多的 group 优先。
    • 选择 storage server。
  3. 选择 storage server
    当选定 group 后,tracker 会在 group 内选择一个 storage server 给客户端,支持如下选择 storage 的规则:
    • Round robin,在 group 内的所有 storage 间轮询。
    • First server ordered by ip,按 ip 排序。
    • 3.First server ordered by priority,按优先级排序(优先级在storage 上配置)。
  4. 选择 storage path
    当分配好 storage server 后,客户端将向 storage 发送写文件请求, storage 将会为文件分配一个数据存储目录,支持如下规则:
    • Round robin,多个存储目录间轮询。
    • 剩余存储空间最多的优先。
  5. 生成 Fileid
    选定存储目录之后,storage 会为文件生一个 Fileid,由 storage server ip、文件创建时间、文件大小、文件 crc32 和一个随机数拼接而成,然后将这个二进制串进行 base64 编码,转换为可打印的字符串。
  6. 选择两级目录
    当选定存储目录之后,storage 会为文件分配一个 fileid,每个存储目录下有两级256*256 的子目录,storage 会按文件 fileid 进行两次 hash (猜测),路由到其中一个子目录,然后将文件以 fileid 为文件名存储到该子目录下。
  7. 生成文件名
    当文件存储到某个子目录后,即认为该文件存储成功,接下来会为该文件生成一个文件名,文件名由 group、存储目录、两级子目录、fileid、 文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。

FastDFS 如何现在组内的多个 storage server 的数据同步?

  • 当客户端完成文件写至 group 内一个 storage server 之后即认为文件上传成功。
  • storage server 上传完文件之后,会由后台线程将文件同步至同 group 内其他的storage server。后台线程同步参考的依据是每个 storageserver 在写完文件后,同时会写一份 binlog。
  • binlog 中只包含文件名等元信息,storage 会记录向 group 内其他storage 同步的进度,以便重启后能接上次的进度继续同步;进度以时间戳的方式进行记录,所以最好能保证集群内所有 server 的时钟保持同步。

欢迎java热爱者了解文章,作者将会持续更新中,期待各位友友的关注和收藏。。。

相关推荐
CV工程师丁Sir1 小时前
ArkWeb 手记 04|DevTools 调试与缓存清理
java·spring·缓存·harmonyos
Sarvartha8 小时前
final 关键字
java·开发语言
2601_952047798 小时前
单一策略深度教程:用轻易云把集成任务的报错实时推送到钉钉机器人
java·机器人·钉钉
程序员Sunday9 小时前
JavaScript 事件循环面试题,宏任务与微任务怎么执行|Sunday面试指南
开发语言·javascript·面试·校招·事件循环·程序员sunday
数据狐(Datafox)9 小时前
淘宝图片搜索 API 落地实战:基于以图搜货搭建跨境电商选品系统
java·大数据·微服务
zhangzeyuaaa9 小时前
Ruby 多线程、GVL(GIL)与 Mutex 完全指南
开发语言·前端·ruby
谢亮_vipxieliang11 小时前
用 PHP 构建轻量级 REST API:从路由到鉴权的完整实践
开发语言·后端·php
Escalating_xu11 小时前
【C 语言】数据在内存中的存储:补码、大小端、整型陷阱与 IEEE 754 全解析
java·c语言·网络