SeaweedFS 分布式存储

一、简介

SeaweedFS 是一种多功能且高效的存储系统,旨在满足现代系统管理员管理 blob、对象、文件和数据仓库存储需求的需求。无论数据集的大小如何,其架构都能保证快速访问时间,磁盘寻道时间为常数时间 (O(1))。这使其成为速度和效率至关重要的环境的绝佳选择。

SeaweedFS 分为几层,每层都满足不同的存储需求:

Blob Storage:Blob 存储是基础,包括主服务器、卷服务器和云层,可实现无限可扩展性。
File Storage: 以 Blob 存储为基础,通过添加文件服务器来管理类似文件系统的操作。
Object Storage:使用与 S3 兼容的服务器扩展了文件存储,使其与现有 S3 工作流集成变得轻而易举。
Data Warehouse:数据仓库功能集成到文件存储中,通过与 Hadoop 兼容的库提供与 Hadoop、Spark 和 Flink 等大数据框架的兼容性。
FUSE Mount: 允许将文件存储直接安装在客户端的用户空间中,支持 FUSE 安装和 Kubernetes 持久卷等常见用例。

SeaweedFS 以其高性能、可扩展性和灵活性而脱颖而出。它的特点是:

  • 快速的键到文件映射,磁盘寻道时间最短。
  • 可定制的分层存储,可根据活动智能地放置数据,将不太活跃的数据移动到更便宜的云存储。
  • 弹性可扩展性,通过添加卷服务器轻松扩展容量。
  • 一个强大、高性能、与 S3 兼容的对象存储,可以作为 HDFS 的内部替代方案。

该系统专为高可用性和耐用性而设计,具有以下特点:

  • 无单点故障 (SPOF),支持主动-主动异步复制和擦除编码以保护数据。
  • 支持文件校验和以确保数据完整性。
  • 机架和数据中心感知复制以提高可靠性。
  • 灵活的元数据管理,与各种流行的数据库和存储系统兼容。

对于系统管理员来说,SeaweedFS 大大简化了操作。增加容量就像集成更多卷服务器一样简单。该系统的架构允许轻松进行数据迁移和备份,支持各种元数据后端存储。这使得 SeaweedFS 成为管理多样化和苛刻的存储环境的适应性强且可靠的选择。

说明

Seaweedfs 如何存储文件

在 SeaweedFS 集群中,文件存储在位于卷服务器中的卷中,而卷只是一个具有预定义大小的大型空文件,用于存储文件。例如,10 GB 卷可以存储 10,000 个平均大小为 1 MB 的文件。

SeaweedFS 试图解决的问题

文件系统 Inode 磁盘大小限制: 因为每个操作系统中的每个文件都必须有元数据(在 Linux 中也称为 inode),其中包括文件名、路径、权限、创建日期、修改日期以及磁盘中的位置。其中一些存储的元数据至关重要,但其他元数据则浪费磁盘空间。在 XFS 或 EXT4 文件系统中,如果启用CRC ,则默认 inode 大小为 512 字节,这意味着每个文件大小将是文件本身的大小加上 512 字节 inode 大小,这包括空文件。例如,存储 100 万个小文件仅索引节点就需要 512 MB 的额外存储空间。但是,Seaweedfs 通过将多个文件存储在一个较大的文件(卷)中解决了这个问题。此外,在seaweedfs配置中,默认卷大小为30 GB,这意味着所有所需的元数据仅为512字节加上每个文件的16字节(16字节用于卷中的文件元数据,如文件偏移位置和大小)存储在体积。因此,存储100万个小文件只需花费512字节+(100万*16字节),大约等于16MB。对于 Facebook 存储超过 2600 亿张上传图像的情况来说,这种方法很有帮助。

从磁盘读取文件所需的磁盘操作: 在包括 XFS 和 EXT4 在内的典型文件系统中,从磁盘读取单个文件需要 3 次或更多磁盘读取操作,一次用于文件路径到 inode 编号的映射,一次用于 inode 映射从磁盘检索到内存,以及从磁盘检索文件的一次操作。Seaweedfs 可以通过将文件的元数据存储在内存中来克服这个问题,因此只对磁盘进行一次读取操作,因为内存访问时间以纳秒为单位,而 HDD 硬盘驱动器以毫秒为单位。

Seaweedfs 集群组件

典型的 Seaweedfs 集群由以下组件组成:

主服务: 在其他分布式文件系统中,主服务器管理存储在存储服务器(卷服务器)中的文件,但在 SeaweedFS 中,主服务器仅管理存储在卷服务器中的卷,而卷服务器将管理存储在卷中的文件。这意味着主服务器将仅存储有关卷的元数据(例如卷大小、卷存储在哪个卷服务器中等)。但是,存储实际文件元数据是卷服务器的职责,而不是主服务器的职责。此外,主服务器还负责选择哪个卷服务器将用于存储新文件以及我们可以从哪个卷服务器访问存储的文件。此外,一旦卷达到最大大小,主服务器将负责将卷转换为只读。

