fastdfs
功能
FastDFS
主要的功能包括:
- 文件存储,
- 同步和访问,
- 设计基于高可用和负载均衡。
FastDFS
非常适用于基于文件服务的站点
组成
FastDFS
由跟踪服务器(tracker server
)、存储服务器(storage server
)和客户端(client
)三个部分组成,主要解决海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size < 500MB
) 为载体的在线服务,例如图片分享和视频分享网站
- 跟踪服务器
tracker
提供负载均衡,集群中的每一个tracker
都要保存storage
集群的所有信息,供client
访问并上传文件- 负载均衡:
- 可以看见不同的
group
中的对应空间有多少,根据空间大小来选择在哪个group
中上传,选择到指定group
后就会确定一个storage server
给客户端涉及到两个部分的选择group
的选择
round robin
,所有的group
间轮询specified group
,指定某一个确定的group
load balance
,选择剩余空间最大的
storage server
的选择
round robin
,在指定group
内的所有storage
间轮询First server ordered by ip
,按ip
排序First server ordered by priority
,按优先级排序
- 存储服务器
storage
可以是集群,所有的group
都要上报到tracker
集群的每一个tracker
中storage
集群
- 同一个
group
内的storage
存储的数据是一样的
- 客户端
- 用于上传文件与下载文件,
fdfs
提供了对应源码实现 client
访问tracker
目的是为了获取哪一个storage
可以上传文件
上传文件流程:
client
访问tracker
,tracker
通过负载均衡指定一个group
,然后再在这个group
中指定一个storage server
返回给client
,client
向这个storage server
发送写文件请求,storage server
会为文件分配一个数据存储目录
storage server
收到client
发送的写请求后进行的处理
- 生成
fileid
:由ip,创建时间,文件大小,文件crc32
和一个随机数拼接而成,然后进行base64
编码,转化为了可打印的字符串 - 选择两级目录
- 生成文件名:格式
组名/磁盘/目录/fileid.txt
fastdfs
上传一个文件指令
> ls hello.txt > fdfs_upload_file /etc/fdfs/client.conf hello.txt /group1/M00/00/00/wKg4aWRT1ZeAM66YAAAAKYfybsk605.txt
- 解析返回的文件名
- 存储在哪个
gourp
:group1
- 在哪个磁盘:
M00
- 在哪个目录:
00/00
ClientTrackerServerStorage定时向tracker上传状态信息上传连接请求获取可用storage节点返回可用storage节点返回可用存储节点(storage的ip和端口)上传文件到可用存储节点(file content和metadata)生成file_id将上传内容写入磁盘返回file_if(路径信息和文件名)存储文件信息ClientTrackerServerStorage
下载文件流程:
client
访问tracker
,tracker
会告诉client
从group
中的哪一个storage
中下载文件fastdfs
下载一个文件指令
fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/wKg4aWRTdjKAKYp2AAAHeD18SIc60.conf
ClientTrackerServerStorage定时向tracker上传状态信息下载连接请求获取可用storage节点(检验同步状态)返回可用storage节点返回节点(storage的ip和端口)信息根据组名/目录/文件名查找文件查找文件返回file_contentClientTrackerServerStorage
如何支持高可用
高可用指系统能够在预期的时间内一直处于可用状态
tracker
是集群- 同一组的
storage
的内容是相同的(一个group
建议3
个storage
) - 强一致性,若一致性
- 如果是强一致性,同一组中上传完毕后需要等待其他
storage
同步完毕
- 数据更安全可靠,等待时间长
- 如果是弱一致性,当前的
storage
存储完毕就返回
- 数据不太可靠,等待时间短