编码狂徒卢嘉勋

Coding Change The World

FastDFS的一些总结

在之前的工作当中,使用到了FastDFS.最早我也不知道这是什么玩意,只是说老大说使用到它.后来它被搭建起来了,并且在项目中是作为图片服务器使用的.光顾着怎么去用,也没有时间好好做个总结,毕竟小公司就是如此比较繁忙,什么事情都要你做但是什么都做不精..回到杭州之后,被网易考拉的大佬问到了FastDFS,所以在此做一个简单的总结,在以后的工作之中多记录一些点滴,毕竟好记性不如烂笔头.

FastDFS是由C语言编写,轻量级开源的分布式文件系统,在跨境通等B2C商城的项目之中作为图片服务器使用,用来存储商家的Logo,商品的图片等图片资源,github地址: https://github.com/happyfish100/fastdfs

FastDFS中有三个角色.Tracker Storage Client.见名知意

Tracker:
翻译过来是追踪者,本身并不是作为存储的角色,而是作为调度者的角色而存在的,也有负载均衡的理念在里面.Tracker管理所有的Storage和Group.

Storage:
Storage是存储的角色,每个Storage启动时会连接Tracker告知自身所属的Group并且报纸周期心跳Tracker则以此来建立Group到Storage的映射信息.同一个Group中的Storage中内容相同,互为备份.Group中Storage的容量以当前组中最小的为准,所以配置的时候要注意最好是设置成相同的大小,避免空间浪费.

Client:
这个就不都说了,一看名字就知道是客户端.和Redis之类的中间件一样都需要一个客户端来访问.

说了那么多 画一下FastDFS的架构图吧.FastDFS架构图

如图所示Client访问Tracker,请求对应的文件地址,Tracker中包含了Storage所属的分组信息,并且通过对应的分组去访问分组中的某个Storage获取到对应的文件信息.
Tracker和Storage都可以搭建集群,这样带来的好处是,可以避免单点故障,让服务可以可靠地提供.Group众多的情况下可以提升系统的QPS.特别适合中小型文件的存储,一般在4KB到500MB之间.

FastDFS对外提供文件的访问接口,如upload,download,append,delete等,通过客户端库的方式提供.

文件上传概述:
文件上传分为选择Tracker,选择Group,选择Storage,生成Field,选择两级目录,生成文件名这么几个步骤.现在互联网项目,为了保证服务可靠性,都会搭建集群,所以按照这种方式来总结.

选择Tracker:
Tracker集群中所有的Tracker地位都是对等的,客户端上传文件时会任意选择一个Tracker.

选择Group:
Tracker收到上传请求之后,会分配一个Group来存储文件,提供的规则有:轮询所有的Group,指定一个Group,负载均衡(剩余空间多的优先)

选择Storage:
分配好Group之后,Tracker会在Group中选择一个Storage,提供的规则有:轮询所有的Storage,根据ip排序,根据Storage优先级排序. 在选定好了Storage之后客户端向Storage发送写入文件请求,Storage为文件分配一个数据存储目录,提供的规则有:存储目录轮询,负载均衡

生成Field:
选择好存储目录之后,Storage为文件分配一个Field,由Storage的ip + 文件创建的时间戳 + 文件大小 + 文件crc32校验后+一个随机数拼接而成.再将这个二进制串进行Base64编码转换成String.

选择两级目录:生成field之后,每个存储目录下会有两级256*256的子目录,Storage会按照field进行第一次hash,路由到第一级子目录,再进行第二次hash,存储到对应的子目录下.

生成文件名:
当文件存储完成后,会为其创建一个文件名,创建规则为:Group + 存储目录 + 两级子目录 + field + 文件拓展名拼接而成
例如:
group12/M00/00/0F/xjkRbWxx1T0BBDDTTDAuSQUghg128824.jpg

文件下载和访问只需要按照这个路径即可..

阅读更多
版权声明:@Author 犯罪嫌疑人卢某 洒家辛苦总结 希望尊重洒家的劳动哟 https://blog.csdn.net/unscdf117/article/details/79052598
个人分类: 中间件总结
上一篇并发编程之Master-Worker模式
下一篇Redis缓存策略的个人看法.
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