官网链接:https://github.com/seaweedfs
文章目录
- seaweed简介
- seaweedfs文件块概念(chunks)
- 分布式部署时master节点与volume节点通信原理
- seaweed容器部署方法
- 单个节点部署
- 部署方法
- (master+volum)
- (master+volum+filer)
- 分布式部署
- 部署方法
- 上传与下载
seaweed简介
SeaweedFS 是一个简单且高度可扩展的分布式文件系统。它有两个目标:
- 存储数十亿个文件!
- 快速提供文件!
SeaweedFS 最初是作为一个对象存储系统,用于高效处理小文件。与其在中央主服务器上管理所有文件元数据,不如让中央主服务器只管理卷服务器上的卷,而这些卷服务器负责管理文件及其元数据。这样可以减轻中央主服务器的并发压力,将文件元数据分散到卷服务器中,从而实现更快的文件访问(O(1),通常只需要一个磁盘读取操作)。
每个文件的元数据只需要 40 字节的磁盘存储开销。它的 O(1) 磁盘读取速度非常简单,欢迎您用实际使用场景来挑战其性能。
SeaweedFS 是通过实现 Facebook 的 Haystack 设计论文开始的。此外,SeaweedFS 实现了纠删编码,借鉴了 f4:Facebook 的 Warm BLOB 存储系统的思想,并与 Facebook 的 Tectonic 文件系统有很多相似之处。
在对象存储的基础上,可选的 Filer 可以支持目录和 POSIX 属性。Filer 是一个单独的线性可扩展的无状态服务器,具有可定制的元数据存储,例如 MySql、Postgres、Redis、Cassandra、HBase、Mongodb、Elastic Search、LevelDB、RocksDB、Sqlite、MemSql、TiDB、Etcd、CockroachDB、YDB 等。
对于任何分布式键值存储,大值可以卸载到 SeaweedFS。凭借快速的访问速度和线性可扩展的容量,SeaweedFS 可以作为一个分布式 Key-Large-Value 存储。
SeaweedFS 可以与云无缝集成。通过在本地集群上存储热数据,以及在云上存储具有 O(1) 访问时间的温数据,SeaweedFS 可以实现快速的本地访问时间和弹性云存储容量。更重要的是,云存储访问 API 成本降至最低。比直接使用云存储更快、更便宜!
seaweedfs文件块概念(chunks)
文件块(File Block)(chunks)是SeaweedFS中的一个概念,指的是文件在分布式存储系统中的最小存储单元。在SeaweedFS中,一个文件会被分成多个文件块进行存储,每个文件块的大小可以通过配置进行调整,默认为4MB。
文件块是SeaweedFS实现高可用和高性能的关键。当一个文件上传到SeaweedFS时,SeaweedFS会将文件分成多个文件块,并将这些文件块存储到不同的Volume Server中。这样可以避免单个Volume Server故障导致文件丢失的问题,同时也可以提高文件读写的并发性能。
在SeaweedFS中,每个文件块都有一个唯一的ID,称为File ID。File ID由Volume Server生成,由Volume Server ID、Volume ID和文件块偏移量组成。通过File ID,SeaweedFS可以快速定位文件块所在的Volume Server,从而实现高效的文件读写操作。
总之,文件块是SeaweedFS中的一个重要概念,是实现高可用和高性能的关键。理解文件块的概念,有助于更好地理解SeaweedFS的工作原理和使用方法。
分布式部署时master节点与volume节点通信原理
seaweedfs部署分为单个节点部署和分布式部署,在分布式部署时,除了部署master节点外,还需要部署volume节点(>=1个),无论是master节点,还是volume节点,都需要一个自身映射到宿主机的独立的监听端口,master节点通常是9333,volume节点各不相同;
此外,volume节点在部署执行docker run时,还需告知其master节点的联系方式,容器部署时为宿主机ip+master容器监听端口。
在seaweedfs中,volume节点容器与master容器之间的通信是通过GRPC协议实现的。每个volume节点容器会向master容器注册自己的信息,包括节点ID、IP地址、端口等。当客户端需要访问某个文件时,会先向master容器发送请求,获取该文件所在的volume节点信息,然后再直接与该节点进行通信,进行文件的读写操作。
seaweed容器部署方法
单个节点部署
在以下情况下,建议使用单个节点部署SeaweedFS:
-
存储容量需求小:如果需要存储的文件数据量较小,单个节点的存储容量可以满足需求,此时不需要使用分布式存储。
-
数据可靠性要求不高:如果对文件数据的可靠性要求不高,可以使用单个节点部署SeaweedFS。在单个节点上存储数据可以节省存储空间,并且不需要考虑数据的备份和恢复问题。
-
访问性能要求不高:如果对文件数据的访问性能要求不高,可以使用单个节点部署SeaweedFS。单个节点的性能可以满足需求,不需要考虑横向扩展和负载均衡等问题。
-
系统资源有限:如果系统资源有限,例如内存、CPU等,单个节点部署SeaweedFS可以避免资源浪费和性能下降问题。
如果需要存储的文件数据量较小,对数据的可靠性和访问性能要求不高,或者系统资源有限,建议使用单个节点部署SeaweedFS。
部署方法
seaweedfs容器部署方式是多种多样的,这里只介绍我比较熟悉的两种单个节点的部署方法
(master+volum)
这种方式只有一个容器,容器中包含master和volume服务,伪docker run代码如下:
docker run \-d -i -t --restart always \--name $CONTAINER_NAME \-p $MASTER_PORT:9333 \-v $SCRIPT_LOCATION/mount/masterVolumeFiler/data/:/data/ \-v /etc/localtime:/etc/localtime:ro \$IMAGE_NAME:$IMAGE_TAG \server
(master+volum+filer)
这种方式比(master+volum)多了一个filer服务:
docker run \-d -i -t --restart always \--name $CONTAINER_NAME \-p $MASTER_PORT:9333 \-p $FILER_PORT:8888 \-v $SCRIPT_LOCATION/mount/masterVolumeFiler/data/:/data/ \-v /etc/localtime:/etc/localtime:ro \$IMAGE_NAME:$IMAGE_TAG \server filer
分布式部署
在以下情况下,建议使用SeaweedFS的分布式存储功能:
-
存储容量需求大:如果需要存储大量的文件数据,单个节点的存储容量可能无法满足需求。使用分布式存储可以将文件数据分散存储在多个节点上,从而提高存储容量。
-
数据可靠性要求高:如果需要确保文件数据的可靠性,使用分布式存储可以将数据副本存储在多个节点上,从而提高数据的可靠性。即使某个节点出现故障,数据仍然可以从其他节点中恢复。
-
访问性能要求高:如果需要快速访问文件数据,使用分布式存储可以将数据分散存储在多个节点上,从而提高访问性能。客户端可以从最近的节点获取数据,从而减少访问延迟。
-
需要横向扩展:如果需要扩展存储容量或提高访问性能,使用分布式存储可以通过添加更多的Volume节点来实现横向扩展。这样可以避免单个节点的性能瓶颈,提高整个集群的性能和可扩展性。
总之,如果需要存储大量的文件数据,并且对数据的可靠性、访问性能和横向扩展性有较高的要求,建议使用SeaweedFS的分布式存储功能。
部署方法
Master节点和Volume节点的部署方式略有不同,具体步骤如下:
- 部署Master节点
docker run -d --name seaweedfs_master \
-p 9333:9333 \
chrislusf/seaweedfs master
其中,-d
表示以后台方式运行容器,--name
指定容器名称,-p
指定容器端口映射,master
表示启动Master节点。
注意:
这里的
master
是seaweedfs镜像中的一个命令,用于启动Master节点。在Docker中,可以通过在镜像名后面添加命令来指定容器启动时要执行的命令。例如,chrislusf/seaweedfs master
表示启动chrislusf/seaweedfs
镜像,并执行master
命令,即启动Master节点。这种方式可以方便地启动不同的容器实例,以满足不同的需求。
- 部署Volume节点
docker run -d --name seaweedfs_volume \
-p 8080:8080 \
-v /data:/data \
-e "MASTER=<master_ip>:9333" \
chrislusf/seaweedfs volume
其中,-d
表示以后台方式运行容器,--name
指定容器名称,-p
指定容器端口映射,-v
指定容器数据卷映射,-e
指定环境变量,volume
表示启动Volume节点。<master_ip>
为Master节点所在主机的IP地址或域名,如-e "MASTER=192.168.1.140:9333"
。
需要注意的是,每个Volume节点都需要指定Master节点的地址,以便能够向Master节点注册自己的信息,并接收Master节点的指令。
以上是使用Docker部署Master节点和Volume节点的方式,也可以使用二进制文件或源代码编译的方式进行部署。在使用二进制文件或源代码编译的方式部署时,需要手动配置Master节点和Volume节点的配置文件,并启动相应的进程。
上传与下载
上传大文件见此:
https://github.com/seaweedfs/seaweedfs/wiki/Optimization#upload-large-files
参考文章1:seaweedfs 用docker快速布署及测试
参考文章2:SeaWeedFS安装以及部署,以及master模式和filer模式的介绍
参考文章3:Seaweedfs上传大文件_large file
参考文章4:seaweedfs搭建与使用
参考文章5:SeaweedFS Wiki