借助SeaweedFS把云主机富余的空间利用起来

2026-02-27 17:06:28 0点赞 1收藏 0评论

SeaweedFS 是一款极其轻量级的分布式文件系统,最初设计用于解决小文件存储问题,但现在已发展为全功能的分布式存储。

https://github.com/seaweedfs/seaweedfs

  • 资源占用极低:其核心二进制文件仅几十 MB,内存占用通常在 100MB 以内(视文件数量而定),非常适合低配服务器

  • 架构简单

    • Master 节点:管理元数据(3 台机器选 1 个或做高可用)。

    • Volume 节点:负责实际存储数据(每台机器跑一个,指向你的 .img 挂载目录)。

    • Filer 节点:提供标准的 POSIX 挂载(FUSE)或 S3 接口。

  • 空间整合:它可以轻松将你分散在 3 台服务器上的 15G、30G、30G 空间通过“卷(Volumes)”的概念整合在一起,总可用空间可配置为副本模式(需消耗额外空间)或直存模式。

写在前面

这是一个实验,目的是为了把自己购买的一些云服务器上的富余的磁盘空间利用起来做成一个“共享盘”当成“NAS”使用。

实验做以3台服务器为例,其中两台作为存储服务器,另一台性能弱的仅做master节点冗余。

服务器IP分别以1.1.1.1, 2.2.2.2, 3.3.3.3 代替真实地址

特别注意

****在本实验中,这三台服务器是纯公网互联,如需模仿,请务必注意设置防火墙策略点对点限制,否则后果自负。 ****

第一步:创建并挂载 30G 虚拟磁盘(仅存储机执行)

在存储机上执行以下命令:

  1. 创建 30G 的镜像文件

    # 在 /var 或其它剩余空间大的目录下创建镜像文件 sudo dd if=/dev/zero of=/seaweed_storage.img bs=1M count=30720

  2. 格式化为 ext4 文件系统

    sudo mkfs.ext4 /seaweed_storage.img

  3. 创建挂载点并挂载

    sudo mkdir -p /mnt/weed_data sudo mount -o loop /seaweed_storage.img /mnt/weed_data

  4. 设置开机自动挂载镜像
    编辑 /etc/fstab,在末尾添加一行:

    # 使用 sudo nano /etc/fstab 打开 /seaweed_storage.img /mnt/weed_data ext4 loop,defaults 0 0


第二步:安装 SeaweedFS(所有机器执行)

如果 GitHub 官方链接下载缓慢,可以使用以下 FastGit 镜像或其他代理加速(或手动上传):

wget https://github.com/seaweedfs/seaweedfs/releases/download/4.13/linux_amd64.tar.gz tar -zxvf linux_amd64.tar.gz sudo mv weed /usr/local/bin/ sudo mkdir -p /mnt/weed_data sudo chown $USER:$USER /mnt/weed_data sudo chmod +x /usr/local/bin/weed sudo mkdir -p /var/lib/weed


第三步:配置 Systemd 服务

节点1:

cat /etc/systemd/system/weed-master.service

[Unit] Description=SeaweedFS Master After=network.target [Service] ExecStart=/usr/local/bin/weed master -mdir="/var/lib/weed" -ip=1.1.1.1 -ip.bind=0.0.0.0 -port=9333 -peers=2.2.2.2:9333,1.1.1.1:9333,3.3.3.3:9333 -raftHashicorp -defaultReplication=001 Restart=always [Install] WantedBy=multi-user.target

节点2:

cat /etc/systemd/system/weed-master.service

[Unit] Description=SeaweedFS Master After=network.target [Service] ExecStart=/usr/local/bin/weed master -mdir="/var/lib/weed" -ip=2.2.2.2 -ip.bind=0.0.0.0 -port=9333 -peers=2.2.2.2:9333,1.1.1.1:9333,3.3.3.3:9333 -raftHashicorp -defaultReplication=001 Restart=always [Install] WantedBy=multi-user.target

cat /etc/systemd/system/weed-filer.service

[Unit] Description=SeaweedFS Filer After=weed-master.service weed-volume.service [Service] # Filer 默认端口 8888 ExecStart=/usr/local/bin/weed filer -ip.bind=0.0.0.0 -ip=2.2.2.2 -master=1.1.1.1:9333,3.3.3.3:9333,2.2.2.2:9333 Restart=always User=root [Install] WantedBy=multi-user.target

cat /etc/systemd/system/weed-volume.service

