基于facebook haystack的SeaweedFS是一种简单的、高度可扩展的分布式文件系统。SeaweedFS是一个非常优秀的由 go语言开发的分布式存储开源项目。它是用来存储文件的系统,并且与使用的语言无关,使得文件储存变得非常方便。
SeaweedFS设计用来有效地存储处理小文件,较大文件可以分块拆分为小文件进行上传。所有文件的元数据不存储在Master节点,而是分散存储在Volume(逻辑卷,存储数据的逻辑结构)中,Master节点只保存卷 ID 到卷服务器的映射,这样一来,Master节点的查询压力就被分散到volume节点了。这些文件卷服务器各自管理各自的元数据,存储在卷服务器上的所有文件元信息都可以从内存中读取,而无需访问磁盘。所以这样在高并发的情况下减少了主节点的压力和网络通信,同时定位文件也更迅速。
github地址:seaweedfs/seaweedfs: SeaweedFS is a fast distributed storage system for blobs, objects, files, and data lake, for billions of files! Blob store has O(1) disk seek, cloud tiering. Filer supports Cloud Drive, cross-DC active-active replication, Kubernetes, POSIX FUSE mount, S3 API, S3 Gateway, Hadoop, WebDAV, encryption, Erasure Coding. (github.com)
github星数:18.3k
开源协议: Apache-2.0 license
官方文档:https://github.com/seaweedfs/seaweedfs/wiki/Getting-Started
seaweedfs是一个高度可扩展的分布式文件存储系统,其主要组件包括:
其架构特点包括:
1、MinIO 遵循 AWS S3,是使用S3 API 的理想选择。它具有良好的UI,策略,版本控制等。seaweedfs正试图在这里迎头赶上。以后也可以将 MinIO 作为 SeaweedFS 前面的网关。
2、MinIO 元数据位于简单文件中。每次文件写入都会对相应的元文件进行额外的写入。
3、MinIO没有针对大量小文件的优化。这些文件只是按原样存储到本地磁盘。加上用于纠删码的额外元文件和分片,它只会放大 LOSF 问题。
4、MinIO具有多个磁盘IO来读取一个文件。SeaweedFS 具有 O(1) 磁盘读取功能,即使对于纠删码文件也是如此。
5、MinIO具有full-time擦除编码。SeaweedFS 对热数据使用复制以加快速度,并可选择对热数据应用纠删码。
6、MinIO没有类似POSIX的API支持。
7、MinIO对存储布局有特定的要求。调整容量并不灵活。在 SeaweedFS 中,只需启动一个指向主服务器的卷服务器。
官方目前提供了四种
https://github.com/seaweedfs/seaweedfs/wiki/Client-Libraries
分别是:
| 名称与链接 | 作者 | 语言 | 星星数目 |
| Java SeaweedFS client | Zenria | Java | 27 |
| SeaweedFS Client | Lokra Studio | Java | 49 |
| SeaweedFS Client For Java | Shuyun123 | Java | 49 |
| seaweedfs4j | zhiyoucai | Java | 0 |
使用官方提供的库与SpringBoot进行集成:
依赖引入:
- <dependency>
- <groupId>com.github.chrislusfgroupId>
- <artifactId>seaweedfs-clientartifactId>
- <version>3.55version>
- dependency>
注意:
Volume服务器分布在不同的计算机上。它们可以具有不同的磁盘空间,甚至不同的操作系统。
通常,您需要指定可用的磁盘空间、Weed Master的位置以及存储文件夹。
./weed volume -max=100 -mserver="localhost:9333" -dir="./data"
如果您正在使用自定义的gRPC端口用于Master服务器,
mserver的地址格式为<主机>:<端口>.
默认情况下,gRPC端口是端口+10000。

使用方法
创建连接:
在创建一个FilerClient对象时,示例中的端口号18888是默认的gRPC端口。
启动filer时,使用命令weed filer -port=8888,端口号8888是默认的HTTP端口。
FilerClient filerClient = new FilerClient("IP", 18888);
读取文件:
- FilerClient filerClient = new FilerClient("60.204.157.221", 18888);
- SeaweedInputStream seaweedInputStream = new SeaweedInputStream(filerClient, "/test.zip");
- //作为常用输入流
写出文件
- FilerClient filerClient = new FilerClient("localhost", 18888);
- SeaweedOutputStream seaweedOutputStream = new SeaweedOutputStream(filerClient, "/test/"+filename);
- // next, you can use seaweedOutputStream as a normal OutputStream

可以完成文件的上传


