Copyset模块结合chunk的放置共同解决了集群数据如何分布的问题,这里主要的设计考虑点是数据分布的均衡性以充分利用磁盘空间和避免热点。
1. 背景
Curve是网易数帆在2020年7月份开源的一个高性能、高可用、高可靠的分布式存储系统,主打高性能、低延迟。
Github代码仓库:https://github.com/opencurve/curve
Curve存储系统的基础设计框架与经典的GFS基本类似,采⽤有中心节点的架构,核心服务由4个部分组成:
- 元数据节点MDS,主要有两个职责,一方面管理和存储元数据信息,另一方面感知集群状态并进⾏调度。元数据存储在etcd中。
- 数据节点ChunkServer, 一方面负责数据的存储,另一方面负责数据一致性(如果底层是多副本,需要负责副本间的数据一致性)。在我们的实践中,一个chunksever对应与一块盘。
- 客⼾端Client, 向上层应用提供对文件的操作接口(open、read、write等), 会和MDS以及ChunkServer交互,与MDS交互实现对元数据的增删改查;与ChunkServer交互实现对数据的增删改查。
- 快照克隆服务器独立于核心服务,对外提供了HTTP接口,用于处理和管理快照克隆任务。
在Curve系统中,存储资源被分成了一个个分片,称之为Chunk,典型的Chunk大小是16MB。为了实现数据高可用、高可靠,chunk通常会被复制多个副本,较为常见的是3个副本的配置,这样的三个副本的组合,叫做复制组,也就是我们称之为CopySet的概念。本文所描述的CopySet Replication指的就是一种复制组如何分布到上述这些ChunkServer上的一种算法。
CopySet Replication的概念由文献「Copysets: Reducing the Frequency of Data Loss in Cloud Storage」而来,本意是为了提高分布式存储系统中的数据持久性,降低数据丢失的概率。如下图所示。