1、总述
分布式负载均衡算法的主要目的就是为了缓解集群服务器的压力,让客户端的请求尽可能均匀分散在各个服务器节点中。下面主要分析一致性Hash和Hash槽两种算法。
参考链接:
https://blog.csdn.net/majunzhu/article/details/100173943
https://blog.csdn.net/Saintyyu/article/details/100056329
2、普通Hash
这里我们先考虑这种普通hash的实现方式,考虑有2个服务器节点,有6个数据(0~5),那自然想到的是采取这种hash函数:num%k(k为服务器数) 来均匀分散这6个数据到服务器上。
- 节点0——0,2,4
- 节点1——3,5
但是如果数据量增加了,造成服务器节点不够用了,假设这里加入增加2个数变为(0…7),并增加一个节点。这时数据分布变为:
- 节点0——0,3,6
- 节点1——1,4,7
- 节点2——2,5
从上面就可以看出新增节点或删除节点都会极大地影响原来的数据分布形式,会造成大量的数据迁移。
3、一致性Hash
为了解决上述问题,即如何保证在删除或新增节点的情况下尽可能小的影响原有节点的数据分布,从而减少数据迁移的大小,防止集群雪崩的发生。于是才有了一致性hash算法,其一致性在于尽可能让原来的节点数据保持一致性不变,而不是分布式集群的数据一致性。
一致性hash是一个0-232的闭合圆,(拥有232个桶空间,每个桶里面可以存储很多数据,可以理解为s3的存储桶)所有节点存储的数据都是不一样的。计算一致性哈希是采用的是如下步骤:
- 对节点进行hash,通常使用其节点的ip或者是具有唯一标示的数据进行hash(ip),将其值分布在这个闭合圆上。
- 将存储的key进行hash(key),然后将其值要分布在这个闭合圆上。
- 从hash(key)在圆上映射的位置开始顺时针方向找到的一个节点即为存储key的节点。如果到圆上的0处都未找到节点,那么0位置后的顺时针方向的第一个节点就是key的存储节点。
如图: