引言
之前一段时间调研选型了分布式文件系统,当时选定了MinIO,但是后来MinIO的开源协议由Apache2.0变更成了AGPLv3,看了一眼授权模式不适合我们这种做小项目的小公司,那就另寻良配,最终找到了SeaweedFS.
SeaweedFS是一个用于Blob、对象、文件和数据湖的快速分布式存储系统,可存储数十亿个文件!Blob存储具有O(1)个磁盘寻道、云分层。Filer支持云驱动、跨DC主动复制、Kubernetes、POSIX FUSE挂载、S3 API、S3网关、Hadoop、WebDAV、加密、擦除编码。
SeaweedFS的架构由Master、volume、Filer组成,Master负责分配把文件具体放入哪个volume,Volume是具体负责存放文件的,不同的Filer插件用于提供不同的功能,例如HTTP访问、S3接口、挂载到文件目录等。看起来有点复杂但理清各个组件的关系后还是比较清晰的。
SeaweedFS的全部功能都是在一个可执行文件里面,通过不同的启动脚本来实现启动不同的服务,例如以最简单的模式启动即Master volume都在同一个机器上启动,部署起来相当简单远没有它看起来的那么复杂,只需一行命令即可。
shell
# 指定文件存储路径,-mserver 同时启动一个Master和一个Volume,Master服务默认端口:9333 volume默认端口:8080
./weed volume -dir="/tmp/data1"
SeaweedFS 架构设计
附上官方架构图
这里再借用知乎的一篇文章的结构图SeaweedFS介绍安装集群部署总结 - 知乎 (zhihu.com)
master 存储文件和fid映射关系(fid类似FastDFS的存储path) |
Node 系统抽象的节点,抽象为DataCenter、Rack、DataNode |
DataCenter 数据中心,对应现实中的不同机房 |
Rack 机柜,对应现实中的机柜,一个机柜属于特定的数据中心,一个数据中心可以包含多个机柜。 |
Datanode 存储节点,相当于服务器,用于管理、存储逻辑卷 |
Volume 逻辑卷,存储的逻辑结构,逻辑卷下存储Needle |
Needle 逻辑卷中的Object,对应存储的文件, Needle 属于 Volume 里面的一个单元 |
Collection 文件集,可以分布在多个逻辑卷上,如果在存储文件的时候没有指定collection,那么使用默认的"" |
怎么使用
一、上传文件前需要先访问Master服务获取分配的fid和卷服务器
shell
> curl http://127.0.0.1:9333/dir/assign
{"count":1,"fid":"3,01637037d6","url":"127.0.0.1:8080","publicUrl":"localhost:8080"}
fid由三部分组成 VolumeId, NeedleId, Cookie
- VolumeId: 3 unsigned 32-bit integer存储的物理卷的Id
- NeedleId: 01 unsigned 64bit 文件key,每个存储的文件都不一样(除了互为备份的)。
- Cookie: 637037d6 unsigned 32bit Cookie值,为了安全起见,防止恶意攻击。
二、向指定的卷服务器上传附件,用上面的到的url地址+fid,上传文件后一定要记住fid
shell
> curl -F file=@/home/chris/myphoto.jpg http://127.0.0.1:8080/3,01637037d6
{"name":"myphoto.jpg","size":43234,"eTag":"1cc0118e"}
三、访问已上传的文件,可通过下列任意一种方式来访问
arduino
http://127.0.0.1:8080/3/01637037d6.jpg
http://127.0.0.1:8080/3,01637037d6.jpg
http://127.0.0.1:8080/3/01637037d6
http://127.0.0.1:8080/3,01637037d6
不知道文件放在了哪个卷服务器时,可以通过Master服务器查询
shell
> curl http://127.0.0.1:9333/dir/lookup?volumeId=3
{"volumeId":"3","locations":[{"publicUrl":"127.0.0.1:8080","url":"127.0.0.1:8080"}]}
# 据此可知 卷服务器id:3,地址:127.0.0.1:8080
四、删除文件
shell
> curl -X DELETE http://127.0.0.1:8080/3,01637037d6
部署
之前讲了快速启动可在一台机上直接启动一个master和一个volume,适用于测试或者单机部署的情况。seaweedFS作为一个分布式文件系统,可以部署多个master,最好是奇数个,官方推荐是3个。
js
#启动主服务
./weed master
./weed master -ip=xxx.xxx.xxx.xxx # usually set the ip instead the default "localhost"
一个volume服务器默认会有8个卷,每个卷可以容纳32G文件,所以一个卷服务器默认能容纳8x32=256G,一台服务器可以启动多个卷服务器或指定不同的卷数量以充分利用磁盘空间。
js
> weed volume -dir="/tmp/data1" -max=5 -mserver="localhost:9333" -port=8080
> weed volume -dir="/tmp/data2" -max=10 -mserver="localhost:9333" -port=8081