文章来源于刘小绪记录的刘欣大神课堂笔记
为方便下一篇下载文件的理解,这里假设上传的文件为:Group1/M00/00/0C/wKjGgVgbV2-ABdo-AAAAHw.jpg
如下面的时序图可以看到客户端是如何上传文件到服务器的。首先client向tracker发送上传链接请求,然后由tracker进行调度,查询可用的storage,并把该storgae对应的ip和端口发送给client;拿到了存储服务器信息,client就直接将文件上传到storage即可;storage会生成新的文件名再写入到磁盘,完成之后再把新的文件信息返回给client,client最后把文件信息保存到本地。需要注意的是,storage会定时向tracker回报信息。
如何选择服务器
ltracker不止一个,客户端选择哪一个做上传文件?
ntracker之间是对等的,任选一个都可以
ltracker如何选择group?
nround robin(轮询)
nload balance(选择最大剩余空间group上传)
nspecify group(制定group上传)
l如何选定storage?
nround robin,所有server轮询使用(默认)
n根据ip地址进行排序选择第一个storage(ip地址最小者)
n根据优先级进行排序(上传优先级由stoage来设置,参数为upload_priority)
l如何选择storage path
nround robin,轮询(默认)
nload balance,选择使用剩余空间最大的存储路径
如何选择存放目录
l选定存放目录?
nstorage会生成一个file_id,采用Base64编码,字段包括:storage ip、文件创建时间、文件大小、文件CRC32校验和随机数
n每个存储目录下面有两个256 * 256个子目录,storage会按文件file_id进行两次hash,然后将文件以file_id为文件名存储到子目录下
需要注意的是:file_id由cilent来保存,如果没有保存,你就不知道你上传的文件去那里了
Storageserver之间的文件同步
l同一组内的storage之间是对等的,文件上传、删除等操作可以在任意一台storage上进行
l文件同步只在同组内的stroage之间进行,采用push方式,即源服务器同步给目标服务器
l源头数据才需要同步,备份数据不需要再次同步,否则就构成环路了
l新增一台storage时,由已有的一台storage将已有的所有数据(包括源头数据和备份数据)同步给该新增服务器
Storage的最后最早同步被同步时间
这个标题有一些拗口,现在有三台服务器A、B、C,每个服务器都需要记录其他两台服务器向自己进行同步操作的最后时间。比如下图中的服务器A,B在9:31向A同步了所有的文件、C在9:33向A同步了所有的文件,那么A服务器的最后最早被同步时间就是9:31。其他两个服务器也是一样。
最后最早被同步时间的意义在于判断一个文件是否存在于某个storage上。比如这里的A服务器最后最早被同步时间为9:31,那么如果一个文件的创建时间为9:30,就可以肯定这个文件在服务器A上肯定有。
stroage会定期将每台机器的同步时间告诉给tracker,tracker在client需要下载一个文件时,要判断一个storage是否有该文件,只需要解析文件的创建时间,然后与该值作比较,若该值大于创建时间,说明storage存在这个文件,可以从该storage下载。
但是这个算法有缺陷,比如下面的情况:W文件的创建时间是9:33,服务器C已经把9:33之前的文件都同步给B了,因此B服务器里面其实已经有W文件了,但是根据最后最早被同步时间,会认为B中没有W文件。因此这个算法虽然简单,但是牺牲了部分文件。
——————END——————
下一篇:FastDFS下载文件及其他内容
领取专属 10元无门槛券
私享最新 技术干货