标签:应用 包括 == The 流程图 性能 red 站长 lock
Copyset模块结合chunk的放置共同解决了集群数据如何分布的问题,这里主要的设计考虑点是数据分布的均衡性以充分利用磁盘空间和避免热点。
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)。
copyset生成策略的设计目标是创建集群的一个均衡的初始分布,达到几个目的:
Copyset模块结合chunk的放置共同解决了集群数据如何分布的问题,这里主要的设计考虑点是数据分布的均衡性以充分利用磁盘空间和避免热点。
zone指的是curve的故障域,它是一个逻辑概念,zone可以对应到一个实际的物理机架,实现机架级别的物理隔离。
Curve的Copyset生成策略借鉴了「Copysets: Reducing the Frequency of Data Loss in Cloud Storage」中的Copyset算法,并扩展考虑了故障域的设计。其设计基于以下几点考虑:
固定数量的copyset是很重要的一个抉择点,根本考虑点是相对于动态数量的copyset方法,更简单,并且实践证明也是够用的。
固定数量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。
那么将上述推广到,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
... ... ... ... ... ...
当我们通过随机化的方法生成了copyset以后,如何确保copyset以及scatter width的均衡性?
这里就通过一系列的度量指标去判断。这些指标包括:
当每次生成copyset时,计算上述一向或多项指标(根据配置),判断生成的copyset是否满足上述指标,如果不满足,则重试生成copyset,直到满足上述指标为止。
这一步骤的流程图如下:
最后,至关重要的就是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/s | 10MB/s | 20MB/s | 50MB/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的核心开发。
Copyset Replication -- Curve的数据分布策略
标签:应用 包括 == The 流程图 性能 red 站长 lock
原文地址:https://www.cnblogs.com/0591jb/p/14753391.html