FastDFS的选择策略


前言

通过项目,我们了解到fastdfs的部署,可以有多个tracker server和storage server。那在文件上传和下载的时候是如何选择的呢,接下来我们进行学习。在之前,我们已经学过nginx了,肯定也知道了nginx的负载均衡,对其不了解的可以查看这篇文章 nginx基本使用一 ——反向代理、负载均衡。了解了这个,再类比学fastdfs的选择策略也会简单很多。
本文主要 描述一下几点:
文件上传机:

  1. 如何选择tracker
  2. 如何选择group
  3. 如何选择storage
  4. 如何选择path

以及下载⽂件的时候如何选择storage


一、FastDFS如何选择tracker和客户端通信?

在trakcer集群中,每个tracker的地位都是平等的,因此client可以随机选择一个tracker进行连接。client会通过轮询的方式选择一个tracker,要是此tracker不能提供服务,则换下一个tracker。

二、FastDFS如何选择一个group?

选择的Group需要满足两个条件:
Group中当前要有处于Active状态的Storage;
Group的空闲空间(组内Storage最小的空闲空间)大于配置的保留空间。

group的选择支持如下规则:

  1. Round robin,所有的group间轮询
  2. Load balance,选择最大剩余空 间的组上传⽂件
  3. 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的选择支持如下的规则:

  1. Round robin,在group内的所有storage间轮询
  2. First server ordered by ip,按ip排序
  3. 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将会为⽂件分配⼀个数据存储
目录,支持如下规则:

  1. Round robin,多个存储目录间轮询
  2. 剩余存储空间最多的优先

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巧妙利用时间戳来解决文件同步延迟带来的文件访问问题。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值