Nginx负载均衡之ip hash与hash模块,弥补Round-Robin的缺陷
我们前一篇文章: Nginx最重要也是最基本的负载均衡策略:加权Round-Robin介绍了Nginx中的加权round-robin负载均衡算法。
它可以根据上游服务的能力,按照权重 转发不同比例的请求。
但是无法做到某一类请求 只请求到某一台上游服务。如:uid=1的请求都在A服务上, 某个ip的用户都请求在同一服务上。
这种场景,Nginx中有2个模块可以帮助我们来解决。
upstream_ip_hash:看名字就知道 这是基于IP地址进行hash的。它是去拿remote_addr里的值,作为hash算法的关键字,再根据hash算法后的值映射到某一台上游服务器。如果经过了代理的话,我们前面也介绍了可以通过realip模块修改remote_addr的值。
Syntax: ip_hash;
Default: —
Context: upstream

upstream_hash:这个模块不局限于仅仅通过客户端ip地址进行hash。可以指定任意关键字进行hash算法映射到指定上游服务器中。关键字可以是变量,也可以是字符串。
Syntax: hash key [consistent];
Default: —
Context: upstream

现在我们发现这2个模块可以将某一类请求转发到指定上游服务,无论这台上游服务是否正常在线。
就算上游服务中某一台挂了。也不能将其直接从upstream列表中移除。因为移除之后,会导致原有的hash算法发生变化,就会导致原本upstream到A的 现在到B了。从而造成严重的后果。
看到这个场景,有经验的小伙伴都知道 为了解决这种问题。一致性hash算法可以有效缓解这类问题。明天我们再来学习一致性hash在Nginx中的应用。