上图中,由于有4台服务器(排除从库),因此公式为hash(sessionId) % 4 = 2 ,可知定位到了第2号服务器。
但是呢,普通的如果4台缓存服务器已经不能满足我们的缓存需求,那么我们应该怎么做呢?很简单,多增加几台缓存服务器不就行了!
假设:我们增加了一台缓存服务器,那么缓存服务器的数量就由4台变成了5台。那么原本hash(sessionId) % 4 = 2 的公式就变成了hash(sessionId) % 5 = ?, 可想而知这个结果肯定不是2的,这种情况带来的结果就是当服务器数量变动时,所有缓存的位置都要发生改变!
于是乎,他才想引我去答一致性哈希算法!总之,该死的破网络!导致两边不在一个频道上!
一致性哈希
既然都提到了一致性哈希算法了,就当复习一下吧~~
一致性哈希算法的精髓只有一个:对2^32次方取模。
我们将二的三十二次方想象成一个圆,这个圆上的数字就是即0~(2^32)-1。
如下图所示
这时候有三台缓存服务器A、B、C。
我们
hash(服务器A的IP地址) % 2^32
插播一下,写到这里,这里我又想起一道题了!
有哪些常见的hash算法啊?
OK,先继续我们的话题。经过上面的运算,我们算出的结果一定是一个0到2^32-1之间的一个整数,我们就用算出的这个整数,代表服务器A,既然这个整数肯定处于0到2^32-1之间,那么,上图中的hash环上必定有一个点与这个整数对应,我们使用这个整数代表服务器A,那么,服务器A就可以映射到这个环上。
同理进行
hash(服务器B的IP地址) % 2^32
hash(服务器C的IP地址) % 2^32
于是,得到了下面这一张图
那么,我们要用服务器存储session,那么我们用sessionId做key,进行如下运算
hash(sessionId) % 2^32
得到的一个环上的值。那我们怎么知道session被存到哪个服务器上呢,OK,顺时针方向找到的第一个服务器就是。如下图所示
假设,我们现在有四个session,分别进行映射运算后得到如下的环