图片
场景切入
在大型网站中由于用户数和存储内容较多,存在大容量文件存储的场景,例如图片、视频、日志、文件等。如何保证这些资源的高可用性和快速访问,从而提升用户体验和网站性能?
图片
分布式存储的由来
我们知道,根据业务体量的增大,一般分布式的设计是从单体应用演进开始的。最初,在单体项目中,
图片
早期用户量可能比较少,整个系统的一个架构:服务代码跟我们的文件资源信息都存储在了一个服务器上面。
随着用户量越来越多,那么存储文件越来越多,本身服务器可能就只有比如:100G的磁盘空间,文件服务器里面存储的东西越来越多。那么,它会影响到整个服务器的资源的一个分配。
有人想,把我们这个文件服务器单独的给拆出来,作为一个单独服务器
图片
上边实现了资源文件和代码的解耦。但是资源文件的存储量美誉得到根本性的解决。
于是,我们就需要拓宽服务器,我拓宽到10台,20台。。。其实就是要说的这个分布式文件存储系统。
图片
常见的分布式存储框架
图片
本章重点介绍FastDFS。
FastDFS 分布式存储
简介
官方介绍:
图片
FastDFS是一个开源的分布式文件系统,特别适合于大容量文件存储的场景,例如图片、视频、日志、文件等。是一个开源的高性能分布式文件系统,专为解决大容量存储和负载均衡问题而设计。
中文官网[1]英文官网[2]学习地址[3]下载地址[4]源码包[5]性能测试[6]Gitee主页[7]
它具备以下核心功能:
- 文件存储:能够存储大量数据文件。
- 文件同步:确保文件在系统内的多个副本之间保持一致。
- 文件访问:支持用户上传和下载文件。
FastDFS 功能特性
- 分组存储,简单灵活;
- 对等结构,不存在单点;
- 文件ID由FastDFS生成,作为文件访问凭证。
- 大、中、小文件均可以很好支持,可以存储海量小文件;
- 一台storage支持多块磁盘,支持单盘数据恢复;
- 提供了nginx扩展模块,可以和nginx无缝衔接;
- 支持多线程方式上传和下载文件,支持断点续传;
- 存储服务器上可以保存文件附加属性。
FastDFS 架构及工作原理
架构设计:
图片
工作原理:
- Client 客户端:实际项目的访问客户端。
- Tracker Server: 跟踪服务器,主要做调度工作,在访问上起负载均衡的作用。在内存中记录集群中group和storage server的状态信息,是连接client和Storage server的枢纽。
- Storage Server: 存储服务器,文件和文件属性(meta data)都保存到存储服务器上。其功能包括:
- 文件存储:保存上传的文件数据。
- 文件同步:在多个存储节点之间同步文件,以保证数据一致性。
- 提供文件访问接口:允许用户通过API进行文件操作。
- 管理元数据:存储文件的相关属性,以键值对的形式,例如图像的宽度可以表示为 width=1024。
问题思考
如何上传文件?
图片
上传文件过程描述:
- 客户端需要上传或下载文件,向FastDFS系统发起请求。
- 连接到FastDFS的跟踪器服务器。跟踪器负责调度和负载均衡。
- 跟踪器接收到客户端的请求后,会根据当前的负载情况和存储策略,选择一个合适的存储服务器。
- 跟踪器将所选存储服务器的IP地址和端口号发送给客户端。
- 客户端根据跟踪器提供的IP地址和端口号,直接与选定的存储服务器建立连接。
- 客户端将文件内容和元数据发送给存储服务器。元数据可能包括文件卷名(volume)和文件名等信息。
- 存储服务器接收到文件后,将其保存在本地磁盘上,并根据FastDFS的配置创建多个副本,可能在同一个存储组内的其他服务器上。
- 文件存储完成后,存储服务器会向客户端发送响应,确认文件上传成功或提供下载链接。
- 客户端收到存储服务器的响应后,完成文件上传或下载操作。
如何下载文件?
图片
文件下载过程描述:
- 客户端想要获取存储在FastDFS系统中的文件,向系统发起下载请求。
- 发送请求到FastDFS的跟踪器服务器。跟踪器负责管理文件的元数据,并知道文件存储的位置。
- 跟踪器接收到客户端的请求后,根据文件的卷名(volume name)和文件名(filename)查找文件存储信息。
- 跟踪器确定文件所在的存储服务器,并将该服务器的IP地址和端口号返回给客户端。
- 客户端使用跟踪器返回的IP地址和端口号,直接与存储服务器建立连接。
- 客户端向存储服务器发送文件下载请求,包括卷名和文件名。
- 存储服务器接收到请求后,根据提供的卷名和文件名检索文件。
- 一旦找到文件,存储服务器将文件内容发送回客户端。
- 客户端接收到文件内容,下载流程完成。
如何保证高可用?
FastDFS设计为一个多副本分布式文件系统。多副本机制是FastDFS保证数据可靠性和容错能力的关键。
图片
几个关键点:
- 至少有一个副本,或者多个。
- 文件和文件副本位于同一个组(Group)或者叫卷(Volume)
- 不同卷之间有效的资源隔离
- 文件和文件副本位于不同的机器上,如图:副本i,副本ii...位于不同的主机上,对应不同的ip和port
- 同步机制:同步和异步两种方式
- 自动副本同步: 当向存储组添加新的存储服务器时,现有文件的副本会自动同步到新服务器上。
通过以上设计提高容错能力和单点故障问题,保证高可用。
如何解决性能瓶颈?
我们在架构图中发现,Tracker 也是分布式部署,便于扩缩容。面对访问激增的问题,可通过增加节点的方式应对。
图片
几个关键点:
- 通过增加Tracker服务器的数量,可以分担请求调度和负载均衡的任务,从而提高系统的整体性能。
- 通过增加更多的存储服务器或存储卷来扩展存储容量,减少单个服务器的负载。
- 根据业务需求选择合适的同步策略,权衡同步复制的性能开销和异步复制的延迟。
总结
文章主要介绍分布式存储FastDFS 结构设计和原理和使用过程中的一些问题思考。
使用过程中FastDFS几个关键特性的优缺点对比:
特性 | 优点 | 缺点 |
架构设计 | 易于扩展、负载均衡 | 同步延迟 |
冗余备份 | 支持在线扩容 | 存储空间利用率不高 |
高性能 | C语言编写,执行效率高 | 单点性能瓶颈 |
内存管理 | - 内存零拷贝,减少系统开销 | - 对内存要求较高 |