• seaweedfs分布式文件系统


    基于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进行集成:

    依赖引入:

    1. <dependency>
    2. <groupId>com.github.chrislusfgroupId>
    3. <artifactId>seaweedfs-clientartifactId>
    4. <version>3.55version>
    5. 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);

    读取文件:

    1. FilerClient filerClient = new FilerClient("60.204.157.221", 18888);
    2. SeaweedInputStream seaweedInputStream = new SeaweedInputStream(filerClient, "/test.zip");
    3. //作为常用输入流

    写出文件

    1. FilerClient filerClient = new FilerClient("localhost", 18888);
    2. SeaweedOutputStream seaweedOutputStream = new SeaweedOutputStream(filerClient, "/test/"+filename);
    3. // next, you can use seaweedOutputStream as a normal OutputStream

     

    可以完成文件的上传

     

    部署

    seaweedfs

     

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

    linux_amd64.tar.gz  

    1. 上传文件并解压

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

    1. mkdir /opt/seaweedfs
    2. 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地址具有写入权限。 空的没有限制。

    1. ./weed master
    2. -ip=192.168.233.147
    3. -port=9333
    4. -mdir=./data
    5. -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 

    运行

    1. version: '3'
    2. services:
    3. seaweedfs-master:
    4. image: chrislusf/seaweedfs:3.56
    5. container_name: seaweedfs-master
    6. ports:
    7. - "9333:9333"
    8. environment:
    9. - FILER=true
    10. - VOLUME=false # 不要在Master节点上运行Volume
    11. command: master
    12. seaweedfs-filer:
    13. image: chrislusf/seaweedfs:3.56
    14. container_name: seaweedfs-filer
    15. ports:
    16. - "8888:8888"
    17. depends_on:
    18. - seaweedfs-master # 在Filer启动之前等待Master启动
    19. command: filer
    20. seaweedfs-volume:
    21. image: chrislusf/seaweedfs:3.56
    22. container_name: seaweedfs-volume
    23. ports:
    24. - "8080:8080"
    25. depends_on:
    26. - seaweedfs-master # 在Volume启动之前等待Master启动
    27. 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

  • 相关阅读:
    数据治理系列:数仓建模之数仓主题与主题域
    UEC 利用代理/委托写一个生命组件
    如何给运行中的容器添加--restart=always
    P2072 宗教问题
    开发npm第三方库的实战经验
    SpringCloud 10 Hystrix 服务降级
    数据结构初阶——栈和队列
    深入URP之Shader篇5: SimpleLit Shader分析(1)
    Java基础——初识Java(3) 简单认识方法
    java:基于jjwt写一个jwt工具类
  • 原文地址:https://blog.csdn.net/qq_28790663/article/details/133876901