一致性Hash问题和解决方案

一.一致性Hash算法

Hash算法,⽐如说在安全加密领域MD5、SHA等加密算法,在数据存储和查找⽅⾯有Hash表等, 以上
都应⽤到了Hash算法

1.为什么需要使⽤Hash?

 较多运用在存储和查找领域,最经典的就是Hash表,查询效率⾮常之⾼,哈希算法如果设计的⽐较ok的话,那么Hash表的数据查询时间复杂度可以接近于O(1)**Hash表的查询效率⾼不⾼取决于Hash算**

2.Hash算法应⽤场景

Hash算法在分布式集群架构中的应用场景。分布式集群架构Redis、Hadoop、ElasticSearch,
Mysql分库分表,Nginx负载均衡等
主要作用的应用场景归纳为两个:
1.请求的负载均衡(比如Nginx的ip_hash策略)

 - Nginx的IP_hash策略可以在客户端ip不变的情况下,将其发出的请求始终路由到同⼀个⽬标服务
   器上,实现会话粘滞,避免处理session共享问题
   
 - 如果没有IP_hash策略,那么如何实现会话粘滞?
 	可以维护⼀张映射表,存储客户端IP或者sessionid与具体⽬标服务器的映射关系.<ip,tomcat>
 	缺点:
 		1.在客户端很多的情况下,映射表非常大,浪费内存空间
 		2.客户端上下线和目标服务器上下线,都会导致重新维护映射表,映射表维护成本很大
 		
如果使⽤哈希算法,我们可以对ip地址或者sessionid进⾏计算哈希值,哈希值与服务器数量进⾏取模运算,得到的值就是当前请求应该被路由到的服务器编号,如此,同⼀个客户端ip发送过来的请求就可以路由到同⼀个⽬标服务器,实现会话粘滞。 	

2.分布式存储

 - 以分布式内存数据库Redis为例,集群中有redis1,redis2,redis3 三台Redis服务器
   那么,在进⾏数据存储时,<key1,value1>数据存储到哪个服务器当中呢?针对key进⾏hash处理
   hash(key1)%3=index, 使⽤余数index锁定存储的具体服务器节点

3.普通Hash算法存在的问题

普通Hash算法存在⼀个问题,以ip_hash为例,假定下载⽤户ip固定没有发⽣改变,现在tomcat3出现
了问题,down机了,服务器数量由3个变为了2个,之前所有的求模都需要重新计算

在这里插入图片描述

3.⼀致性Hash算法

⼀致性哈希算法思路如下:

在这里插入图片描述

⾸先有⼀条直线,直线开头和结尾分别定为为1232次⽅减1,这相当于⼀个地址。

对于这样⼀条线,弯过来构成⼀个圆环形成闭环,这样的⼀个圆环称为hash环。

我们把服务器的ip或者主机名求hash值然后对应到hash环上。

那么针对客户端⽤户,也根据它的ip进⾏hash求值,对应到环上某个位置,然后客户端路按照顺时针⽅向找最近的服务器节点

在这里插入图片描述

假如将服务器3下线,服务器3下线后,原来路由到3的客户端重新路由到服务器4。
对于其他客户端没有影响只是这⼀⼩部分受影响(请求的迁移达到了最⼩,这样的算法对分布式集群来说⾮常合适的,避免了⼤量请求迁移 )

在这里插入图片描述

增加服务器5之后,原来路由到3的部分客户端路由到新增服务器5上,对于其他客户端没有影响只是这⼀⼩部分受影响(请求的迁移达到了最⼩,这样的算法对分布式集群来说⾮常合适的,避免了⼤量请求迁移 )

1)如前所述,每⼀台服务器负责⼀段,⼀致性哈希算法对于节点的增减都只需重定位环空间中的⼀⼩
部分数据,具有较好的容错性和可扩展性。

但是,⼀致性哈希算法在服务节点太少时,容易因为节点分部不均匀⽽造成数据倾斜问题。例如系统中
只有两台服务器,其环分布如下,节点2只能负责⾮常⼩的⼀段,⼤量的客户端
请求落在了节点1上,这就是数据(请求)倾斜问题

2)为了解决这种数据倾斜问题,⼀致性哈希算法引⼊了虚拟节点机制,即对每⼀个服务节点计算多个
哈希,每个计算结果位置都放置⼀个此服务节点,称为虚拟节点。

具体做法可以在服务器ip或主机名的后⾯增加编号来实现。⽐如,可以为每台服务器计算三个虚拟节
点,于是可以分别计算 “节点1的ip#1”、“节点1的ip#2”、“节点1的ip#3”、“节点2的ip#1”、“节点2的
ip#2”、“节点2的ip#3”的哈希值,于是形成六个虚拟节点,当客户端被路由到虚拟节点的时候其实是被
路由到该虚拟节点所对应的真实节点

在这里插入图片描述
4.⼿写实现⼀致性Hash算法

1.普通Hash算法实现
public class GeneralHash
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酆都小菜鬼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值