[Unit] Description=SeaweedFS Volume After=weed-master.service mnt-weed_data.mount [Service] # -ip 报出公网IP, -ip.bind 监听全网口, -port 8081 (避开8080冲突) ExecStart=/usr/local/bin/weed volume -ip.bind=0.0.0.0 -ip=2.2.2.2 -port=8081 -dir=/mnt/weed_data -max=10 -mserver=1.1.1.1:9333,3.3.3.3:9333,2.2.2.2:9333 Restart=always User=root [Install] WantedBy=multi-user.target

cat /etc/systemd/system/weed-mount.service

[Unit] Description=SeaweedFS Mount After=network-online.target weed-filer.service [Service] # 启动前清理旧挂载 ExecStartPre=/usr/bin/bash -c "umount -l /data/storage || true" # 关键参数:指向的公网 Filer 地址 ExecStart=/usr/local/bin/weed mount -filer=2.2.2.2:8888 -dir=/data/storage -cacheCapacityMB=1000 -allowOthers -dirAutoCreate -asyncDio -chunkSizeLimitMB=16 Restart=always RestartSec=10 User=root ExecStop=/bin/umount -l /data/storage [Install] WantedBy=multi-user.target

节点3:

cat /etc/systemd/system/weed-master.service

[Unit] Description=SeaweedFS Filer After=weed-master.service weed-volume.service [Service] # Filer 默认端口 8888 ExecStart=/usr/local/bin/weed filer -ip.bind=0.0.0.0 -ip=3.3.3.3 -master=1.1.1.1:9333,2.2.2.2:9333,3.3.3.3:9333 Restart=always User=root [Install] WantedBy=multi-user.target

cat /etc/systemd/system/weed-volume.service

[Unit] Description=SeaweedFS Volume After=weed-master.service mnt-weed_data.mount [Service] ExecStart=/usr/local/bin/weed volume -ip.bind=0.0.0.0 -ip=3.3.3.3 -port=8081 -dir=/mnt/weed_data -max=10 -mserver=2.2.2.2:9333,1.1.1.1:9333,3.3.3.3:9333 Restart=always User=root [Install] WantedBy=multi-user.target

cat /etc/systemd/system/weed-mount.service

[Unit] Description=SeaweedFS Mount After=network-online.target weed-filer.service [Service] # 启动前清理旧挂载 ExecStartPre=/usr/bin/bash -c "umount -l /data/storage || true" # 关键参数:指向公网 Filer 地址 #-filer=2.2.2.2:8888 ExecStart=/usr/local/bin/weed mount -filer=2.2.2.2:8888 -dir=/data/storage -cacheCapacityMB=1000 -allowOthers -dirAutoCreate -asyncDio -chunkSizeLimitMB=16 Restart=always RestartSec=10 User=root ExecStop=/bin/umount -l /data/storage [Install] WantedBy=multi-user.target

第四步:配置防火墙

如果NAT的公网地址和主机上的内网地址不一致,那么一定要允许NAT的公网地址访问本地内网地址,否则大概率会不通

以Ubuntu为例

# 允许服务器自己访问自己的公网地址 sudo ufw allow from 2.2.2.2

如果还是不通,可以通过检查UFW的拦截记录观察

sudo dmesg | grep "[UFW BLOCK]" | tail -n 10

第五步:验证功能

打开任意master节点URL,如:http://1.1.1.1:9333/

能够看到Leader和全部Master节点都在线并正确识别到

能够看到提供了Volume服务的节点都在线并正确识别到

借助SeaweedFS把云主机富余的空间利用起来

如何验证数据确实同步了?

  1. /data/storage 下创建一个 100MB 的文件:

    dd if=/dev/zero of=/data/storage/test_sync.img bs=1M count=100

  2. 请谨慎使用此类代码。

  3. 刷新你的 Dashboard (http://IP:9333)。

  4. 你会看到两台挂载了Volume机器的 #Volumes 数量和 ID 是完全同步增长

  5. 在两台服务器上均能在/data/storage目录中看到同样的问题

第六步:实现高可用filer

如需要高可用filer可以参考官方文档,部署一个Redis

修改 filer.toml 配置文件,将 [leveldb2](默认本地存储)改为 [redis]

我用不到,也就不做配置示范了

第七步:部署同步应用

接下来就看自己喜欢什么同步软件了,我个人比较喜欢Resilio Sync,自动把各个电脑、NAS上的文件进行自动同步

这个步骤与本文无关,就不在此赘述

作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

展开 收起
0评论

当前文章无评论,是时候发表评论了
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
1
扫一下,分享更方便,购买更轻松