借助SeaweedFS把云主机富余的空间利用起来
SeaweedFS 是一款极其轻量级的分布式文件系统,最初设计用于解决小文件存储问题,但现在已发展为全功能的分布式存储。
https://github.com/seaweedfs/seaweedfs
架构简单:
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 虚拟磁盘(仅存储机执行)
在存储机上执行以下命令:
创建 30G 的镜像文件:
# 在 /var 或其它剩余空间大的目录下创建镜像文件 sudo dd if=/dev/zero of=/seaweed_storage.img bs=1M count=30720格式化为 ext4 文件系统:
sudo mkfs.ext4 /seaweed_storage.img创建挂载点并挂载:
sudo mkdir -p /mnt/weed_data sudo mount -o loop /seaweed_storage.img /mnt/weed_data设置开机自动挂载镜像:
编辑/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服务的节点都在线并正确识别到

如何验证数据确实同步了?
在
/data/storage下创建一个 100MB 的文件:dd if=/dev/zero of=/data/storage/test_sync.img bs=1M count=100请谨慎使用此类代码。
刷新你的 Dashboard (
http://IP:9333)。你会看到两台挂载了Volume机器的
#Volumes数量和 ID 是完全同步增长的在两台服务器上均能在
/data/storage目录中看到同样的问题
第六步:实现高可用filer
如需要高可用filer可以参考官方文档,部署一个Redis
修改 filer.toml 配置文件,将 [leveldb2](默认本地存储)改为 [redis]
我用不到,也就不做配置示范了
第七步:部署同步应用
接下来就看自己喜欢什么同步软件了,我个人比较喜欢Resilio Sync,自动把各个电脑、NAS上的文件进行自动同步
这个步骤与本文无关,就不在此赘述
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~
