行有不得者,皆反求诸己,其身正而天下归之。
导航
-
[1 工具介绍](#1 工具介绍)
- [1.1 工具描述](#1.1 工具描述)
- [1.2 架构设计](#1.2 架构设计)
-
[2 部署方式](#2 部署方式)
- [2.1 独立模式+多卷](#2.1 独立模式+多卷)
- [2.2 集群模式+多卷](#2.2 集群模式+多卷)
-
[3 命令功能](#3 命令功能)
-
[4 启动方式](#4 启动方式)
-
[5 杂七杂八](#5 杂七杂八)
1、工具介绍
1.1、工具描述
SeaweedFS 是一个分布式存储系统,适用于 对象存储 (S3)、文件系统 、Iceberg 表 ,旨在以 O(1) 磁盘访问和轻松的水平扩容来处理数十亿个文件,同时还可对外提供 S3、HTTP、SFTP、WebDAV 等 访问方式。
Iceberg 表:一种高性能的开源数据湖表格式(Table Format)。它为传统对象存储(如 SeaweedFS、HDFS、S3)上的文件提供了类似传统关系型数据库(如 MySQL)的 ACID 事务能力,使用户能够使用 SQL 像读写普通数据库表一样去管理数十 PB 级的数据湖。
O(1) 磁盘访问:是指在存储系统中,无论系统里存了多少个文件(不管是 1 万个还是 10 亿个),定位并读取任意一个文件所需的磁盘 I/O(输入/输出)次数都是恒定的(通常只需要 1 次)。这里的 "O(1)" 借用了计算机科学中的大 O 表示法(时间复杂度),意思是耗时与数据总量无关。
水平扩容:当磁盘空间不足时,只需直接启动新的 Volume 节点并注册到 Master,集群容量就会立即增加,容量可以无限叠加。
1.2、架构设计
- Master :管理集群、管理 Volume Server,决定上传上来的数据应该分配给哪些 Volume Server,自己实际并不存储数据。
- Volume Server :实际 存储数据 的地方,但仅仅只是存储数据,不存储文件相关的元数据,类似于纯硬盘。
- Filer :提供类似 文件系统 的抽象层,保存文件和目录结构等元数据,类似于硬盘被格式化之后的文件系统。
- S3/SFTP/WebDAV :为 Filer 提供可对外访问的 S3、SFTP、WebDAV 接口层。
- Admin :为 Master 提供 可视化 的 UI 界面。
注:(1)在 SeaweedFS 系统中,一个文件是由 元数据+文件数据 构成的,其中元数据是指文件名、文件创建时间、文件权限等文件属性,而文件数据则是文件实际的二进制内容。最终一个文件的元数据会被保存在 Filer 中,文件数据则被保存在 Volume Server 中。(2)文件存储流程:假如应用通过 HTTP 接口上传一个文件给 Filer 角色,Filer 会将其传递给 Master 角色,Master 再决定将这个文件的数据传输到指定的 Volume Server 角色,Volume Server 再根据存储要求将数据存储在特定编号的 Volume 文件中。

2、部署方式
由于 SeaweedFS 是分布式集群设计,因此它的部署方式非常灵活,既可以在单机上实现"独立模式+单/多卷"、"集群模式+单/多卷"的部署方式,也可以在多机上实现同样的效果 ,但我推荐在 多机上采用"独立模式+多卷"的部署方式,这样的好处:一是服务维护简单、二是数据隔离备份。
以下分别演示如何在多机上实现独立模式和集群模式的操作过程:
2.1、独立模式+多卷

效果:主机 A 上的 master 控制着主机 AB 上的 volume,往 filer 中存储一个文件,该文件的数据便会在主机 AB 的卷上产生出两份一样的数据。
【1】此时,若是主机 A 宕机,那么 SeaweedFS 的存储服务便不能够正常运行;【2】由于还开启了副本策略,此时若是主机 A 正常主机 B 宕机,服务也不能够正常运行,因为副本策略的要求是必须要有对应副本数量的卷服务器可用才能够正常存储数据,所以在副本策略为 001 的情况下,建议准备 3 台主机分别运行 3 个 volume 服务最好;【3】亦或者在 2 台主机的情况下,每台主机分别运行 2 个 volume 服务,总共 4 个卷服务,此时若是主机 B 宕机主机 A 正常,那么 SeaweedFS 的存储服务依旧能正常运行。
bash
##### 主机 A(192.168.98.139) #####
#(1)启动 master 服务,并开启副本策略,默认 000 表示不备份,001 代表除主文件之外会额外备份1份。
weed master -ip=192.168.98.139 -ip.bind=0.0.0.0 -defaultReplication=001
#(2)启动 volume 服务,并指定此卷最多可以创建 100 个卷单位。
weed volume -ip=192.168.98.139 -master="192.168.98.139:9333" -ip.bind=0.0.0.0 -port=8080 -max=100
# weed volume -ip=192.168.98.139 -master="192.168.98.139:9333" -ip.bind=0.0.0.0 -port=8081 -max=100 -dir=/tmp2
#(3)启动 filer 服务。
weed filer -ip=192.168.98.139 -master="192.168.98.139:9333" -ip.bind=0.0.0.0
#(4)启动 admin 服务,并开启认证验证功能。
weed admin -adminUser=admin -adminPassword=password -master="192.168.98.139:9333"
##### 主机 B(192.168.98.140) #####
#(1)启动 volume 服务,并指定此卷受到 master-A 的控制,且最多可以创建 100 个卷单位,卷数据都保存在 /tmp 目录下。
weed volume -ip=192.168.98.140 -master="192.168.98.139:9333" -ip.bind=0.0.0.0 -port=8080 -max=100 -dir=/tmp
# weed volume -ip=192.168.98.140 -master="192.168.98.139:9333" -ip.bind=0.0.0.0 -port=8081 -max=100 -dir=/tmp2
2.2、集群模式+多卷

效果:主机 ABC 上的 master 会互相争夺管理权,最终只有获得管理权的 master 才能够控制主机 ABC 上的 volume,使用主机 ABC 任意一个 filer 存储一个文件,该文件的数据最终会在主机 ABC 的卷上产生出两份一样的数据。【例如:一个文件较大被分割成 6 份,其中主机 A 卷存储着 123456,主机 B 卷存储着副本 135,主机 C 卷存储着副本 246。】
【1】此时,主机 ABC 任意宕机一台,SeaweedFS 的存储服务都可以正常运行;【2】若宕机两台,则 SeaweedFS 服务便无法正常运行。一是因为集群要求 master 节点至少存在 2 个,而是因为副本策略可用卷不足的原因。
bash
##### 主机 A(192.168.98.139) #####
weed master -ip=192.168.98.139 -ip.bind=0.0.0.0 -defaultReplication=001 -peers="192.168.98.139:9333,192.168.98.140:9333,192.168.98.141:9333"
weed volume -ip=192.168.98.139 -master="192.168.98.139:9333,192.168.98.140:9333,192.168.98.141:9333" -ip.bind=0.0.0.0 -port=8080 -dataCenter=dc1 -rack=rack1 -max=100
weed filer -ip=192.168.98.139 -master="192.168.98.139:9333,192.168.98.140:9333,192.168.98.141:9333" -ip.bind=0.0.0.0
weed admin -master="192.168.98.139:9333,192.168.98.140:9333,192.168.98.141:9333"
##### 主机 B(192.168.98.140) #####
weed master -ip=192.168.98.140 -ip.bind=0.0.0.0 -defaultReplication=001 -peers=192.168.98.139:9333,192.168.98.140:9333,192.168.98.141:9333
weed volume -ip=192.168.98.140 -master="192.168.98.139:9333,192.168.98.140:9333,192.168.98.141:9333" -ip.bind=0.0.0.0 -port=8080 -dataCenter=dc1 -rack=rack1 -max=100
weed filer -ip=192.168.98.140 -master="192.168.98.139:9333,192.168.98.140:9333,192.168.98.141:9333" -ip.bind=0.0.0.0
weed admin -master="192.168.98.139:9333,192.168.98.140:9333,192.168.98.141:9333"
##### 主机 C(192.168.98.141) #####
weed master -ip=192.168.98.141 -ip.bind=0.0.0.0 -defaultReplication=001 -peers=192.168.98.139:9333,192.168.98.140:9333,192.168.98.141:9333
weed volume -ip=192.168.98.141 -master="192.168.98.139:9333,192.168.98.140:9333,192.168.98.141:9333" -ip.bind=0.0.0.0 -port=8080 -dataCenter=dc1 -rack=rack1 -max=100
weed filer -ip=192.168.98.141 -master="192.168.98.139:9333,192.168.98.140:9333,192.168.98.141:9333" -ip.bind=0.0.0.0
weed admin -master="192.168.98.139:9333,192.168.98.140:9333,192.168.98.141:9333"
3、命令功能
SeaweedFS 所有角色的功能都集中在 weed 这个单一独立的命令中,每个角色对应一个 weed 的子命令,其中最常见的子命令功能如下:
wiki
master 启动 master 服务
worker 启动 worker 服务,以减轻 master 的压力。【注:master 偏调度,worker 主干活。】
volume 启动 volume 服务
filer 启动 filer 服务
admin 启动 admin 服务,作为 master 的 web 管理界面。
s3 启动基于 filer 的 s3 服务
sftp 启动基于 filer 的 sftp 服务
webdav 启动基于 filer 的 webdav 服务
mini 启动一个可以完整展示 SeaweedFS 服务的示例,以上介绍的所的服务都会被启动。
server 默认只启动 master、volume 服务,filer、s3、sftp、webdav 作为启动的可选项,且不支持启动 admin 服务。
scaffold 生成各角色服务基本的配置文件
mount 将 SeaweedFS 服务挂载到 Linux 系统中
shell 进入可以交互式管理 SeaweedFS 的 shell 环境
注:在各角色服务中,master、filer 服务会被其它角色当做必须参数被经常调用。例如,worker、volume、filer、admin 这四个角色一定要指向 master 的服务地址,s3、sftp、webdav 这 3 个角色则一定要指向 filer 的服务地址。
在 SeaweedFS 的交互式管理 shell 中经常被使用的子命令功能如下:
wiki
lock/unlock:在执行一些影响比较重大的命令时,为了防止多个管理员同时操作引起冲突,会先给整个集群加一个维护锁,等操作完成之后再解锁。【注意:枷加锁之后,并不会影响 SeaweedFS 系统中文件的上传和下载功能。】
volume.list:列出 master 管辖的所有 volume server 中的卷的分布情况、各卷对应的副本策略、已删除但未释放的空间。
volume.vacuum -apply:回收卷空间,删除的文件此时将会被彻底删除。
volume.merge:从物理层面合并卷,因此该命令非常容易引起元数据和卷 id 不一致的情况,而导致文件异常的现象,建议不要使用。【注:屡试屡异常】
volume.move:不同机器之间的卷迁移。
volume.fix.replication -apply:副本修复,当某个卷的副本出现了缺失或损坏,此命令可以检测并修复。但在机器A上损坏的数据,修复之后可能会被分配在机器B上。
fs.meta.save:导出目录和文件的元数据
fs.meta.load:导入目录和文件的元数据
fs.tree:查看 filer 文件系统中的目录树结构
fs.verify:验证 filer 元数据和 volume 中的数据是否对应。
fs.mergeVolumes -apply:大文件、分散的小文件的数据一般会分散在多个卷上,该命令能够将其聚集在一个卷上,方便手动迁移卷数据。
4、启动方式
SeaweedFS 的启动方式也非常的灵活,在服务调测阶段采用 附命令参数启动 较为方便,而在正式投入生产时则采用 带配置文件启动 或 systemctl 启动,各启动用法如下:
【1】附命令参数启动
bash
# 用法一:一个服务对应一条命令,启动几个服务执行几条命令。
weed master -port=9333
weed volume -master=localhost:9333
weed filer -master=localhost:9333 -port=8888
weed s3 -filer=localhost:8888
weed admin -master=localhost:9333
# 用法二:上面用法一的整合版本
weed server -filer -s3
weed admin -master=localhost:9333
# 用法三:快速启动一整套服务的实验环境
weed mini
【2】带配置文件启动
bash
#(1)首先使用以下命令生成配置文件
weed scaffold -config=[master|volume|filer|admin|notification|replication|security|shell|credential] -output /etc/seaweedfs/
#(2)修改配置文件对应的参数之后,再以任何方式启动角色对应的服务时,角色服务便会首先加载配置文件中的参数,如:
weed server
注:配置文件中的参数都是一些在命令行参数中不易配置的选项,因此如果想要修改角色服务像如:监听 IP、端口、数据目录 这类的参数信息,还是需要在命令行参数中进行配置。
【3】systemctl 启动
bash
cat /etc/systemd/system/seaweedmaster.service
[Unit]
Description=SeaweedFS Server
After=network.target
[Service]
Type=simple
User=root
Group=root
ExecStart=/usr/local/bin/weed master -ip=192.168.1.31
WorkingDirectory=/usr/local/bin
SyslogIdentifier=seaweedfs-master
[Install]
WantedBy=multi-user.target
注:具体可参考官方 wiki 手册的描述。
5、杂七杂八
(1)存储数据迁移步骤:
- 先在旧机器上将所有的卷数据(如:1.dat、1.idx、1.vif 这类的数据)都转储在新机器上指定的存储目录下。
- 继续进入旧机器的 weed shell 交互环境中,通过
fs.meta.save -o /tmp/test.gz将 filer 文件系统中的元数据导出来并转储在新机器上。 - 然后在新机器中,启动 master、volume、filer、admin 这些角色服务(注意:在启动 volume 时需要指定它的卷数据存储目录),启动之后的 filer 文件系统中不会存在任何文件,但 admin 界面的 卷服务却显示出了数据的占用情况。
- 接着进入新机器的 weed shell 交互环境,然后通过
fs.meta.load /tmp/test.gz将 filer 文件系统中的元数据导入进去。 - 最后重新启动新机器上的 volume 服务,之后便可以看到 filer 中的文件全部都恢复正常了。
(2)垃圾回收机制:在 SeaweedFS 中,删除文件后,Volume 文件占用的物理空间通常不会立即减少。这是 SeaweedFS 的设计方式,原因是 Volume 使用的是 追加写(append-only)+ 垃圾回收(vacuum)机制。
(3)副本参数 Replication = 001 的含义:
Replication 参数的格式是:数据中心(datacenter )-机架(rack)-服务器(server),数字则指对应类型的副本数量。例如:【1】000 表示不复制;【2】001 表示在同一机架内保存副本,例如在机架 A 下的服务器 A 保存一份副本,在机架 A 下的服务器 C 保存另一份副本;【3】010 表示在不同机架内保存副本,例如在机架 A 下的服务器 A 保存一份副本,在机架 B 下的服务器 C 保存另一份副本;【4】100 表示在不同数据中心保存副本,例如在数据中心 A 下的机架 A 下的服务器 A 保存一份副本,在数据中心 B 下的机架 B 下的服务器 B 保存另一份副本。
注:如何自定义卷服务中心?当加入同一 master 的卷服务很多时,可以通过在卷服务的启动命令指定参数 dataCenter 和 rack 来定义卷服务中心,如
weed volume -mserver="..." -dataCenter=dc1 -rack=rack1,该功能在异地组建数据存储中心时会比较有用,小环境下无意义。

(4)一个故障案例:3 台卷服务器 ABC,每台卷服务器可以创建的最大卷数量是 8,副本策略是 001,每个卷服务器的最大容量都是 30G 试验完全够用,当我一开始上传 500 M 文件之后,AB 的 8 个卷都被占用了,当我把 C 关闭时,SeaweedFS 服务可以正常上传下载新文件,但是当我将 A 关闭时,按说仍旧存活着两台卷服务器,上传新文件应该没问题才对,但是实际是文件无法被正常上传,后台 master 报如下错误:
wiki
dc1:Only has 0 racks with more than 2 free data nodes, not enough for 1.
I0721 02:51:29.717431 master_grpc_server_volume.go:143 volume grow &{Option:{"replication":{"node":1},"ttl":{"Count":0,"Unit":0},"version":3} Count:0 Force:false Reason:grpc assign}
I0721 02:51:29.718060 volume_growth.go:142 create 6 volume, created 0: No matching data node found!
而根本原因则是因为:剩余的 BC 之间没有共同类型的卷(卷槽),而新上传文件由于副本策略的原因,它需要创建新的卷槽,但 B 槽已满无法再新建新的卷槽,于是副本策略的条件无法被达成,便会出现文件无法被上传的问题。
解决办法则是:关闭 B 的卷服务,然后增加它的最大可承载卷数量限制(-max 参数即可,如:weed volume ... -max=100。
(5)3 台服务器组建的 master 集群状态下,为什么宕机 2 台剩余的那 1 台 master 便不能够在正常工作?
答:这主要是由于 SeaweedFS 集群所采用的 Quorum(过半赞成)选举算法导致的,该算法要求被选举者必须得到 N/2+1 个节点的同意后才能成为领导者,而是 3 个节点组成的集群,则必须得到 3/2+1=2 张选票才行。
于是 3 台 Master 的集群,当 1 台宕机 时,集群依然可以完美正常工作;但如果 2 台宕机(只剩 1 台),集群便会陷入"不停选举"的瘫痪状态。