Cluster模式潜在问题学习笔记—一致性Hash算法之负载均衡应用场景
1. Hash算法应⽤场景
- Hash算法在分布式集群架构中的应⽤场景
Hash算法在很多分布式集群产品中都有应⽤
,⽐如分布式集群架构Redis、Hadoop、ElasticSearch,Mysql分库分表,Nginx负载均衡等主要的应⽤场景归纳起来两个
- 请求的负载均衡(⽐如:
Nginx
的ip_hash
策略(ip_hash也是hash算法的一种应用)
) - 分布式存储
- 请求的负载均衡(⽐如:
2. 应用场景一:请求的负载均衡(⽐如:Nginx
的ip_hash
策略(ip_hash也是hash算法的一种应用)
)
Nginx的IP_hash策略
可以在客户端ip不变的情况下,将其发出的请求始终路由到同⼀个⽬标服务器上,实现会话粘滞,避免处理session共享问题如果没有IP_hash策略
,那么如何实现会话粘滞?
可以维护⼀张映射表,存储客户端IP或者sessionid与具体⽬标服务器的映射关系<ip,tomcat1>
缺点
:- 那么,在客户端很多的情况下,映射表⾮常⼤,浪费内存空间
- 客户端上下线,⽬标服务器上下线,都会导致重新维护映射表,映射表维护成本很⼤
如果使⽤哈希算法,事情就简单很多
,我们可以对ip地址或者sessionid进⾏计算哈希值,哈希值与服务器数量进⾏取模运算
,得到的值就是当前请求应该被路由到的服务器编号,如此,同⼀个客户端ip发送过来的请求就可以路由到同⼀个⽬标服务器,实现会话粘滞
。- Nginx ip_hash策略示意图如下:
-
通过
hash(ip)%node_counts=index
通过求模取余得到index
锁定应该路由到的tomcat,以后只要一发送请求,就会发送到指定的服务器上 -
客户端1:1%3=1,所以就到编号1的Tomcat2中去了,又因为
会话粘滞
,所以同⼀个客户端ip
发送过来的请求就可以路由到同⼀个⽬标服务器
-
进入Nginx的src包里面可以看到几个包
,如图所示:
-
我们进入http包里面,因为
ip_hash
是负载均衡策略的一种,他解决的是http请求分发问题
,所以要进入http包里
,进去之后能看到如下图:
-
进入
http
里面看到还有一个moudle
包,其实Ngxin本身
也是模块化的一种机制,Nginx完整功能
都是由很多的小模块组成的,每个小模块完成相应的功能,进入moudle中
,如下图:
-
看到上图中拥塞框圈出来的
ngx_http_upstream_ip_hash_module.c
文件,进入文件,查看Nginx的hash算法(hash算法指的是一类算法而不是某一个算法)
-
3. 应用场景二:分布式存储
- 以分布式内存
数据库Redis
为例,集群中有redis1,redis2,redis3 三台Redis服务器 - 那么,在进⾏数据存储时,<key1,value1>数据存储到哪个服务器当中呢?
- 针对key进⾏hash处理
hash(key1)%3=index
, 使⽤余数index
锁定存储的具体服务器节点