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 servergroup ,每个 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热爱者了解文章,作者将会持续更新中,期待各位友友的关注和收藏。。。

相关推荐
cdut_suye5 分钟前
Linux工具使用指南:从apt管理、gcc编译到makefile构建与gdb调试
java·linux·运维·服务器·c++·人工智能·python
苹果醋317 分钟前
2020重新出发,MySql基础,MySql表数据操作
java·运维·spring boot·mysql·nginx
小蜗牛慢慢爬行19 分钟前
如何在 Spring Boot 微服务中设置和管理多个数据库
java·数据库·spring boot·后端·微服务·架构·hibernate
azhou的代码园22 分钟前
基于JAVA+SpringBoot+Vue的制造装备物联及生产管理ERP系统
java·spring boot·制造
波音彬要多做30 分钟前
41 stack类与queue类
开发语言·数据结构·c++·学习·算法
Swift社区38 分钟前
Excel 列名称转换问题 Swift 解答
开发语言·excel·swift
一道微光42 分钟前
Mac的M2芯片运行lightgbm报错,其他python包可用,x86_x64架构运行
开发语言·python·macos
矛取矛求1 小时前
QT的前景与互联网岗位发展
开发语言·qt
Leventure_轩先生1 小时前
[WASAPI]从Qt MultipleMedia来看WASAPI
开发语言·qt
向宇it1 小时前
【从零开始入门unity游戏开发之——unity篇01】unity6基础入门开篇——游戏引擎是什么、主流的游戏引擎、为什么选择Unity
开发语言·unity·c#·游戏引擎