#分布式集群架构场景化解决方案
-
一致性Hash算法
-
集群时钟同步问题
-
分布式ID解决方案
分布式集群中全局唯一ID的方案
-
分布式调度问题(定时任务的分布式)
-
Session共享问题
一致性Hash算法
Hash算法,如MD5、SHA加密算法,在数据存储和查找方面有Hash表等,都用到了Hash算法。
为什么使用Hash?
**直接寻址法:**直接把数据和数组的下标绑定在一起,查找的时候,直接从数组取出。
优点:速度快、一次查找得出结果。
缺点:
1)浪费空间,比如1,5,7,8,12306,按照上述方式需要定义一个长度为12307的数组,实际只需要几个数据,其他位置空间都浪费。
2)数据如:1,5,7,1,5,7,1,2,1,1,1,3,2,12最大值12,开辟13个空间,存储不了这么多数据。
现在换一种设计,如果数据3,5,7,12306一共4个数据,我们开辟任意个空间,比如5个,具体位置存储在哪个位置呢?我们可以根据数据进行求模(对空间位置数5),根据求模余数确定存储位置下标,如果3%5=3,就可以把3这个数据放在下标为3的位置上,12306%5=1存储在下标为1的位置上。
上面对数据求模(数据%空间位置数)他就是一个hash算法,只不是这是一种比较普通又简单的hash算法,这种构造hash算法的方式叫做除留余数法
如果数据是1,6,7,8把这4个数据存储到上面的数组中
在此基础上采用 开放寻址法
**开放寻址法:**1放进去,6再来的时候,向前或向后找空闲位置存放,不好的地方,如果数组长度定义好了比如10,长度不能扩展,来了11个数据,不管Hash冲突不冲突,肯定存不了那么多数据
**拉链法:**数据长度定义好了,怎么存储更多内容呢,算好Hash值,在数组元素存储位置放了一个链表
如果Hash算法设计的比较好的话,那么查询效率会更接近于O(1),如果设计比较差的话,查询效率就会很低。
除留余数法
线性构造Hash算法
直接寻址法也是一种构造Hash的方式,只不过更简单,表达式:H(key)=key
比如H(key)=a*key + b(a,b是常量)
1.Hash算法应用场景
hash算法在分布式集群架构中的应用场景
Hash算法在很多分布式集群中都有应用,比如分布式集群架构Redis、Hadoop、ElasticSearch、Mysql分库分 表、Nginx负载均衡等。
主要应用场景归纳为两个:
-
请求的负载均衡(比如nginx的ip_hash策略)
Nginx的ip_hash策略可以在客户端ip不变的情况下,将其发出的请求始终路由到同一个目标服务器上,实现会话粘滞,避免处理session共享的问题。
-
如果没有ip_hash策略,如何实现会话粘滞?
可以维护一张映射表,存储客户端ip或者sessionId与具体目标服务器的映射关系<ip,tomcat>
-
缺点:
- 客户端很多的情况下,映射表非常大,浪费内存空间
- 客户端上下线,目标服务器上下线,都会导致重新维护映射表,映射表维护成本很大
-
如果使用hash算法,我们可以对ip地址或者sessionId进行计算哈希值,哈希值与服务器数量进行取模运算,得到的值就是当前请求应该被路由到的服务器编号,如此,同一个客户端ip发送过来的请求就可以路由到同一个目标服务器,实现会话粘滞。
-
-
分布式存储
针对redis,比如3台redis,<key, value>针对key进行hash处理 hash(key)%3=index,最终确定存放那台redis
2.Hash算法存在的问题
普通哈希算法存在一个问题,以ip_hash为例,假定下载用户ip固定没有发生改变,现在tomcat3出现了问题,down机了,服务器数量由3个变成了2个,之前所有的求模都需要重新计算。
如果在真实情况下,后台服务器很多,客户端也很多,影响很大,缩容和扩容都会存在这样的问题,大量用户的请求会被路由到其他的目标服务器处理,用户在原来服务器中的会话都会丢失。
3.一致性hash算法
首先有一条直线,直线开头和结尾分别定为为1和2的32次方减1,这相当于一个地址,对于这样一条 线,弯过来构成一个圆环形成闭环,这样的一个圆环称为hash环。我们把服务器的ip或者主机名求 hash值然后对应到hash环上,那么针对客户端用户,也根据它的ip进行hash求值,对应到环上某个位 置,然后如何确定一个客户端路由到哪个服务器处理呢?按照顺时针方向找最近的服务器节点
假如将服务器3下线,服务器3下线后,原来路由到3的客户端重新路由到服务器4,对于其他客户端没有 影响只是这一小部分受影响(请求的迁移达到了最小,这样的算法对分布式集群来说非常合适的,避免 了大量请求迁移 )
增加服务器5之后,原来路由到3的部分客户端路由到新增服务器5上,对于其他客户端没有影响只是这 一小部分受影响(请求的迁移达到了最小,这样的算法对分布式集群来说非常合适的,避免了大量请求 迁移 )
- 综上,每一台服务器负责一段,一致性哈希算法对于节点的增减都只需重定位环空间中的一小部分数据,具有较好的容错性和扩展性。
- 一致性哈希算法在服务节点太少时,造成数据倾斜问题。
- 为了解决数据倾斜问题,一致性哈希算法引入了虚拟节点机制,对每一个服务节点计算多个hash,每个计算结果位置都放置一个此服务节点,称为虚拟节点。
- 具体做法可以在服务器ip或主机名的后面增加编号实现。比如:可以为每台服务器计算三个虚拟节点,分别为“节点1的ip#1”、“节点1的ip#2”、“节点1的ip#3”...的哈希值,于是形成6个虚拟节点,当客户端被路由到虚拟节点的时候其实就是被路由到该虚拟节点所对应的真实节点。