互联网系统架构与应用Java研究者

分布式一致性哈希分析

2018-05-12  本文已影响190人  叩丁狼教育

作者:贺圣军,叩丁狼高级讲师。原创文章,转载请注明出处。

1 场景需求

​ 现在实际应用中,我们使用redis作为我们的缓存服务器,假如现在我们的使用三台redis服务器用来作为缓存(redis01,redis02,redis03),现在我们需要把我们的数据均匀的存放到三个redis服务器上

对于redis服务器来说,并没有实现分布式集群,所谓的redis的分布式集群是指由客户端所决定存数据存放到哪台服务器以及从哪台服务器上取获取数据

同理,在取数据的时候,也是先根据key进行hash值的运算,然后取余找到对应的redis服务器进行数据的读取

问题:随着业务的增长获取服务器的运行状况,如果出现需要增加服务器或者说有一个redis服务器宕机的话,那么按照我们上面的取模运算还可以正常运行吗?如果不行那么我们有什么样的方案来解决呢?

2 一致性哈希的概念

​ 对于上面的问题,当服务器其出现上/下线的时候,如果还是按照上述的取模运算的话,显然是会出问题的

总是,在我们当对服务器进行增减操作的时候,原来的所有的缓存数据都需要从新分布排列,这样带代价比较大,有没有一种方法让我们在增减服务器的时候,影响的只有一小部分数据,大部分数据是不需要进行改变的。要实现这个功能,就需要使用到一致性哈希算法

​ 一致性哈希算法大概实现的思路如下

05_一致性哈希图例.png

参考上图,接下来我们分析一下增减服务器的情况

06_一致性哈希图例.png 07_一致性哈希图例.png

通过上面这种解决方案,基本上可以解决分布式的一致性哈希的问题了,但是由于上面这种情况也会出翔一些情况

对于上面两种情况,我们需要使用所谓的一个虚拟节点的概念,在hash圆环上创建足够多的虚拟节点,然后把虚拟节点和物理节点映射起来,这样可以保证资源的平衡性

对于当一个服务器redis02宕机后,应该把redis02上的资源均匀的分布到redis01和redis03上面,这样可以保证各个服务器的负载均衡

3 一致性哈希的特点

1、平衡性(Balance):平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。很多哈希算法都能够满足这一条件。

2、分散性(Spread) :在分布式环境中,终端有可能看不到所有的缓冲,而是只能看到其中的一部分。当终端希望通过哈希过程将内容映射到缓冲上时,由于不同终端所见的缓冲范围有可能不同,从而导致哈希的结果不一致,最终的结果是相同的内容被不同的终端映射到不同的缓冲区中。这种情况显然是应该避免的,因为它导致相同内容被存储到不同缓冲中去,降低了系统存储的效率。分散性的定义就是上述情况发生的严重程度。好的哈希算法应能够尽量避免不一致的情况发生,也就是尽量降低分散性。

3、负载(Load):负载问题实际上是从另一个角度看待分散性问题。既然不同的终端可能将相同的内容映射到不同的缓冲区中,那么对于一个特定的缓冲区而言,也可能被不同的用户映射为不同 的内容。与分散性一样,这种情况也是应当避免的,因此好的哈希算法应能够尽量降低缓冲的负荷。

4、单调性(Monotonicity):单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲加入到系统中。哈希的结果应能够保证原有已分配的内容可以被映射到原有的或者新的缓冲中去,而不会被映射到旧的缓冲集合中的其他缓冲区。

WechatIMG7.jpeg
上一篇 下一篇

猜你喜欢

热点阅读