数据分布式集群的部署

83 阅读2分钟

首先需要区分分布式和集群的区别?

  • 分布式是不同的业务部署在不同的机器上;
  • 集群是相同的业务不熟在不同的机器上。

1 传统Hash

如果进行扩容和缩容,将会非常的麻烦。

2 一致性Hash

首先建立一个长度为2^32-1的环,对每个节点进行hash值(0-2^32-1),然后添加数时,同样计算hash值,然后顺时针放在最近的那个节点上。

image.png

2.2 结构定义

1 首先定义两个map

  • map1:key为ip地址String,value为机器节点的定义Node。
  • map2:key为此节点的hash值Long,value为机器节点的定义Node。

image.png

写数据: 根据数据的Hash值找到最近的一个Node节点,然后将数据写入该节点。

image.png

问题: 1 发现数据都写到了Node3中,因为这100个数的hash都于节点3的最为接近。 2 如果节点故障后,只会迁移到下一个Node上,怎么处理?

2.3 改进

1 虚拟节点 将更多的节点散落在环上,使得节点分布更加均匀。

对节点NodeA进行3次虚拟节点hash分布,形成了虚拟节点NodeA1、NodeA2、NodeA3。当NodeA故障后,指向NodeA的数据会指向NodeB、NodeC。

image.png

虚拟节点数量为100万时的数据分布:

image.png

2 负载边界因子 这样就完美了吗?我们初始化一个4个节点的DHT环,虚拟节点设置为100,然后插入100条数据,并打印DHT环的元数据信息如下:

image.png

可以发现,虽然设置的虚拟节点,但是仍然无法均衡的将节点散列到DHT环上,导致Node2过载,Node空闲。我们再思考一种极端场景,当我们的数据恰好计算hash值后都在区间A,而这个区间只有NodeA,那么仍然出现了数据倾斜。如何解决这个问题呢,这里我们引入一个叫负载边界因子的概念。DHT环部署了4个节点,总共有100条数据要插入,那么平均下来每个节点的权重就是100/4+1=26,当数据映射过程中达到了该节点的权重,则映射到下一个节点,下面是代码实现。

思考:

上述的只是一个简单的DHT,数据也做了简化,数据的存储和读取都需要查询DHT环,如何提升DHT的读写性能?如何提升DHT的高可靠?当节点故障后,如何将故障节点的数据迁移到新的节点?如何做好数据备份?如何保证副本数据不集中在一个节点上?也是需要去思考的,本文只是抛砖引玉简单的介绍了DHT基本的思想,更多生产环境面临的挑战,在此不做展开。