https://www.cnblogs.com/chiangchou/p/fastdfs.html
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之类的中间件一样都需要一个客户端来访问.
如图所示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
文件下载和访问只需要按照这个路径即可..