首先介绍一下传统的应对访问量数据量较大请求的时候 。
电脑表示前端,服务器表示后台。
前端每一台电脑都使用相同的哈希函数,当一个请求过来的时候,无论是到哪个前端哪个电脑,计算出请求的哈希都是一样的,哈希%3得到0-2,然后确定出他要归哪台服务器处理,所以一个用户的请求我们基本固定在一台服务器上,他的所有信息我都存在同一台服务器上。这是传统的处理方法,这里有一个问题,比如淘宝平时用户量是正常的,常规配置三台服务器处理请求。但是到了双11,三台是远远不够的,就要添加服务器处理,那么问题来了。添加了服务器,那之前的所有哈希都要重新计算,用户之前的所有缓存就要重新迁移 这样的数据量太大了。
那么就引出了一致性哈希,一致性哈希是一种分布性算法,主要是为了解决负载均衡。
之前我们需要将请求计算出取%,但是一致性哈希。我们将哈希的所有可能值均匀的赋值给一个圆环
图片内容参考引用于 https://www.cnblogs.com/lpfuture/p/5796398.html
最左边的图表示了哈希的均匀分布,然后计算计算服务器的哈希,比如计算他的用户名,然后将它接入的圆的相应位置,然后有数据请求进来,也接入圆,顺时针离他最近的服务器负责处理他的请求,插入服务器的话,只需要把受影响的一部分传递给新的即可。
当然这样也有一个问题,比如刚好三台服务器Hash差不多,那么三台挨着很近。那么有一台处理的请求特别多,其余特别少,不均衡。 这样的话,一个服务器配置出N个虚拟节点,假设100个,然后计算hash排列到圆上。当数量很大时候,哈希结果是均匀的,所以圆上的排列也是均匀的,就解决了负载均衡的问题