前言
https://github.com/cubefs/cubefs
什么是 CubeFS ?
CubeFS 是新一代云原生存储产品,目前是云原生计算基金会(CNCF)托管的孵化阶段开源项目, 兼容 S3、POSIX、HDFS 等多种访问协议,支持多副本与纠删码两种存储引擎,为用户提供多租户、 多 AZ 部署以及跨区域复制等多种特性,广泛应用于大数据、AI、容器平台、数据库、中间件存算分离、数据共享以及数据保护等场景。
PS: 设计理念非常优秀,值得学习。
为什么选择 CubeFS ?
多协议
兼容 S3、POSIX、HDFS 等多种访问协议,协议间访问可互通
POSIX 兼容:兼容 POSIX 接口,让上层应用的开发变得极其简单,就跟使用本地文件系统一样便捷。此外,CubeFS 在实现时放松了对 POSIX 语义的一致性要求来兼顾文件和元文件操作的性能。
对象存储兼容:兼容 AWS 的 S3 对象存储协议,用户可以使用原生的 Amazon S3 SDK 管理 CubeFS 中的资源。
Hadoop 协议兼容:兼容 Hadoop FileSystem 接口协议,用户可以使用 CubeFS 来替换Hadoop 文件系统(HDFS),做到上层业务无感。
双引擎
支持多副本及纠删码两种引擎,用户可以根据业务场景灵活选择
多副本存储引擎:副本之间的数据为镜像关系,通过强一致的复制协议来保证副本之间的数据一致性,用户可以根据应用场景灵活的配置不同副本数。
纠删码存储引擎:纠删码引擎具备高可靠、高可用、低成本、支持超大规模(EB)的特性,根据不同AZ模型可以灵活选择纠删码模式。
多租户
支持多租户管理,提供细粒度的租户隔离策略
可扩展
可以轻松构建PB或者EB级规模的分布式存储服务,各模块可水平扩展
高性能
支持多级缓存,针对小文件特定优化,支持多种高性能的复制协议
元数据管理:元数据集群为内存元数据存储,在设计上使用两个 B-Tree(inodeBTree 与 dentryBTree)来管理索引,进而提升元数据访问性能;
强一致副本协议 :CubeFS 根据文件写入方式的不同采用不同的复制协议来保证副本间的数据一致性。
(如果文件按照顺序写入,则会使用主备复制协议来优化 IO 吞吐量;如果是随机写入覆盖现有文件内容时,则是采用一种基于 Multi-Raft 的复制协议,来确保数据的强一致性);
多级缓存:纠删码卷支持多级缓存加速能力,针对热点数据,提供更高数据访问性能:
本地缓存:可以在 Client 机器上同机部署 BlockCache 组件,将本地磁盘作为本地缓存. 可以不经过网络直接读取本地 Cache, 但容量受本地磁盘限制;
全局缓存:使用副本组件 DataNode 搭建的分布式全局 cache, 比如可以通过部署客户端同机房的 SSD 磁盘的 DataNode 作为全局 cache, 相对于本地 cache, 需要经过网络, 但是容量更大, 可动态扩缩容,副本数可调。
云原生
基于 CSI 插件可以快速地在 Kubernetes 上使用 CubeFS。
应用场景
CubeFS 作为一个云原生的分布式存储平台,提供了多种访问协议,因此其应用场景也非常广泛,下面简单介绍几种比较典型的应用场景
大数据分析
兼容 HDFS 协议,为 Hadoop 生态(如 Spark、Hive)提供统一存储底座,为计算引擎提供无限的存储空间以及大带宽的数据存储能力。
深度训练/机器学习
作为分布式并行文件系统,支撑 AI 训练、模型存储及分发、IO 加速等需求。
容器共享存储
容器集群可以将容器镜像的配置文件或初始化加载数据存储在 CubeFS 上,在容器批量加载时实时读取。多 POD 间通过 CubeFS 共享持久化数据,在 POD 故障时可以进行快速故障切换。
数据库&中间件
为数据库应用如 MySQL、ElasticSearch、ClickHouse 提供高并发、低时延云盘服务,实现彻底的存算分离。
在线服务
为在线业务(如广告、点击流、搜索)或终端用户的图、文、音视频等内容提供高可靠、低成本的对象存储服务。
传统 NAS 上云
替换线下传统本地存储及 NAS,助力 IT 业务上云。
技术架构
CubeFS 由 元数据子系统(Metadata Subsystem) ,数据子系统(Data Subsystem) 和 资源管理节点(Master) 以及 对象网关(Object Subsystem) 组成,可以通过 POSIX/HDFS/S3 接口访问存储数据。
资源管理节点
由多个 Master 节点组成,负责异步处理不同类型的任务,如管理数据分片与元数据分片(包括创建、删除、更新以及一致性检查等),检查数据节点或者元数据节点的健康状态,维护管理卷信息等 提示
Master 节点可以有多个,节点之间通过 Raft 算法保证元数据的一致性,并且持久化到 RocksDB 中。
元数据子系统
由多个 Meta Node 节点组成,多个元数据分片(Meta Partition)和 Raft 实例(基于 Multi-Raft 复制协议)组成,每个元数据分片表示一个 Inode 范围元数据,其中包含两棵内存 B-Tree 树:inode BTree 与 dentry BTree。 提示
元数据实例最少需要3个,支持水平扩容。
数据子系统
分为副本子系统和纠删码 子系统,两种子系统可同时存在,也都可单独存在:
副本子系统由 DataNode 组成,每个节点管理一组 数据分片,多个节点的数据分片构成一个副本组;
纠删码子系统(Blobstore)主要由 BlobNode 模块组成,每个节点管理一组数据块,多个节点的数据块构成一个纠删码条带。 提示
数据节点支持水平扩容。
对象子系统
由对象节点(ObjectNode)组成,提供了兼容标准 S3 语义的访问协议,可以通过 Amazon S3 SDK 或者是 s3cmd 等工具访问存储资源。
卷
逻辑上的概念,由多个元数据和数据分片组成,从客户端的角度看,卷可以被看作是可被容器访问的文件系统实例。从对象存储的角度来看,一个卷对应着一个 bucket。一个卷可以在多个容器中挂载,使得文件可以被不同客户端同时访问。
参考资料
https://github.com/linweisen/SimpleDFS
https://cubefs.io/zh/docs/master/overview/architecture.html#%E6%8A%80%E6%9C%AF%E6%9E%B6%E6%9E%84