linux_amd64.tar.gz
在opt目录下创建seaweedfs空文件夹,并将压缩包解压到该文件夹。
- mkdir /opt/seaweedfs
- tar -zxvf /opt/files/linux_amd64.tar.gz -C /opt/seaweedfs
mkdir -p /opt/seaweedfs/data /opt/seaweedfs/volume
将目录切换到seaweedfs下,当前目录下有weed脚本。
cd /opt/seaweedfs
启动master服务,配置方法与参数如下:
| master参数 | ||
| cpuprofile | string | cpu配置文件输出文件 |
| -defaultReplication | string | 默认复制类型(如果未指定) (默认 "000") 000: 只存储一份,默认设置 001: 在相同的Rack复制一份 010: 在同一DC的不同rack上复制一次 100: 在不同的DC复制一次 200: 在另外两个不同的DC上复制两次 110: 在不同的rack上复制一次,并在不同的DC上复制一次。 |
| -disableHttp | 禁用http请求,只允许gRPC操作。 | |
| -garbageThreshold | float | 清空和回收空间的阈值 (默认 0.3) |
| -ip | string | 指定ip地址 (默认 "localhost") |
| -ip.bind | string | 要绑定的IP地址 (默认 "0.0.0.0") |
| -maxCpu | int | 最大CPU数。 0表示可用所有CPU |
| -mdir | string | 用于存储元数据的数据目录 |
| -memprofile | string | 内存配置文件输出文件 |
| -peers | string | 以逗号分隔的所有主(master)节点 ip:port 列表, 示例: 127.0.0.1:9093,127.0.0.1:9094 |
| -port | int | http监听端口 (默认 9333) |
| -pulseSeconds | int | 心跳之间的秒数 (默认 5) |
| -volumePreallocate | uint | 预分配卷的磁盘空间 |
| -volumeSizeLimitMB | uint | Master停止指向超大卷的写入 (默认 30000) |
| -whiteList | string | 逗号分隔的Ip地址具有写入权限。 空的没有限制。 |
- ./weed master
- -ip=192.168.233.147
- -port=9333
- -mdir=./data
- -peers=192.168.233.147:9333 > ./data/master.log 2>&1 &
这里的ip与port需要根据具体情况进行修改
peers是其他主节点,也需要进行修改
浏览器输入http://192.168.233.147:9333查看到控制台,master服务启动成功
./weed volume -dir=/home/seaweed_data/vol/vol1 -mserver="your ip address:9333" -ip="your ip address" -port=9331 &
docker pull chrislusf/seaweedfs
将镜像打包(导出镜像)
docker save -o seaweedfs_image.tar chrislusf/seaweedfs
在机器上进行部署(导入镜像):切换到镜像所在的目录,并使用docker load -i进行安装
docker load -i seaweedfs_image.tar

vim docker-compose.yml
运行
- version: '3'
- services:
- seaweedfs-master:
- image: chrislusf/seaweedfs:3.56
- container_name: seaweedfs-master
- ports:
- - "9333:9333"
- environment:
- - FILER=true
- - VOLUME=false # 不要在Master节点上运行Volume
- command: master
-
- seaweedfs-filer:
- image: chrislusf/seaweedfs:3.56
- container_name: seaweedfs-filer
- ports:
- - "8888:8888"
- depends_on:
- - seaweedfs-master # 在Filer启动之前等待Master启动
- command: filer
-
- seaweedfs-volume:
- image: chrislusf/seaweedfs:3.56
- container_name: seaweedfs-volume
- ports:
- - "8080:8080"
- depends_on:
- - seaweedfs-master # 在Volume启动之前等待Master启动
- command: volume
参数说明:
-d:以后台(守护进程)模式运行。
-e 'WEED_VOLUME=/data:这个选项用于设置容器内的环境变量 WEED_VOLUME 的值为 /data。SeaweedFS 使用此环境变量来指定存储卷的位置。
-v /test/:这是一个挂载选项,它将主机上的目录 /test/ 挂载到容器内部。
server -s3这部分是容器的启动命令。使用 -s3 参数来指定服务器运行模式为 S3 模式。在这种模式下,SeaweedFS 将充当兼容 Amazon S3 API 的对象存储服务器。
访问SeaweedFS服务:现在,您可以通过浏览器或其他工具访问SeaweedFS的主服务和Filer服务。以下是一些常用的服务和端口:
访问9333端口:
访问8888端口:

访问 ip::9333/dir/assign获取
fid就是上传的标志。
使用url或者publicUrl加上fid,就是文件上传的地址
http://172.17.0.4:8080/4,02c2c3ccf7
使用API测试Volume服务器写入
上传文件:
返回的大小是存储在SeaweedFS上的大小,有时文件会根据文件扩展名或MIME类型
上传文件后,可以直接访问,可以直接下载到上传的文件
http://172.17.0.4:8080/4,02c2c3ccf7
查看分块大文件的清单文件内容
http://127.0.0.1:8080/3,01637037d6?cm=false
自动进行gzip压缩。
删除文件:
DELETE http://127.0.0.1:8080/3,01637037d6
查看Volume数据库状态:
"http://localhost:8080/status?pretty=y"
一些资料地址:
https://www.bbsmax.com/A/n2d9Gw84JD/
https://www.bbsmax.com/A/6pdDYXQKzw/
https://blog.csdn.net/Dontla/article/details/130561925
https://www.jianshu.com/p/a7835012440a
https://blog.csdn.net/lljksven/article/details/118443443