基于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是一个高度可扩展的分布式文件存储系统,其主要组件包括:
- Filer: 用于文件或目录的存储和检索;
- Volume Server: 存储实际的文件数据;
- Master Server: 负责管理 Volume Servers 和卷的元数据;
- S3 Gateway (Optional): 提供与 AWS S3 兼容的接口;
其架构特点包括:
- 使用 Facebook 的 Haystack 存储格式,优化了小文件存储的性能;
- 可以选择使用 S3 API,这样已经针对 S3 优化的应用程序可以轻松迁移到 SeaweedFS;
对比MinIO:
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.chrislusf</groupId>
<artifactId>seaweedfs-client</artifactId>
<version>3.55</version>
</dependency>
注意:
Volume服务器分布在不同的计算机上。它们可以具有不同的磁盘空间,甚至不同的操作系统。
通常,您需要指定可用的磁盘空间、Weed Master的位置以及存储文件夹。
./weed volume -max=100 -mserver="localhost:9333" -dir="./data"
如果您正在使用自定义的gRPC端口用于Master服务器,
mserver的地址格式为<主机>:<端口>.<gRPC端口>。
默认情况下,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
可以完成文件的上传
部署
seaweedfs
方式一:虚拟机部署
- 准备安装包(Seaweedfs版本为3.56)
linux_amd64.tar.gz
- 上传文件并解压
在opt目录下创建seaweedfs空文件夹,并将压缩包解压到该文件夹。
mkdir /opt/seaweedfs
tar -zxvf /opt/files/linux_amd64.tar.gz -C /opt/seaweedfs
- 创建master文件夹和volume文件夹
mkdir -p /opt/seaweedfs/data /opt/seaweedfs/volume
- 配置master端并执行
将目录切换到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服务启动成功
- Volume服务开启
./weed volume -dir=/home/seaweed_data/vol/vol1 -mserver="your ip address:9333" -ip="your ip address" -port=9331 &
方式二:使用docker镜像部署
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服务。以下是一些常用的服务和端口:
- SeaweedFS主要的Web界面:http://localhost:9333
- SeaweedFS Filer服务:http://localhost:8888
访问9333端口:
访问8888端口:
访问 ip::9333/dir/assign获取
- VolumeId: 4 32bit 存储的物理卷的Id
- NeedleId: 02 64bit 全局唯一NeedleId,每个存储的文件都不一样(除了互为备份的)。
- Cookie: c2c3ccf7 32bit Cookie值,为了安全起见,防止恶意攻击。
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