卷服务: 卷服务器存储一堆卷,每个卷大小为 30GB(可配置)。卷服务负责在卷中有效存储许多对象(文件和文件块)。此外,将每个文件元数据(文件名、大小、卷上的偏移位置等)存储在磁盘上并将它们缓存在内存中,以提供对它们的快速访问并提供 O(1) 磁盘读取操作。当主节点被选为集群中的领导者时,所有卷服务器都会将每个存储卷的元数据发送给新当选的主节点。

Filer 服务: 与主服务器和卷服务器交互以上传和下载文件可能是一项繁琐的任务,因此 Seaweedfs 团队创建了 Filer 服务来提供以下功能:

  • 连接到主服务器以获取最新的卷位置,并在文件写入期间请求卷服务器 IP、卷 ID 和文件 ID。
  • 处理文件和目录操作,例如创建、删除、读取、写入和重命名。
  • 跟踪文件和目录的元数据,例如文件 ID、文件大小、上次修改时间和访问时间等……
  • 与主服务器通信以跟踪集群状态。
  • 记录和审核文件和目录操作。

此外,它还提供了以不同方式访问数据的入口点,其中一些方式是:

  • 用于上传和下载文件的 HTTP 入口点。
  • 通过 FUSE 挂载点直接将文件读写为本地目录。
  • S3 兼容 API。
  • 访问来自 Hadoop/Spark/Flink/等的文件。
  • 网络DAV。
  • Kubernetes CSI 驱动程序。

Filer Store Service: 这是一个重要组件,Filer 服务使用它来存储文件元数据(如卷 ID、文件 ID 等)。此外,文件管理器存储还用于扩展文件管理器服务。有两种类型的文件管理器存储

  • 共享:所有文件管理器都将与共享文件管理器存储(如 MariaDB、Redis、Cassandra 等)通信。因此,此选项将减轻文件管理器服务器的可扩展性,因为所有文件管理器将使用相同的共享数据库。
  • 嵌入式:每个文件管理器都将使用 LevelDB 在本地存储元数据,LevelDB 是 Google 设计的“磁盘中带有内存缓存的键值存储”。在嵌入式文件管理器存储中,所有元数据更改都会传播到所有其他文件管理器(如果存在)。这将确保所有文件管理器都更新为最新的元数据更改。

S3服务: 这是一项可选服务,提供以AWS风格设计的S3存储桶。它可以单独启动或与文件管理器同时启动。
下图将显示集群组件和连接

注意:客户端和卷服务器之间的连接是可选的。但是,当客户端使用 Fuse 挂载来挂载集群时,可以使用它。

SeaweedFS 技术架构

系统由 3 部分组成:

  • Volume Server,用于底层存储文件
  • Master Server,用于管理集群
  • Filer,一个向上提供更多特性的可选组件

SeaweedFS 系统架构
在这里插入图片描述
在这里插入图片描述

Volume Server 与 Master Server 一并构成文件存储服务:

  • Volume Server 专注于数据的写入与读取
  • Master Server 负责管理集群与 Volumes

在读写数据时,SeaweedFS 的实现与 Haystack 相似,用户创建的文件系统(Volume)实际上是一个大磁盘文件,也就是下图的 Superblock。在此 Volume 中,用户写入的所有文件都会被合并到该大磁盘文件中,借用 Haystack 的术语,每一个文件都是“一根针”,needle。

SeaweedFS Superblock

SeaweedFS 中数据写入和读取流程:

  1. 在开始写入数据之前,客户端向 Master Server 发起写入申请。
  2. SeaweedFS 根据当前的数据量返回一个 File ID,这个 ID 由 Volume ID 与该 Volume中可供写入位置的偏移量计算而来。在写入的过程中,一并被写入的还有基础的元数据信息(文件长度与 Chunk 等信息)。
  3. 当写入完成之后,调用者需要在一个外部系统(例如 MySQL)中对该文件与返回的 File ID 进行关联保存。
  4. 在读取数据时,由于 File ID 已经包含了计算文件位置(偏移)的所有信息,因此可以高效地将文件的内容读取出来。

在上述的底层存储服务之上,SeaweedFS 提供了一个名为 Filer 的组件,他对接 Volume Server 与 Master Server,对外提供丰富的功能与特性,如 POSIX 支持、WebDAV、S3 API。与 JuiceFS 相同,Filer 也需要对接一个外部数据库以保存元数据信息。

ref:
https://github.com/seaweedfs/seaweedfs
https://github.com/seaweedfs/seaweedfs/wiki
https://juejin.cn/post/7346079025426808843
https://juicefs.com/docs/zh/community/comparison/juicefs_vs_seaweedfs/

  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值