文章目录
前言
通过项目,我们了解到fastdfs的部署,可以有多个tracker server和storage server。那在文件上传和下载的时候是如何选择的呢,接下来我们进行学习。在之前,我们已经学过nginx了,肯定也知道了nginx的负载均衡,对其不了解的可以查看这篇文章 nginx基本使用一 ——反向代理、负载均衡。了解了这个,再类比学fastdfs的选择策略也会简单很多。
本文主要 描述一下几点:
文件上传机:
- 如何选择tracker
- 如何选择group
- 如何选择storage
- 如何选择path
以及下载⽂件的时候如何选择storage
一、FastDFS如何选择tracker和客户端通信?
在trakcer集群中,每个tracker的地位都是平等的,因此client可以随机选择一个tracker进行连接。client会通过轮询的方式选择一个tracker,要是此tracker不能提供服务,则换下一个tracker。
二、FastDFS如何选择一个group?
选择的Group需要满足两个条件:
Group中当前要有处于Active状态的Storage;
Group的空闲空间(组内Storage最小的空闲空间)大于配置的保留空间。
group的选择支持如下规则:
- Round robin,所有的group间轮询
- Load balance,选择最大剩余空 间的组上传⽂件
- Specified group,指定某⼀个确定的group
判断若store_lookup==ROUND_ROBIN或者LOAD_BALANCE
直接使用g_groups.current_write_group值,该值默认为0,若选择方式为轮询ROUND_ROBIN则每次选择后会递增,而若为负载均衡LOAD_BALANCE则Tracker在每次收到Storage的磁盘使用率汇报消息STORAGE_REPORT_DISK_USAGE时更新。得到group的索引值后,只要去检查该group是否满足上面说到的两个条件,若满足,group就选择好了。否则按照顺序依次检测后面的group找到一个满足条件的group即可。若依然没找到则返回错误。
判断若store_lookop==SPEC_GROUP
指定group,那么直接去检查该Group是否符合上述两个条件,若符合则表示找到group,若不符合则返回错误。
三、FastDFS如何选择一个storage?
storage的选择支持如下的规则:
- Round robin,在group内的所有storage间轮询
- First server ordered by ip,按ip排序
- First server ordered by priority,按优先级排序(优先级在storage上配置)
pStoreServer指针
Tracker之中为每个Group保存一个pStoreServer指针,该指针表示下次存储数据时可使用的Storage对象指针。在源码中通过tracker_mem_find_store_server函数来实现更新,在该Group之中有Storage状态从非Active变成Active或者,从Active变成非Active时否将检查是否更新。
pStoreServer指针更新按照如下逻辑进行:若该组没有状态为Active的Storage则直接返回。若tracker.conf配置的store_server==2(按照优先级),则会遍历该组内的Active状态Storage找到其中优先级最小的那个Storage赋予他;其他情况就是直接使用第一个Active状态的Storage赋予它。
若store_server==ROUND_ROBIN则直接按照轮询方式选择下一个Active状态的Storage;否则直接使用该Group的pStoreServer指针对应的Storage即可。
四、FastDFS如何选择一个Storage Path?
当分配好storage server后,客户端将向storage发送写文件请求,storage将会为⽂件分配⼀个数据存储
目录,支持如下规则:
- Round robin,多个存储目录间轮询
- 剩余存储空间最多的优先
Tracker为每个Storage保存一个current_write_path,该值表示当前应该使用的store_path_index。初始时该值等于零,若store_path==1(负载均衡,表示使用最大空闲空间的那个Store_path),则在Storage每次汇报磁盘空间使用率的消息中更新,与Group负载均衡方式类似。
此时只要从current_write_path开始选择Store_path,只要满足空闲空间大于保留空间则选择结束。
五、Tracker选择Download Storage
Tracker在为下载而选择一个Storage时提供的配置为download_server配置,可以选择从源Storage优先下载或者轮询下载。Tracker首先会检查要下载的Group中是否有状态为Active的Storage,若没有则直接返回失败。
源优先下载
(1)先从要下载的FileID中解析出storage_id、timestamp、file_size三个字段
(2)使用storage_id去查找对应的Storage,若其状态为Active则成功返回,否则转变成轮询方式选择。
轮询方式选择
从上次的位置向后检查状态为Active的Storage,做如下判断,若以下条件之一符合则返回该Storage:
(1)文件时间timpstamp为一天之前(FastDFS假设一天之前的文件肯定同步完成)
(2)该Storage的最后最早被同步时间大于该文件的timestamp
(3)该storage的最后被同步时间+1大于文件时间并且当前时间减去文件时间大于300秒
(4)该Storage就是文件的源Storage
在此不得不说下文件同步延迟问题的解决
解决文件同步延迟问题
FastDFS文件同步采用异步复制的方式,利用时间戳解决文件同步延迟导致新上传文件可能访问不到的问题。
storage 生成的文件名中,包含源头storage ID/IP地址和文件创建时间戳(timestamp)。storage 定时向tracker 报告文件同步情况,包括向同组其他storage 同步到的文件时间戳。tracker收到storage的文件同步报告后,找出该组内每台storage被同步到的最小时间戳,作为storage属性保存到内存中。
下载选择如上依据时间戳选择
FastDFS巧妙利用时间戳来解决文件同步延迟带来的文件访问问题。