【充电】《Nginx核心知识100讲》负载均衡哈希算法
极客专栏《Nginx核心知识100讲》84~85小节,笔记
注意:这个是看专栏视频,敲的哈。这个专栏让我收货蛮大的。
84 | 负载均衡哈希算法:ip_hash与hash模块
round-robin算法无法保证某一类请求只能由某一台服务器处理,它只能做X轴的水平扩展。如果基于Z轴的扩展时,可以选择基于hash算法来保证某一类请求只会由某一台服务去处理。接下来将介绍两个upstream模块——ip_hash模块与hash模块。ip_hash基于用户的ip地址来进行hash算法。hash模块可以基于任意的参数或者变量进行。
image.png示例
image.pngupstream配置中虽然使用了weight,但是weight不会生效。因为用ip_hash指令。告诉它必须根据用户的地址确认。也就是同一个ip地址只能访问同一个sever。
上游服务为了方便测试,使用了real_ip模块,real_ip设置了新的地址(116.62.160.193,本机地址),通过X-Forwarded-For 最后一个ip地址作为remote_addr变量的值,以它作为ip地址去做hash算法。
收到请求之后会通过proxy_pass 使用反向代理。
image.png与round-robin 的权重算法不同,无论访问多少次都是得到8012 server response
。
接下来看,使用了特定的字符串(hash user_$arg_username)作为hash key。
image.png image.png当一台上游服务下线了 ,机器损坏了,我们不能直接从upstream中把这台机器移除,移除之后会导致hash算法发生变化,就会同时影响原本路由到其他上游server的请求也发生了变化,从而造成严重的后果。一致性hash算法可以缓解这个问题。
留言问题
1.ip_hash 适合有状态的服务
作者回复
是的
85 | 一致性哈希算法:hash模块
上一节介绍了hash算法,它们有个问题当我们上游服务器数目发生变化会导致大量的请求路由策略失效,一致性hash算法能够缓解这一问题。下面介绍upstream模块实现的一致性hash算法。
hash 的问题
image.png image.png一致性hash
image.png使用
使用非常简单。
image.png