一、一致性哈希的概念
一致性哈希的按字面意思就是多次哈希前后的结果不变,除此之外还有一定的鲁棒性。
这里的哈希结果不变很好理解。通常如果我们的哈希函数采用了除留余数法,比如现在我有三个数100、54、2。如果我想一个哈希函数来把这三个数放进一个连续的数组里面,那么我只要对这些数都模上3即可。所以:
100 % 3 = 1、 54 % 3 = 0、2 % 3 = 2. 这样的话,我就可以把这三个数放进数组下标为1、0、2的地方了。下次来了一个值为100的数,还是把它映射到1的下标去取里面的内容。这就是哈希结果不变。
那么,多次结果不变有什么用?
第一,它可以解决会话共享的问题。所谓会话,就是服务器存储了一些客户端的用户信息,比如登录状态什么的。假设现在多台服务器,这些服务器能实现相同的功能,这叫做集群。这些服务器把你的IP和端口号当成哈希的值,映射到一台服务器上。假如不保证两次哈希结果的不变,你每次登录一台新的服务器需要重新输入密码,麻烦不?
第二,数据库的缓存也需要这种一致性。缓存会把数据库查询的结果暂存在自己这边,下次查询的时候直接从缓存中拿数据就行了。但如果映射到别的缓存中,缓存发现自己没有你需要的信息,就需要重新向数据库查询,这个是很慢的。
鲁棒性是什么意思?
前面我们使用了除留余数法对吧?那里的3可以看三台服务器。现在如果有一台挂了,假设3挂了,按上面的哈希方法,可不仅仅影响了第三台服务器的用户,而是大部分的用户!为什么?当3挂了之后,监视这些服务器的管理中心就会发现,然后把模3变成模2。假设在上面的例子中,100、54、2是三个不同的用户通过一个函数把他们的IP和端口运算出来的值。原本第三台服务器的用户是2,现在2%2=0,直接去第一台服务器拿资源,这是没问题的,因为第三台服务器挂了。而客户100来了,100%2=0,也去第一台服务器拿资源,这明显有问题呀。100原来的映射的服务器可是第二台(1)服务器!而54来了,54%2=0,也去第一台服务器拿资源。这就惨了,第一台服务器可能直接崩了。换成缓存,可能直接发生缓存雪崩了。
所以,有没有可能第三台服务器崩了只影响第三台服务器的原本客户,而不影响其他服务器的客户呢?
那这不就是要求鲁棒性强嘛,能抗一定的干扰!怎么设计这种多次哈希前后一致,有服务节点崩了不会造成大量客户哈希重定位的哈希函数呢?那就是哈希环了。
二、哈希环
哈希环的设计如下,每个客户会被映射到顺时针最近的服务器上。如果现在服务器3挂了,直接从环上消失了。那客户2就去服务器1了,而对客户54、100没有任何影响。这样,就不会因为一个节点挂了造成大量的哈希重定位,多是一件美事啊。


本文介绍了一致性哈希的概念,强调其在会话共享和数据库缓存中的应用,以及如何通过哈希环设计实现鲁棒性,确保节点故障时仅影响有限的用户。重点讲解了哈希环的原理和其在服务节点故障场景下的优势。
6846

被折叠的 条评论
为什么被折叠?



