基于Nginx+sticky 实现cookie 负载均衡的建设与研究

2024-09-03 00:00:00杨文军薛燕娜
电脑知识与技术 2024年19期

摘要:为解决在某些场景中前端CDN、局域网、客户端集中NAT出口IP等多人来访时,出现IP访问倾斜、丢失和负载不均衡等问题,通过研究Nginx系统的原理与实现方法,结合Web应用中的Cookie保持会话机制,提出了基于Nginx和sticky模块实现的cookie负载均衡方案。实验结果表明,基于sticky cookie实现可有效解决IP倾斜、丢失和负载不均衡等问题,同时在多人来访、用户量高并发的情况下,能够维持每个会话持久性、一致性和服务器压力均衡性。特别是在应用类集群环境共享状态信息下,Sticky cookie会话保持算法仍有助于提高性能。

关键词:Nginx;负载均衡; Cookie;Session;Sticky

中图分类号:TP308;TP333 文献标识码:A

文章编号:1009-3044(2024)19-0097-04

0 引言

随着校园网内用户数量和业务量呈指数级的不断增长,特别是Web应用类,面临着访问者数量快速增加的挑战。即便使用高性能的硬件配比,当遇到请求具有突发性时,网络、CPU、I/O等处理能力会急剧上升达到一定的瓶颈。单台服务器的整体性能总是有限的,一台服务器所能提供的并发访问处理能力大约为1 000~5 000个。

目前在Web应用类环境中,client与server建立链接有几种状态:服务请求无状态保持、服务请求有状态保持、保持用户会话一致性、保持连接一致性。实际校园Web应用环境中,大多数是基于有状态、保持用户会话一致性的链接,比如:学生选课、评教、录取、成绩查询等Web业务。为了满足这种高并发[1]、突发性的需求,同时彻底解决在某些场景中出现IP访问倾斜、丢失、负载不均衡问题,本文提出了基于Nginx+sticky实现cookie负载均衡的建设方案,选用多台服务器(节点)共同处理用户请求,并采取一系列策略和技术来应对,以提高系统的高流量、可用性、可扩展性和容错性。

1 Nginx 介绍及负载均衡方式

1.1 Nginx 介绍

Nginx[2]是一款高性能的开源Web服务器和反向代理服务器。它在处理静态资源、负载均衡、反向代理、HTTPS等方面表现出色。Nginx的设计目标是提供高性能、稳定性、热部署、模块化设计、低资源消耗和灵活性,以适应于现代网络环境中构建大规模访问、可伸缩性强的Web应用和负载的需求。综合来说,其强大的特性和灵活性被广泛用于互联网、企业、高校等不同的场景中。同时,持续对Nginx综合的性能、日志、配置、安全性、负载均衡等方面进行分析,也有助于优化系统的运行和提高服务的可用性。

1.2 负载均衡方式

Nginx为 HTTP、TCP 和 UDP 提供多种负载均衡方式[3],所有这些方式都能够选1525d41453faed8488ed5991ec53a2579f52b40cd75dc069466a476d6dd60040择分配到每个上游服务器的流量权重。选择适当的负载均衡方式取决于应用需求。一些常见的负载均衡方式包括:

1) Round Robin(轮询,默认使用)——可按顺序在上游服务器之间分发请求。

2) 最少连接——向活跃连接数最少的服务器转发请求。

3) 最少时间——基于响应时间和活跃连接数进行综合计算,将请求转发到负载最小的服务器;这是Nginx可提供的独特功能。

4) Hash(哈希)——根据特定的键值分发请求(如客户端IP地址或请求URL) 。若上游服务器集群发生变化,Nginx可以通过应用一致的哈希值来尽量减少负载的重新分配。

5) IP Hash(仅限 HTTP) ——根据客户端IP地址的前三个八位字节进行请求分配。

6) Random with Two Choices—— 随机选择两台服务器并将请求转发到活动连接数较少的服务器,即“最少连接”算法。通过使用Nginx还可以通过“最少时间”算法优化使用效果。

2 基于Nginx+sticky实现cookie负载均衡的建设

2.1 基于Nginx+sticky 实现cookie负载均衡的建设方案

负载均衡是在大规模网络和应用环境中,用于多台服务器之间分配请求,以确保提高性能、流量、扩展以及有效资源利用率的关键工具。在不同场景中,客户与Web应用端建立链接时,大多数是基于服务请求有状态保持、保持用户会话一致性(用户登录状态)的会话方式[4],例如教务、学工、请销假、实训等Web业务。为了彻底解决在某些场景中出现的IP访问倾斜、丢失、负载不均衡、session不能跨服务器等问题,并根据应用中的实际情况,本文提出基于Nginx+sticky实现cookie负载均衡的建设方案,可以根据具体需求选择合适的负载均衡机制,来实现负载均衡策略[5]。