分布式文件系统--SeaweedFS的快速入门

引言

之前一段时间调研选型了分布式文件系统,当时选定了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
相关推荐
余生H3 小时前
前端的全栈混合之路Meteor篇:关于前后端分离及与各框架的对比
前端·javascript·node.js·全栈
余生H2 天前
前端的全栈混合之路Meteor篇:RPC方法注册及调用
前端·rpc·node.js·全栈
余生H3 天前
前端的全栈混合之路Meteor篇:运行在浏览器端的数据库-MiniMongo介绍及其前后端数据实时同步示例
前端·javascript·数据库·全栈
Passion不晚7 天前
Java 全栈开发中的最佳实践:从前端到后端的完整流程
java·前端·全栈
黑羽同学11 天前
构建高效的 TodoList Web 应用:基于 Firebase 的全栈实现
react.js·全栈·firebase
程序者王大川21 天前
【前端】Flutter vs uni-app:性能对比分析
前端·flutter·uni-app·安卓·全栈·性能分析·原生
程序者王大川23 天前
【移动端】Flutter与uni-app:全方位对比分析
flutter·uni-app·app·nodejs·全栈·dart·移动端
我是若尘2 个月前
网络小白的进阶之路:轻松搞懂L3、L4、L7
前端·全栈
肉松饭2 个月前
开发人自己的项目管理工具(三)项目搭建-server端
前端·全栈
比特桃2 个月前
纯技术手段实现内网穿透,免注册免收费
http·docker·全栈