FastDFS是一款类Google FS的开源分布式文件系统(应用级的分布式文件存储服务)。

FastDFS的设计理念

FastDFS是为互联网应用量身定做的分布式文件系统,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标。FastDFS的架构和设计理念有其独到之处,主要体现在轻量级分组方式对等结构三个方面。

轻量级

FastDFS只有两个角色:Tracker serverStorage server。Tracker server作为中心结点,其主要作用是负载均衡调度。Tracker server在内存中记录分组Storage server的状态等信息,不记录文件索引信息,占用的内存量很少。另外,客户端(应用)和Storage server访问Tracker server时,Tracker server扫描内存中的分组和Storage server信息,然后给出应答。由此可以看出Tracker server非常轻量化,不会成为系统瓶颈。

FastDFS中的Storage server在其他文件系统中通常称作Trunk server或Data server。Storage server直接利用OS的文件系统存储文件。FastDFS不会对文件进行分块存储,客户端上传的文件和Storage server上的文件一一对应。

在FastDFS中,客户端上传文件时,文件ID不是由客户端指定,而是由Storage server生成后返回给客户端的。文件ID中包含了组名、文件相对路径文件名,Storage server可以根据文件ID直接定位到文件。因此FastDFS集群中根本不需要存储文件索引信息,这是FastDFS比较轻量级的一个例证。而其他文件系统则需要存储文件索引信息,这样的角色通常称作NameServer。其中mogileFS采用MySQL数据库来存储文件索引以及系统相关的信息,其局限性显而易见,mysql将成为整个系统的瓶颈。

FastDFS轻量级的另外一个体现是代码量较小,代码行数不到5.2万行。

分组方式

FastDFS采用了分组存储方式。集群由一个或多个组构成,集群存储总容量为集群中所有组的存储容量之和。一个组由一台或多台存储服务器组成,同组内的多台Storage server之间是互备关系,同组存储服务器上的文件是完全一致的。文件上传、下载、删除等操作可以在组内任意一台Storage server上进行。类似木桶短板效应,一个组的存储容量为该组内存储服务器容量最小的那个,由此可见组内存储服务器的软硬件配置最好是一致的。

采用分组存储方式的好处是灵活、可控性较强。比如上传文件时,可以由客户端直接指定上传到的组。一个分组的存储服务器访问压力较大时,可以在该组增加存储服务器来扩充服务能力(纵向扩容)。当系统容量不足时,可以增加组来扩充存储容量(横向扩容)。采用这样的分组存储方式,可以使用FastDFS对文件进行管理,使用主流的Web server如Apache、nginx等进行文件下载。

对等结构

FastDFS集群中的Tracker server也可以有多台,Tracker server和Storage server均不存在单点问题。Tracker server之间是对等关系,组内的Storage server之间也是对等关系。传统的Master-Slave结构中的Master是单点,写操作仅针对Master。如果Master失效,需要将Slave提升为Master,实现逻辑会比较复杂。和Master-Slave结构相比,对等结构中所有结点的地位是相同的,每个结点都是Master,不存在单点问题。

Tracker server之间相互独立,不存在直接联系。

客户端和Storage server主动连接Tracker server。Storage server主动向Tracker server报告其状态信息,包括磁盘剩余空间、文件同步状况、文件上传下载次数等统计信息。Storage server会连接集群中所有的Tracker server,向他们报告自己的状态。Storage server启动一个单独的线程来完成对一台Tracker server的连接和定时报告。需要说明的是,一个组包含的Storage server不是通过配置文件设定的,而是通过Tracker server获取到的。

不同组的Storage server之间不会相互通信,同组内的Storage server之间会相互连接进行文件同步。

Storage server采用binlog文件记录文件上传、删除等更新操作。binlog中只记录文件名,不记录文件内容

文件同步只在同组内的Storage server之间进行,采用push方式,即源头服务器同步给目标服务器。只有源头数据才需要同步,备份数据并不需要再次同步,否则就构成环路了。有个例外,就是新增加一台Storage server时,由已有的一台Storage server将已有的所有数据(包括源头数据和备份数据)同步给该新增服务器。

Storage server中由专门的线程根据binlog进行文件同步。为了最大程度地避免相互影响以及出于系统简洁性考虑,Storage server对组内除自己以外的每台服务器都会启动一个线程来进行文件同步。

文件上传和下载的交互过程

文件上传流程

1. Client询问Tracker server上传到的Storage server;

2. Tracker server返回一台可用的Storage server,返回的数据为该Storage server的IP地址和端口;

3. Client直接和该Storage server建立连接,进行文件上传,Storage server返回新生成的文件ID,文件上传结束。

文件下载流程

1. Client询问Tracker server可以下载指定文件的Storage server,参数为文件ID(包含组名和文件名);

2. Tracker server返回一台可用的Storage server;

3. Client直接和该Storage server建立连接,完成文件下载。

最新文章

  1. SQL Server 2008连接字符串写法大全
  2. Android 文章列表
  3. ios ble 参考
  4. RSA前台js加密,后台C#解密
  5. netty启动过程
  6. ubuntu源码安装R语言
  7. linux编译安装LAMP
  8. 000webhost虚拟主机绑定自定义二级域名
  9. Spring Boot Security 整合 OAuth2 设计安全API接口服务
  10. centos下etcd集群安装
  11. CodeForces - 1102A
  12. 关于iOS刷新UI需要在主线程执行
  13. 《http权威指南》读书笔记7
  14. 微信小程序 text属性设置 WXSS样式
  15. Python——Flask框架——模板
  16. Linux内核分析第四章读书笔记
  17. 暂时关闭 windows 病毒防护
  18. sessionpage1
  19. OSGi 系列(十六)之 JDBC Service
  20. idea 搜索不到前端的ajax controller接口的原因

热门文章

  1. 【51nod】2622 围绕着我们的圆环
  2. k8s集群监控 cadvisor/exporter+prometheus+grafana
  3. MySQL部分2
  4. 画一个秘密花园 | Scratch 3.0 艺术项目
  5. Centos 安装 graylog
  6. kafka之基本介绍
  7. requests Use body.encode('utf-8') if you want to send it encoded in UTF-8
  8. restTemplate源码解析(五)处理ClientHttpResponse响应对象
  9. 2019 WebRtc AudioMixer混音流程
  10. nRF24L01无线介绍