一致性哈希

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

一、一致性哈希的概念

一致性哈希的按字面意思就是多次哈希前后的结果不变,除此之外还有一定的鲁棒性。

这里的哈希结果不变很好理解。通常如果我们的哈希函数采用了除留余数法,比如现在我有三个数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没有任何影响。这样,就不会因为一个节点挂了造成大量的哈希重定位,多是一件美事啊。
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值