QianBase MPP秒级扩缩容是如何实现的?

QianBase MPP秒级扩缩容是如何实现的?

分布式数据库能够将数据分散到多个节点,利用集群的资源进行并行计算与存储来提升海量数据的分析性能和数据容量,因此已经成为数据分析领域的主流技术。随着系统数据量的变化、新老设备的更替,分布式数据库必然要迎来扩缩容需求,而海量数据重分布时间长、对业务连续性影响大的问题一直是系统扩缩容亟需解决的痛点。

QianBase MPP(以下简称QianBase)是针对大规模数据查询分析、企业级数据仓库和商业智能等领域设计的一款Share-Nothing架构的分布式MPP数据库产品。为了能更好地支撑数据的长期积累,例如“持续收集用户消费习惯”等场景,QianBase在集群扩缩容技术上使用更为先进的一致性哈希算法,保证仅对少部分数据进行重分布,减少集群压力并实现秒级在线扩缩容。

1、传统数据库哈希分布策略,扩缩容时业务几乎不可用

传统MPP数据库通常为表设置分布键,然后用哈希算法算出分布键key的hash值,然后根据集群节点数量对该hash值取余,从而将数据映射到对应的节点上,如hash(key)%N=“节点id”,N是服务器节点数。在这样的分布式数据库系统中,每个节点存储的数据都是不同的,数据被水平拆分到不同的节点上。

假如,目前有一个三节点的分布式数据库集群(节点1、节点2、节点3),现在有3000万条数据,希望将这些数据均匀分布至三个节点上。

  1. 节点1:取模值为0
  2. 节点2:取模值为1
  3. 节点3:取模值为2

图-哈希算法取模方法

这样的分布策略虽然使用简单,但当节点数N发生变化后,将导致每一个key对应的数据位置都可能发生变化;这在集群扩容和缩容时不得不对整库的全量数据重新计算“hash(key)%N”,最终很可能发生全量数据的重分布,导致系统资源长时间繁忙,甚至日常业务也无法运行。

在生产环境中根据业务量的大小变化调整节点数量是常有的事,尤其在云环境中可能更加频繁,所以这样的分布策略存在明显的局限性。

普通哈希算法的局限性

图-集群节点增加的场景

2、QianBase使用一致性哈希算法,实现秒级扩缩容

一致性哈希算法在1997年由麻省理工学院提出,是一种特殊的哈希算法,一致性哈希在QianBase中的应用解决了集群在扩缩容过程中数据大量重分布的问题。

一致性哈希算法的设计关键有以下几点:

  1. 平衡性:所有的key能被均匀地映射到各个节点上
  2. 单调性:增加新的节点后,原有的key应该被映射到原有的节点或新的节点上
  3. 分散性:集群扩容或者缩容时,尽量减少数据的迁移
  4. 负载性:尽量降低单个节点的负载

一致性哈希算法里面也运用了取模运算,但与哈希算法不同的是,一致性哈希算法是对2^32进行取模运算,是一个固定的值。可以理解为一致性哈希算法是对2^32进行取模运算的结果值组织成一个圆环,就像钟表一样,钟表的圆可以理解成由60个点组成的圆,这个圆被称为哈希环。假如,目前有一个三节点的QianBase分布式数据库集群(节点1、节点2、节点3)映射到如下图的位置:

图-集群节点在哈希环上的位置

假设,写入一批数据值(key1、key2、key3),如果需要定位到key1的数据具体存储在哪个节点上,应该怎么去找?

首先,对要查询的key1进行哈希计算,确定此key1映射在哈希环上的位置,然后需要从这个位置往顺时针方向找到第一个节点,就是存储该key1数据的节点。

图-hash(key)在哈希环上的位置

现在已经知道了一致性哈希算法的寻址方式,接下来看看,如果增加一个节点4或者移除节点3会不会发生大量的数据迁移?

图-增加节点4对数据位置的影响

如上图所示,可以看出来增加一个节点4,key1和key3都不会受到影响,只有key2需要被迁移至节点4。

图-移除节点3对数据位置的影响

如上图所示,可以看出来移除一个节点,key1和key2都不会受影响,只有key3需要被迁移至节点1。因此在QianBase集群中,基于一致性哈希算法的特性,如果增加或移除一个节点,仅影响该节点在哈希环上顺时针相邻的后续节点,其它数据并不会收到影响。

从上文中介绍的三个节点映射在哈希环上来看相对还是比较分散的,因此看起来请求都会均衡到每个节点上,但是实际情况是一致性哈希算法并不能保证节点能够在哈希环上均匀分布,这样会造成大量的请求集中在一个节点上,产生严重的数据倾斜问题。

图-一致性哈希算法(数据倾斜)

如上图所示,有一半以上的数据寻址都会找到节点1,根本没法实现负载均衡。另外,在这种分布不均匀的情况下,QianBase数据库如果进行扩缩容时,哈希环上的相邻节点容易受到过大影响,造成雪崩的连锁反应。例如,上图中的节点1宕机后,根据一致性哈希算法的规则,其上数据都应该迁移到顺时针相邻的节点2上,这样节点2的数据量和访问量会迅速飙升,一旦超过了节点2的处理能力上限,就会导致节点2崩溃,以此类推就会形成雪崩的连锁反应。所以,一致性哈希算法虽然减少了数据迁移量,但是存在数据不均匀的问题。为了解决此类问题需要通过增加虚拟节点的方法来提高均衡度。

解决思路,要想解决节点在哈希环上分配不均匀的问题,就需要更多的节点,节点数越多,哈希环上的分布节点就越均匀。但是实际上不可能有这么多实际节点。所以就需要加入虚拟节点,也就是对一个真实节点做映射节点。

具体实现,不再将真实节点映射到哈希环上,而是将虚拟节点映射到哈希环上,并将虚拟节点映射到真实节点上,所以就存在两层映射关系。

假设,对每个节点分别设置三个虚拟节点:

  1. 节点1:节点1-1,节点1-2,节点1-3
  2. 节点2:节点2-1,节点2-2,节点2-3
  3. 节点3:节点3-1,节点3-2,节点3-3

图-一致性哈希算法(虚拟节点提高均衡度)

引入虚拟节点后,节点数量增加了,数据在哈希环上的分布就更加均匀了,就不容易出现数据倾斜的问题。如果有访问请求寻址到“节点1-1”这个虚拟节点,接着再通过“节点1-1”虚拟节点找到真实“节点1”,这样就能访问到真实节点1了。

虚拟节点除了使数据分布更加均衡之外,也会极大的提高数据的稳定性,当节点的数量变化时,会有不同的节点分担数据的请求压力,而不会像之前的数据倾斜问题一样,当移除一个节点,数据全都转到另一个节点上,导致雪崩发生。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值