其他分享
首页 > 其他分享> > Copyset Replication -- Curve的数据分布策略

Copyset Replication -- Curve的数据分布策略

作者:互联网

Copyset模块结合chunk的放置共同解决了集群数据如何分布的问题,这里主要的设计考虑点是数据分布的均衡性以充分利用磁盘空间和避免热点。

1. 背景

Curve是网易数帆在2020年7月份开源的一个高性能、高可用、高可靠的分布式存储系统,主打高性能、低延迟。

Github代码仓库:https://github.com/opencurve/curve

Curve存储系统的基础设计框架与经典的GFS基本类似,采⽤有中心节点的架构,核心服务由4个部分组成:

在Curve系统中,存储资源被分成了一个个分片,称之为Chunk,典型的Chunk大小是16MB。为了实现数据高可用、高可靠,chunk通常会被复制多个副本,较为常见的是3个副本的配置,这样的三个副本的组合,叫做复制组,也就是我们称之为CopySet的概念。本文所描述的CopySet Replication指的就是一种复制组如何分布到上述这些ChunkServer上的一种算法。

CopySet Replication的概念由文献「Copysets: Reducing the Frequency of Data Loss in Cloud Storage」而来,本意是为了提高分布式存储系统中的数据持久性,降低数据丢失的概率。如下图所示。

该文献给出的copyset相关的几个术语:

还给出了一种copyset replication的算法:

首先,每次排列的每两个copyset之间只有一个重复的节点,例如{4,5,6}和{3,6,9}之间重复的节点是6。这保证了每增加一个copyset增加该节点的scatter width的R-1。

其次,这种模式(scheme)确保了copyset均匀地覆盖所有节点。因为每一次permutation为scatter width增加R-1,那么总的scatter width为S = P * (R-1),其中P为permutation的次数。总共的copyset数为P(N/R)=(S/(R-1))(N/R)。

2. curve的copyset生成策略

2.1 设计目标:

copyset生成策略的设计目标是创建集群的一个均衡的初始分布,达到几个目的:

  1. copyset需满足故障域约束的要求
  2. 每个ChunkServer的copyset数量保持一致
  3. 每个ChunkServer的scatter-width满足故障恢复的要求,并且尽可能的均衡

Copyset模块结合chunk的放置共同解决了集群数据如何分布的问题,这里主要的设计考虑点是数据分布的均衡性以充分利用磁盘空间和避免热点。

2.2 核心概念:

2.2.1 copyset

2.2.2 physicalPool

2.2.3 logicalPool

2.2.4 Zone

zone指的是curve的故障域,它是一个逻辑概念,zone可以对应到一个实际的物理机架,实现机架级别的物理隔离。

2.2.5 scatter-width

2.3 copyset生成策略实现

Curve的Copyset生成策略借鉴了「Copysets: Reducing the Frequency of Data Loss in Cloud Storage」中的Copyset算法,并扩展考虑了故障域的设计。其设计基于以下几点考虑:

2.3.1 生成固定数量的copyset

固定数量的copyset是很重要的一个抉择点,根本考虑点是相对于动态数量的copyset方法,更简单,并且实践证明也是够用的。

固定数量copyset带来的问题:

2.3.2 在故障域内,基于随机化方法生成copyset

首先要均衡,那么最简单的方法就是随机。但是我们又需要满足故障域的要求,因此,我们采用在故障域内随机。本身故障域内的机器数量是基本均衡的,因此在故障域内随机,总体上仍然能达到均衡。

我们使用3个参数来表示copyset生成的故障域约束:

其中ZoneChosenNum <= ZoneNum是一定的。

一般来说ZoneChoseNum == ReplicaNum, 但是也存在例如在有3个故障域的集群中将3副本放在2个故障域中,即ZoneNum=3, ReplicaNum=3,ZoneChoseNum=2的情况,因此此处是3个参数。

目前Curve的代码实现中,只支持ZoneChoseNum == ReplicaNum的情况。

首先来考虑一种最简单的情况:对于一个有3个故障域的集群,集群的副本数未3副本,并且分布方式是该3副本分布到3个故障域中,那么ZoneNum=3, ReplicaNum=3,ZoneChoseNum=3。

  1. 首先对集群的节点按照故障域分为3个组。
  2. 对3个组各自进行随机排列。
  3. 按照各个组依次取一个节点的方式,组成3副本,生成一个copyset。
  4. 当取完全部copyset后,重复从第2步再次执行排列。
  5. 当取到的copyset数量满足给定的copyset数量后,即完成了一次copyset的生成。

那么将上述推广到,ZoneNum = ANY,ReplicaNum == ZoneChoseNum <= ZoneNum 的情况,第3步骤中将按照如下顺序选取各个zone中的节点:

    zone1    zone2    zone3    zone4   ...  zoneN
     1        2        3         4     ...    N
    N+1      N+2      N+3       N+4    ...   2N
...      ...      ...       ...    ...   ...

2.3.3 使用一系列度量来衡量算法的好坏,重试直到得到一个合理的结果

当我们通过随机化的方法生成了copyset以后,如何确保copyset以及scatter width的均衡性?
这里就通过一系列的度量指标去判断。这些指标包括:

当每次生成copyset时,计算上述一向或多项指标(根据配置),判断生成的copyset是否满足上述指标,如果不满足,则重试生成copyset,直到满足上述指标为止。

这一步骤的流程图如下:

3. scatter width的计算

最后,至关重要的就是scatter-width的计算,scatter width越大,恢复带宽越大,scatter width 表示的是最大同时有多少个copyset可参与恢复。因此:

总恢复带宽 = scatter width * 单个copyset的恢复带宽,
scatter width = 总的恢复带宽 / 单个copyset的恢复带宽  =  (数据容量 / 期望恢复时间)/ 单个copyset的恢复带宽

假设节点每个盘4T,恢复时间3600s,单个copyset的恢复带宽为10MB/s,那么S = (4 * 1024 * 1024) / 3600 / 10 = 116.51,这是scatter width的下限。
下表列出了以单个盘(ChunkServer)大小为4T情况下,单copyset恢复带宽从5MB/s至100MB/s, 恢复时间从1800s至7200s所需scatter width下限:

恢复时间\ 恢复带宽5MB/s10MB/s20MB/s50MB/s
1800s 466.03 233.02 116.51 46.60
3600s 233.02 116.51 46.60 23.30
5400s 155.34 77.67 38.84 15.53
7200s 116.51 46.60 23.30 11.65

作者简介:许超杰,网易数帆资深系统开发工程师,自研分布式存储系统Curve的核心开发。

关键词:站长资讯中心站长资讯站长新闻

标签:ChunkServer,width,--,故障,Curve,节点,Replication,scatter,copyset
来源: https://www.cnblogs.com/0591jb/p/14753391.html