0

最近在看淘淘商城项目,用fastDFS进行图片上传,上传的时候是tracker找一台空闲的storage进行图片上传返回上传路径,问题在下载的时候,为什么不能直接拿着路径下载,而是需要继续访问tracker看哪台storage空闲,问题是上传的storage是固定的啊,只是在那一组storage上有图,而一组storage的ip地址是一样的,那个tracker返回的信息只可能是那一组有图片的storage的IP地址以及图片路径,问题是这些我在上传的时候都获取到了啊,为什么下载的时候还要再次获取

2018-08-22 提问
2 个回答
0

最近在看fastdfs,一个group下的多个存储服务器之间是互相同步的,上传时返回的路径只是源存储服务器地址,不代表下载的时候要从这个地址下载,还可以从这个group下的其他存储服务器节点下载,所以需要tracker服务器去从新获取,来决定从哪个存储节点下载,请参考。

0

先说上传:
FastDFS一组里是有多个storage的,每个storage的ip是不一样的,同组storage会相互同步数据,在上传的时候是tracker挑选一个组里的一个storage进行上传,并在返回的fileID串里记录了文件所在的组(g1)、所在组内的存储目录(M00),存储目录中的二级目录(共256*256个)、存入的时间戳和文件偏移量信息等

再说下载:
FastDFS是面向海量小文件存储场景的,场景为一次写多次读,因此读需要做负载均衡,由于一个组里的多个storage是相互同步的,因此拿到属于某个组的fileID时,就要在这些storage里挑一个访问,但由于同步是有延时的,你存进去后短时间内再读(这种场景很常见),这个文件可能只同步到了部分storage,作为客户端的你怎么知道哪个storage有?客户端是无法知道的,而tracker就知道,它根据每个storage的同步日志的最后时间和fileID里的时间戳做比较,按照一些逻辑判断该文件是否已经同步到了某个storage中,然后再随机挑选一个已经有这个文件的storage给你下载,从而也实现了组内storage的负载均衡

伴随而来的坑
上面说了下载的时候tracker是根据fileID里的时间戳和每个storage的同步时间点来对比挑storage的,假设storage之间时间不同步,会可能出现tracker判定storage的同步时间点已经超过fileID的时间戳足够长的时间了,就让它给你下载,但其实可能这个storage还没同步这个文件过来,就导致了下载失败。因此同组内storage之间时间同步是必要的

撰写答案

推广链接