岁月如歌 2019-12-22
Nginx使用最广泛的是的负载均衡服务。在实际使用负载均衡服务时需要考虑两个问题:一、根据负载均衡策略选择合适的上游服务器。二、检查上游服务器的健康状态并将异常的服务器标记为不可用。
为了满足多种场景,Nginx开源版本提供了轮询、IP哈希和最少连接数等三种负载均衡策略。
轮询负载均衡策略会将用户的请求平均的分配给上游服务器的同时考虑权重值,权重值得越高分配的任务越多。
最少连接负载均衡策略会将用户的请求发送到连接最少的服务器的同时考虑权重值,权重值得越高分配的任务越多。
这两种方式主要通过上游服务器的负载和权重为用户选择的上游服务器,其结果较为随机,需要我们业务支持上游服务器节点间数据同步。
IP哈希负载均衡策略是通过用户的IP地址计算HASH值来保证用户同一个地址的请求发送给同一个上游服务器处理。这种负载均衡策略保证了用户的每次请求都发送给同一个服务器,无需上游服务器之间数据同步,但大量使用NAT上网(同一个来源地址)的场景容易导致上游服务器负载不均衡。
我们可以根据业务场景选择合适的负载均衡策略。
我就职的公司业务分为前端和后端。
其中后端业务主要提供无状态的REST API服务,无需同步上游服务器节点间数据,所以,Nginx提供的三种负载均衡策略均可以使用。为了减少选择上游服务器的时间,我们使用最简单的轮询策略。
其中前端业务提供有状态的Web服务,且未对上游服务器节点间数据同步,不能使用轮询和最少连接的负载均衡策略,且因业务场景中较多用户使用NAT上网而不能使用IP哈希负载均衡策略。因此,如上三种负载均衡策略不满足我们的前端的业务场景。Nginx的生态圈提供了第三方模块Sticky Upstream可以满足我们前端业务场景。Sticky Upstream模块通过Cookie信息识别用户会话并将该会话中的所有请求交给同一个上游服务器处理。
这种方式既保证了用户每次访问同一个上游服务器,又解决了IP哈希策略负载不均衡的问题,可以快速的实现横向扩展上游服务器节点。
为了避免将用户的请求发送给故障的上游服务器,Nginx提供了被动健康检查。Nginx会监视与上游服务器之间的事务发生,并尝试恢复失败的连接。如果仍然无法恢复,则Nginx将其标记为不可用,并暂停向该上游服务器发送请求,直到其标记为正常。Nginx对上游服务器的健康检查有效的提高了平台的可用性。