Seaweedfs 是根据 facebook的一篇关于分布式图片系统的论文完成的. 这篇论文的英文原文地址,中文翻译版本的地址
Seaweedfs官方地址为: 这里. 用GO语言完成.
Seaweedfs 我主要用到的是:
weed master
weed volume
weed filer
weed upload
master可以作集群.其用raft来做一致性协议,选举master.
volume服务,就是一个存储的服务.
volume表示一个物理卷,实际上就是一个dat文件.
volume服务启动的时候,可以指定 dir= dir[,dir],
每一个dir可以指定maxVolumeCount,默认是7. 即一个dir对应7个volume.
有关于它的架构,我会再详细介绍.
先说说以前用FASTDFS的痛点:
之前使用fastdfs的时候,尤其是在做老图片导入到fastdfs的时候,还需要自己做处理.为的是原有的图片名称在进入fastdfs后发生了变化 ,比如 1.jpg 可能变成12ds0sdfj123.jpg.
这个时候就需要自己做适配.
要记录原有的图片名称和FASTDFS的名称的对应关系.
Seaweedfs 的 filer功能,就自带了这个处理. filer本身就是一个图片的上传和访问的接口,以HTTP的方式接受 GET 和 POST.
当我们需要传一张图片到文件系统中,只需要按照我们常规的传图方式,POST到 filer的端口即可.
它的对应关系默认存储有三种方式: 1.cassandra 2. redis 3. leveldb
出于对redis的了解程度比其他要深入,所以我选择了使用redis来存储映射关系.
在redis中, key为 图片的原始全路径名,value为seaweedfs的FID,比如:<"/test/1.jpg","2,022776cf3307">
再说说改造:
我在upload服务中,改造了一下代码. 因为用Upload服务可以批量导入一个文件夹下的所有文件. 但是由于文件不经过filer,所以无法完成映射关系.
所以,我在upload中,先记录了完成的图片原始路径和导入后的FID.
再批量插入到REDIS中.
REDIS的DB我默认都设置为了9. 这样如果接入已有的redis集群,对现有数据的影响较小.