龙空技术网

Nginx负载均衡出现扩容缩容如何减轻缓存失效的问题?

秀才生活号 608

前言:

此时看官们对“nginx应用扩容”大致比较着重,小伙伴们都想要学习一些“nginx应用扩容”的相关资讯。那么小编同时在网摘上搜集了一些关于“nginx应用扩容””的相关文章,希望大家能喜欢,各位老铁们快快来学习一下吧!

上一篇文章 Nginx负载均衡之ip hash与hash模块,弥补Round-Robin的缺陷我们介绍了upstream_hash算法,可以按一定的条件 将固定的请求转发到固定的server上。

有遇到一个问题,当上游服务器出现问题的时候,或者扩容的时候会产生什么样的情况。

假如有5台上游服务器,server0 …… server4, 请求根据key进行取模 hash算法: 为key % 5

会产生如下结果:

key5 被upstream到 server0上。

……

key9 被upstream到 server4上。

当server4挂掉了后,原本美好的事情就变成这样:

hash算法:key%4

key5 被upstream到 server1上。

key6 被upstream到 server2上。

key7 被upstream到 server3上。

key8 被upstream到 server0上。

key9 被upstream到 server1上。

这一下就全都打乱了,如果上游服务器有缓存的话,会导致大批量缓存失效的问题。有可能会导致比较严重的事故。

那么一致性hash算法可以有效缓存这种问题。

假设扩容前有4台服务器,均匀地分布在一个环上。

我们的请求key 经过hash算法是0到2的32次方也是均匀的分布在环上,就去找下一个比它大的Node。

当需要扩缩容的时候只会影响两个Node中间的请求。这就尽可能的减少了影响范围。

比如现在在Node2 和Node4之间增加了一个节点Node5。

可以看到原来Node2 到 Node4之间的5个请求,只影响了3个key的请求,只有这3个请求的缓存没有命中了被请求到了Node5上。

当然这并没有解决宕机后的路由不发生变化,都宕机了也无法解决。

使用配置:只需要在hash模块后 加上 consistent就可以了

Syntax: hash key [consistent];Default: —Context: upstream

标签: #nginx应用扩容