基于facebook haystackSeaweedFS是一种简单的、高度可扩展的分布式文件系统。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. Filer: 用于文件或目录的存储和检索;
  2. Volume Server: 存储实际的文件数据;
  3. Master Server: 负责管理 Volume Servers 和卷的元数据;
  4. S3 Gateway (Optional): 提供与 AWS S3 兼容的接口;

其架构特点包括:

  1. 使用 Facebook 的 Haystack 存储格式,优化了小文件存储的性能;
  2. 可以选择使用 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

 

方式一:虚拟机部署
  1. 准备安装包(Seaweedfs版本为3.56)

linux_amd64.tar.gz  

  1. 上传文件并解压

在opt目录下创建seaweedfs空文件夹,并将压缩包解压到该文件夹。

mkdir /opt/seaweedfs
tar -zxvf /opt/files/linux_amd64.tar.gz -C /opt/seaweedfs
  1. 创建master文件夹和volume文件夹
mkdir -p /opt/seaweedfs/data  /opt/seaweedfs/volume
  1. 配置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服务启动成功

  1. 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服务。以下是一些常用的服务和端口:

  1. SeaweedFS主要的Web界面:http://localhost:9333
  2. SeaweedFS Filer服务:http://localhost:8888

访问9333端口:

访问8888端口:

 

访问 ip::9333/dir/assign获取

  1. VolumeId: 4 32bit 存储的物理卷的Id
  2. NeedleId: 02 64bit    全局唯一NeedleId,每个存储的文件都不一样(除了互为备份的)。
  3. 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

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