FastDFS架构
fastDFS由三大部分组成,负责调度的跟踪服务器、存储服务器和客户端,存储服务器跟追踪服务器都可以拥有不止一台
存储服务器
存储服务器(Storage Server)也称之为数据服务器或者数据结点,用于存储数据的。不但保存了文件的也保存了文件的元数据,具体实现是通过Linux操作系统的文件管理方式实现的。
程序默认启动23000端口监听等待客户端的请求,同时会创建专门的线程周期性地向跟踪服务器上报一些重要信息,例如文件上传总数、成功上传文件数、删除文件总数、成功删除文件总数、下载文件总数、成功下载文件总数、删除文件数、成功删除文件总数等等。
FastDFS使用一种分组的机制,存储集群分为不同的组Group,组内有一台到多台服务器,方便扩展,每个组之间相互独立,相同组之间的服务器数据相互备份,新的存储加入到组内,数据会同步到组内,同步完成后开始对外工作
跟踪服务器
跟踪服务器(Tracker),该程序启动后,默认会在22122端口监听。当存储服务器启动时,会根据其配置文件的信息主动和跟踪服务器通信汇报信息,跟踪服务器收到消息后判断其类型
当服务器上报信息,会用链表形式将存储服务器的状态信息保存起来,然后再用链表形式保存集群中各个分组的信息
当收到的是客户端的文件操作请求,跟踪服务器返回某个存储服务器的地址,客户端直接与该返回地址的存储服务器通信,进行文件操作。跟踪服务器可以调度客户端的任务请求,有负载均衡的效果。同时作为一个中间人,使客户端能够找到提供服务的存储服务器
客户端
使用专有的ClientAPI接口,发起对文件的各种操作请求。但无论是何种请求,都需要跟追踪服务器先通信,获取对应的ip地址才能够与存储服务器通信。通信过程中均采用TCP/IP网络协议
FastDFS的运行机制
文件上传
客户端先跟追踪节点通信,追踪服务器按照一定的算法,轮询或者最大磁盘剩余空间找到一台存储服务器,然后将存储服务器的地址跟端口返回给客户端,客户端用TCP协议直接跟存储服务器通信上传文件。上传结束后,存储服务器将生成的文件ID返回给客户端并且由客户端保存,之后操作文件时候通过文件ID进行操作,在存储服务器上不再使用原有的文件名,而是使用某种HASH算法生成的新的文件名称
生成的文件ID由四个部分组成
- 文件组名
- 磁盘路径
- 文件存在的两级路径,每一级都有256个子目录,即一共65536个目录
- HASH算法生成的新文件名,根据创建时间戳、源存储服务器ip地址、随机数、文件大小以及文件扩展名等等重新生成的
上传的文件会根据某种特定的算法存储到某个目录下,文件可以均匀的分布到各个目录中,方便文件的查找
文件下载
文件下载时候,客户端也需要跟追踪服务器通信,先将需要下载的文件ID发送到追踪服务器,追踪服务器将存储文件的存储服务器的ip根端口通过TCP协议发送给客户端,客户端根据返回的信息与存储服务器建立通信,从而实现文件下载
追踪服务器并不知道文件的存储位置,但客户端文件下载请求中包含了文件ID,追踪服务器可以根据Group知道文件所在的组,然后在该组内找到一台能够用的存储服务器,让客户端跟该存储服务器建立通信
存储服务器接收到的请求也包含文件ID的参数,依据文件ID的虚拟磁盘路径和两级目录迅速找到该文件,然后通过套接字将文件内容返回,完成下载
FastDFS的同步机制
存储服务器启动时会根据配置文件中跟踪服务器的数量,创建相同数目的上报线程与他们分别通信。例如同一个组中有N台服务器,那么每一台服务器都有N-1个线程,每个线程都分别跟另外N-1个线程周期性通信,访问对方的binlog文件,binlog文件有三列数据,分别是时间戳、操作类型、文件id。可以根据操作类型知道是否是源数据,服务器只能从源数据服务器中备份,以此解决备份环路问题。
如果有数据更新,会将logbin文件发送给备份数据的服务器,从文件id中知道源文件的存储路径,从而备份好数据,达到数据一致性。
缺点:fastDFS并不是强一致性,丢失风险高,比如一个组有10台服务器,a服务器存了一个文件,其他服务器会从a备份,但只有5个服务器备份完成了,还有四个没有完成,这时候a挂机了,另外四个服务器数据是不完整的,只要源服务器写入就算成功
FastDFS负载均衡算法的分析与设计
上传文件存储调度方式
分组选择
上传文件时,首先会选择将文件存储在那一组的服务器上,一般有三种算法
- 轮转调度算法
- 手动选择上传的分组
- 负载均衡算法,默认是选择存储空间剩余最大的组
服务器选择
选择好分组后,还需要从分组里面选择出一台最合适的服务器跟客户端进行交互,一般也有三种算法
- 轮转调度算法,默认方式
- IP排序的第一个存储服务器
- 按照优先级排序的第一个服务器
下载文件调度方式
对于下载,不需要进行分组选择,因为文件ID有分组,但需要从该分组中选择一台服务器,一般提供两种调度算法
- 轮转调度算法
- 选择当前文件上传时的源服务器
调度方式分析
轮转算法
轮转算法是一种静态方法,就是服务器轮流存储一次,实际环境中一般不会手动选择
负载均衡算法
FastDFS算法使用的是磁盘最大空间剩余,该方法可以最大限度的使用不同组别的磁盘空间组内分组可以分为可用分组和可存储分组
可用分租满足以下条件
- 分组中有处于活跃状态的服务器
- 存储服务器剩余空间不少于某个值
可存储分组除了满足可用分组的条件,还增加了存储空间使用率这一指标,可存储分组的空间使用率不能够超过规定的比值
负载均衡算法具体实现,当任务到达追踪服务器时候,会先遍历分组链表,在分组链表中找出剩余空间最大的分组,然后检查空间使用率,满足条件,任务调度到该分组中
负载均衡算法的不足之处:
- 算法选择的依据只有一个磁盘剩余空间,磁盘剩余空间越大那么被调度的概率就越大,有可能分组中分配的任务越来越多,导致其他分组处于空闲状态
- 组内选择没有充分考虑服务器性能,比如磁盘IO、CPU、内存等等
FastDFS负载均衡算法的改进
分组负载均衡,在负载均衡算法上加入新的参数因子,进行分组时不是依据磁盘剩余空间,是以磁盘空间使用率和分组内存储服务器的任务使用率,任务使用率就是已分配的任务书和虽大任务数量的比值,最大任务数在配置文件中规定。这样一来,磁盘使用率越低,任务数量越少分组负载就越小,被选中概率就越大
完成分组选择后,组内选择存储服务器要考虑服务器性能和服务器负载情况,那么性能越好负载越小的服务器被选中概率越大。性能由多个因素决定,如CPU、磁盘IO、内存、网络等等
另补上一个很不错的课程:https://ke.qq.com/course/417774?flowToken=1040694
载越小的服务器被选中概率越大。性能由多个因素决定,如CPU、磁盘IO、内存、网络等等
另补上一个很不错的课程:云盘项目学习良心课程