分布式文件系统--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
相关推荐
Mintopia2 天前
🚀 AIGC 如何重塑 Web 内容生产的价值链 —— 一场“硅基文艺复兴”的技术变革
人工智能·aigc·全栈
LYFlied3 天前
在AI时代,前端开发者如何构建全栈开发视野与核心竞争力
前端·人工智能·后端·ai·全栈
pixle04 天前
从零学习Node.js框架Koa 【七】Koa实战:构建企业级邮箱验证注册系统
javascript·学习·node.js·koa·注册·全栈·邮箱注册
用户47949283569156 天前
CVE-2025-55182:React 史上最严重漏洞,CVSS 满分 10.0
安全·react.js·全栈
Mintopia6 天前
🤖 大模型AI对话系统:消息结构展示设计猜想
人工智能·llm·全栈
Mintopia7 天前
🏗️ 系统架构之:大模型 Token 计费方案
人工智能·架构·全栈
汤姆Tom10 天前
前端转战后端:JavaScript 与 Java 对照学习指南(第四篇 —— List)
前端·编程语言·全栈
czc66611 天前
【项目实战】如何设计一个可以无限叠楼并且支持一键跳转目标的游标评论树?
全栈
Mintopia11 天前
🚀 2025全栈架构方案汇总与未来分析
人工智能·架构·全栈
我叫黑大帅12 天前
存储管理在开发中有哪些应用?
前端·后端·全栈