基于FastDfs的分布式文件存储系统设计

2024-08-23 19:18

本文主要是介绍基于FastDfs的分布式文件存储系统设计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

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

FastDFS 架构

FastDFS 服务有三个角色:跟踪服务器(tracker server)、存储服务器(storage server)和客户端(client).

tracker server: 跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的 storage server和 group,每个 storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳,Tracker 根据 storage 心跳信息,建立 group--->[storage server list]的映射表;tracker 管理的元数据很少,会直接存放在内存;tracker 上的元信息都是由 storage 汇报的信息生成的,本身不需要持久化任何数据,tracker 之间是对等关系,因此扩展 tracker 服务非常容易,之间增加tracker 服务器即可,所有 tracker 都接受 stroage 心跳信息,生成元数据信息来提供读写服务(与其他 Master-Slave 架构的优势是没有单点,tracker 也不会成为瓶颈,最终数据是和一个可用的storage Server 进行传输的)。

storage server:存储服务器,主要提供容量和备份服务;以 group 为单位,每个 group 内可以包含多台 storage server,数据互为备份,存储容量空间以 group 内容量最小的 storage 为准;建议 group 内的 storage server 配置相同;以 group 为单位组织存储能够方便的进行应用隔离、负载均衡和副本数定制;缺点是 group 的容量受单机存储容量的限制同时 group 内机器坏掉数据恢复只能依赖 group 内其他机器重新同步(坏盘替换重新挂载重启 fdfs_storaged 即可)。

多个 group 之间的存储方式有 3 种策略:round robin(轮询)、load balance(选择最大剩余空间的组上传文件)、specify group(指定 group 上传)

group 中 storage 存储依赖本地文件系统,storage 可配置多个数据存储目录,磁盘不做 raid,直接分别挂载到多个目录,将这些目录配置为 storage 的数据目录即可。

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



FastDFS 工作流程

(1)上传



选择 tracker server

集群中 tracker 之间是对等关系,客户端在上传文件时可用任意选择一个 tracker选择存储 group

(2)下载



基于fastdfs的集群

(1)架构


应用服务器(即是网站):

应用服务器是lnmp的环境,同时也在应用服务器的安装部署fastdfs,但是是作为tricker跟踪点,同时也必须安装fastdfs的php的api扩展,即php_client。在/etc/fdfs/client.conf是客服端程序,这个与php.ini有着关系,需要正确配置,简单地说,php的扩展函数是通过这个client.conf文件将php与tracker联系在一起。然后就是fastdfs的tracker与storage之间再通信,最后是php和storage建立通信关系,并进行数据传输(也就是上面提到的fastdfs的工作流程原理)。


storage的分组集群:

每一台服务器都单独安装fastdfs的文件服务器,同时也安装nginx和nginx_fastdfs_modul模块,这个nginx主要是用于http的访问,特别是用于下载服务,而nginx_fastdfs_modul这个模块主要是为了避免同步复制还没复制完成就访问同组备份服务器文件,这肯定会产生错误的,所以加入nginx_fastdfs_modul这个模块可以避免这种同步延迟的问题,如果http访问找不到文件,那么tracker就会重新访问文件的源服务器。

组与组之间的服务器是相互独立的,没有任何的关系。但组内的各个服务器是可以相互通信的,主要是热备文件,文件之间同步复制,所以组内的各个服务器即storage服务器存的数据是相同的。但是组内的每一台服务器容量是已组内最小的那一台作为基准,索引建议组内的服务器的容量配置相同。

当一个组内的容量最小的那一台服务器的存储容量几乎达到瓶颈时,一般fastdfs会预留4GB左右吧。这时再往组内存储文件已经是不能的了,必须横向扩展存储,即添加组,增加storage服务器。当再上传大文件时,tracker就会通过选择一个组来存储文件,规则:

这篇关于基于FastDfs的分布式文件存储系统设计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1100264

相关文章

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

Java 线程池+分布式实现代码

《Java线程池+分布式实现代码》在Java开发中,池通过预先创建并管理一定数量的资源,避免频繁创建和销毁资源带来的性能开销,从而提高系统效率,:本文主要介绍Java线程池+分布式实现代码,需要... 目录1. 线程池1.1 自定义线程池实现1.1.1 线程池核心1.1.2 代码示例1.2 总结流程2. J

Redis实现分布式锁全过程

《Redis实现分布式锁全过程》文章介绍Redis实现分布式锁的方法,包括使用SETNX和EXPIRE命令确保互斥性与防死锁,Redisson客户端提供的便捷接口,以及Redlock算法通过多节点共识... 目录Redis实现分布式锁1. 分布式锁的基本原理2. 使用 Redis 实现分布式锁2.1 获取锁

Redis分布式锁中Redission底层实现方式

《Redis分布式锁中Redission底层实现方式》Redission基于Redis原子操作和Lua脚本实现分布式锁,通过SETNX命令、看门狗续期、可重入机制及异常处理,确保锁的可靠性和一致性,是... 目录Redis分布式锁中Redission底层实现一、Redission分布式锁的基本使用二、Red

redis和redission分布式锁原理及区别说明

《redis和redission分布式锁原理及区别说明》文章对比了synchronized、乐观锁、Redis分布式锁及Redission锁的原理与区别,指出在集群环境下synchronized失效,... 目录Redis和redission分布式锁原理及区别1、有的同伴想到了synchronized关键字

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一

Jenkins分布式集群配置方式

《Jenkins分布式集群配置方式》:本文主要介绍Jenkins分布式集群配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装jenkins2.配置集群总结Jenkins是一个开源项目,它提供了一个容易使用的持续集成系统,并且提供了大量的plugin满

MyBatis设计SQL返回布尔值(Boolean)的常见方法

《MyBatis设计SQL返回布尔值(Boolean)的常见方法》这篇文章主要为大家详细介绍了MyBatis设计SQL返回布尔值(Boolean)的几种常见方法,文中的示例代码讲解详细,感兴趣的小伙伴... 目录方案一:使用COUNT查询存在性(推荐)方案二:条件表达式直接返回布尔方案三:存在性检查(EXI

Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)

《Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)》本文主要介绍了Golang分布式锁实现,采用Redis+Lua脚本确保原子性,持可重入和自动续期,用于防止超卖及重复下单,具有一定... 目录1 概念应用场景分布式锁必备特性2 思路分析宕机与过期防止误删keyLua保证原子性可重入锁自动