Nginx-3 Nginx 的负载均衡策略

Nginx-3 Nginx 的负载均衡策略

Nginx 的负载均衡其实就是指将请求按照一定的策略转发给服务集群中的一台,提高了服务集群的可用性,解决数据流量过大、网络负荷过重的问题。

AKF 扩展立方体

image-20250616165359356

分为 3 个方向负载:

  • x 轴:增加实例数量,一般要求应用是无状态的,通过增加应用数量来提高应用程序性能和可用性,但是由于数据库等资源的限制,所以并不是无限制的
  • y 轴:基于业务功能拓展,不同的业务领域扩展成不同的应用,通过 url 或其他方式将请求转发给不同的应用,同时每个应用还可以进行 x 轴拓展
  • z轴:按数据属性分区,比如应用有多个数据中心,可以基于用户的 ip 选择比较近的数据中心进行服务

顺便一提,一般来讲,nginx 与后端应用服务通常部署在同一内网环境中,且后端服务一般是有限的,开启 keepalive 长连接对于性能(提升吞吐量,降低时延)的提升会更明显

Syntax:	keepalive connections;
Default:	—
Context:	upstreamSyntax:	keepalive_requests number;
Default:	
keepalive_requests 1000;
Context:	upstreamSyntax:	keepalive_time time;
Default:	
keepalive_time 1h;
Context:	upstreamSyntax:	keepalive_timeout timeout;
Default:	
keepalive_timeout 60s;
Context:	upstream

round-robin

策略:加权轮询访问 server 指令指定的上游服务

指令:

weight 			# 服务器权重,默认 1
max_conns 		# server 的最大并发连接数,仅作用于单 worker,默认为 0 没有限制
max_fails		# 在 fail_timeout 时间段内,允许的最大失败次数# 如果达到该次数则在 fail_timeout 这段时间内不再选择此服务器
fail_timeout	# 到达 max_fails 后,该 server 的不能再次访问时间				

配置两台 nginx

# 模拟两台后端服务
server {listen       8011;server_name  localhost;return 200 '8011 server response \n';
}server {listen 8012;server_name localhost;return 200 '8012 server response \n';
}
# 反向代理服务器
upstream rrups {server localhost:8011 weight=2 max_conns=2 max_fails=2 fail_timeout=5;server localhost:8012 weight=1;keepalive 32;
}server {listen 9001;location / {proxy_pass http://rrups;proxy_http_version 1.1;proxy_set_header Connection "";}
}

测试

[root@node-17 ~]# curl 123.207.214.107:9001
8011 server response
[root@node-17 ~]# curl 123.207.214.107:9001
8011 server response
[root@node-17 ~]# curl 123.207.214.107:9001
8012 server response
[root@node-17 ~]# curl 123.207.214.107:9001
8011 server response
[root@node-17 ~]# curl 123.207.214.107:9001
8011 server response
[root@node-17 ~]# curl 123.207.214.107:9001
8012 server response

抓下包进行分析:

tcpdump -i lo port 8011
09:14:30.666190 IP VM-16-11-centos.60192 > VM-16-11-centos.8011: Flags [S], seq 976418546, win 43690, options [mss 65495,sackOK,TS val 1034055580 ecr 0,nop,wscale 7], length 0
09:14:30.666208 IP VM-16-11-centos.8011 > VM-16-11-centos.60192: Flags [S.], seq 1448846227, ack 976418547, win 43690, options [mss 65495,sackOK,TS val 1034055580 ecr 1034055580,nop,wscale 7], length 0
09:14:30.666219 IP VM-16-11-centos.60192 > VM-16-11-centos.8011: Flags [.], ack 1, win 342, options [nop,nop,TS val 1034055580 ecr 1034055580], length 0
09:14:30.666253 IP VM-16-11-centos.60192 > VM-16-11-centos.8011: Flags [P.], seq 1:70, ack 1, win 342, options [nop,nop,TS val 1034055580 ecr 1034055580], length 69
09:14:30.666266 IP VM-16-11-centos.8011 > VM-16-11-centos.60192: Flags [.], ack 70, win 342, options [nop,nop,TS val 1034055580 ecr 1034055580], length 0
09:14:30.666349 IP VM-16-11-centos.8011 > VM-16-11-centos.60192: Flags [P.], seq 1:185, ack 70, win 342, options [nop,nop,TS val 1034055580 ecr 1034055580], length 184
09:14:30.666356 IP VM-16-11-centos.60192 > VM-16-11-centos.8011: Flags [.], ack 185, win 350, options [nop,nop,TS val 1034055580 ecr 1034055580], length 0
09:14:32.105110 IP VM-16-11-centos.60192 > VM-16-11-centos.8011: Flags [P.], seq 70:139, ack 185, win 350, options [nop,nop,TS val 1034057019 ecr 1034055580], length 69
09:14:32.105183 IP VM-16-11-centos.8011 > VM-16-11-centos.60192: Flags [P.], seq 185:369, ack 139, win 342, options [nop,nop,TS val 1034057019 ecr 1034057019], length 184
09:14:32.105192 IP VM-16-11-centos.60192 > VM-16-11-centos.8011: Flags [.], ack 369, win 359, options [nop,nop,TS val 1034057019 ecr 1034057019], length 0
09:15:32.159360 IP VM-16-11-centos.60192 > VM-16-11-centos.8011: Flags [F.], seq 139, ack 369, win 359, options [nop,nop,TS val 1034117073 ecr 1034057019], length 0
09:15:32.159429 IP VM-16-11-centos.8011 > VM-16-11-centos.60192: Flags [F.], seq 369, ack 140, win 342, options [nop,nop,TS val 1034117073 ecr 1034117073], length 0
09:15:32.159439 IP VM-16-11-centos.60192 > VM-16-11-centos.8011: Flags [.], ack 370, win 359, options [nop,nop,TS val 1034117073 ecr 1034117073], length 0

分析 TCP 标志位

只在最开始 [S] [S.] [.] (syn syn-ack ack)建立了一次连接,两次请求复用了同一个连接,1分钟后连接断开

hash

ip_hash

策略:以客户端IP作为哈希算法的关键字,映射到特定的上游服务器中。

  • 对 IPV4 地址使用前3个字节作为关键字,对于 IPV6 地址则使用完整地址
  • 可以结合 realip 模块修改用于执行算法的 IP 地址

配置:

upstream iphashups {ip_hash;server localhost:8011 weight=2 max_conns=2 max_fails=2 fail_timeout=5;server localhost:8012 weight=1;
}server {listen 9002;location / {proxy_pass http://iphashups;proxy_http_version 1.1;proxy_set_header Connection "";}
}

测试

[root@node-17 ~]# curl 123.207.214.107:9002
8011 server response
[root@node-17 ~]# curl 123.207.214.107:9002
8011 server response
[root@node-17 ~]# curl 123.207.214.107:9002
8011 server response

可以发现如果配置了 ip_hash,及时配置了 weight 权重,也一直使用同一台 server

nginx 中的 upstream_hash 模块支持指定关键字作为 hash 算法的 key,不再局限于 ip 地址

配置:

upstream hashups {hash user_$arg_username;server localhost:8011 weight=2 max_conns=2 max_fails=2 fail_timeout=5;server localhost:8012 weight=1;
}server {listen 9003;location / {proxy_pass http://hashups;proxy_http_version 1.1;proxy_set_header Connection "";}
}

测试:

[root@VM-16-11-centos nginx]# curl 123.207.214.107:9003?username=zhangsan
8012 server response
[root@VM-16-11-centos nginx]# curl 123.207.214.107:9003?username=zhangsan
8012 server response
[root@VM-16-11-centos nginx]# curl 123.207.214.107:9003?username=zhangsan
8012 server response[root@VM-16-11-centos nginx]# curl 123.207.214.107:9003?username=lisi
8011 server response
[root@VM-16-11-centos nginx]# curl 123.207.214.107:9003?username=lisi
8011 server response
[root@VM-16-11-centos nginx]# curl 123.207.214.107:9003?username=lisi
8011 server response

一致性 hash算法

当使用 hash 算法时,如果有某台上游服务宕机了,我们一般不能直接将其从 upstream 中移除,原因是简单的 hash 其实就是计算一个哈希值,对服务数量取余,如果突然增加或减少一台服务器,会有大量的正常连接受到影响,一致性 hash 算法就是用来缓解这个问题的。

具体的原理可以参考这篇文章:一致性哈希

使用的话其实比较简单,在 hash 对应的 key 后加 consistent 即可

Syntax:	hash key [consistent];
Default:	—
Context:	upstream
upstream hashups {hash user_$arg_username consistent;server localhost:8011 weight=2 max_conns=2 max_fails=2 fail_timeout=5;server localhost:8012 weight=1;
}

least-conn

策略:从所有上游服务器中,找出一个当前连接数最少的,如果出现多个最少连接数相同的,就选择 round-robin 算法

配置:

upstream hashups {least_conn;server localhost:8011 weight=2 max_conns=2 max_fails=2 fail_timeout=5;server localhost:8012 weight=1;
}

random

策略:从所有上游服务器中,随机选择一台服务器来处理请求

配置:

upstream hashups {random;server localhost:8011 weight=2 max_conns=2 max_fails=2 fail_timeout=5;server localhost:8012 weight=1;
}

由于它没有考虑服务器的负载情况,通常在实际生产环境中比较少用,尤其是在需要均衡负载的场景下

值得注意的一点是,如果 nginx 启动了多台 worker 进程,需要借助共享内存使得负载均衡策略对所有 worker 进程生效

Syntax:	zone name [size];
Default:	—
Context:	upstream
This directive appeared in version 1.9.0.

另外 upstream 之间的模块也是有顺序的,文件来源 (objs/ngx_modules.c)

ngx_module_t *ngx_modules[] = {......&ngx_http_upstream_hash_module,&ngx_http_upstream_ip_hash_module,&ngx_http_upstream_least_conn_module,&ngx_http_upstream_random_module,&ngx_http_upstream_keepalive_module,&ngx_http_upstream_zone_module,......NULL
};

从上至下的顺序,worker 进程在负载均衡算法的最后会将信息维护在共享内存中:

  • 后端服务器的状态:如健康检查的结果、服务器是否可用等
  • 负载均衡算法:例如轮询、最少连接、哈希算法等
  • 请求的分配情况:nginx 会将请求分配到最合适的后端服务器上,并且通过共享内存来更新各个服务器的状态(例如连接数、响应时间等)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/85004.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/85004.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Wiiu平台RetroArch全能模拟器美化整合包v1.18

这款WiiU平台RetroArch全能模拟器美化整合包v1.18的亮点包括: 1. 18款平台完美兼容:无论你是喜欢NES时代的经典游戏,还是钟爱SNES、GBA等平台的大作,这款整合包都能满足你的需求,让你尽情畅玩游戏。 2. 三款自制主题&a…

MyBatis原理

Mybatis执行过程为:接口代理->sqlSession会话->executor执行器->JDBC操作 一、接口代理 Mybatis根据Mapper接口,动态生成相应实现类 二、SqlSession介绍 MyBatis核心对象SqlSession介绍 - MyBatis中文官网 三、Executor执行器介绍 精通My…

升级内核4.19-脚本

#bash cd /root yum remove -y kernel-tools-3.10.0-1160.el7.x86_64 yum remove -y kernel-tools-libs-3.10.0-1160.el7.x86_64tar -xvf rhel-7-amd64-rpms.tar.gz cd /root/rhel-7-amd64-rpms #安装依赖、包括socat&conntrack yum localinstall -y *.rpm --skip-broken#升…

全面理解 JVM 垃圾回收(GC)机制:原理、流程与实践

JVM 的 GC(Garbage Collection)机制是 Java 程序性能的关键支柱。本文将从堆内存布局、回收原理、GC 算法、流程细节、并发收集器机制等维度,系统讲清楚 GC 的底层运作原理和优化思路。 一、JVM 堆内存结构 Java 堆是 GC 管理的主要区域&am…

runas命令让其他用户以管理员权限运行程序

RUNAS 用法: RUNAS使用示例: runas /noprofile /user:mymachine\administrator cmd #本机Administrator管理员身份执行CMD,/noprofile为不加载该用户的配置信息。runas /profile /env /user:mydomain\admin “mmc %windir%\system32\dsa.msc” #本机上…

实战指南:部署MinerU多模态文档解析API与Dify深度集成(实现解析PDF/JPG/PNG)

MinerU web api部署 MinerU 能够将包含图片、公式、表格等元素的多模态 PDF、PPT、DOCX 等文档转化为易于分析的 Markdown 格式。 克隆 MinerU 的仓库 git clone https://github.com/opendatalab/MinerU.gitcd 到 projects/web-api cd projects/web-api在可以科学上网的情况下…

向量外积与秩1矩阵的关系

向量外积与秩1矩阵的关系 flyfish 向量外积是构造秩1矩阵的基本工具,其本质是用两组向量的线性组合刻画矩阵的行和列相关性;任意秩1矩阵必可表示为外积,而低秩矩阵(秩 k k k)可分解为 k k k 个外积矩阵的和&#x…

设计模式-创建型模式(详解)

创建型模式 单例模式 一个类只允许创建一个对象,称为单例。 单例体现:配置类、连接池、全局计数器、id生成器、日志对象。 懒汉式 (线程不安全) 单例:【不可用】 用到该单例对象的时候再创建。但存在很大问题,单线程下这段代…

什么是BI?有哪些应用场景

BI(Business Intelligence,商业智能)是通过技术手段对海量业务数据进行采集、整合、分析和可视化的过程,旨在帮助企业从数据中获取洞察,支持决策。其核心是通过工具(如Quick BI)将原始数据转化为…

从零开始:使用Vite和Vue.js搭建一个空项目

进入node.js官网 https://nodejs.org/zh-cn 下载node.js 点击进行安装, 完成之后,按住shift鼠标右键,打开powershell窗口 输入node -v ,出现版本号就是成功了 node -v 接下来,打开设置,搜索开发者设置&…

Redis 核心数据类型及典型使用场景详解

在日常开发中,Redis 不仅是缓存利器,更是一套高性能的数据结构服务。你是否真的了解 Redis 提供的五种核心数据类型?它们各自的底层结构和适用场景又有哪些差异?本篇博客将深入解析 Redis 的数据类型及其典型应用,助你…

threejs webVR获取相机正前方向量

通常获取相机正前方可以使用camera.getWorldDirection(new Vector3()) 函数来得到,但是在threejs0.139.2版本中进入VR后使用上面函数获取的数据是固定不变的,不管是否旋转了头盔,经过一番研究发现必须使用renderer.xr.getCamera() 此函数获取…

华为OD-2024年E卷-字符统计及重排[100分] -- python

问题描述: 给出一个仅包含字母的字符串,不包含空格,统计字符串中各个字母(区分大小写)出现的次数,并按照字母出现次数从大到小的顺序输出各个字母及其出现次数。如果次数相同,按照自然顺序进行排序,且小写…

MCP(模型上下文协议)协议和Http协议对比

MCP(Model Context Protocol,模型上下文协议)和 HTTP(HyperText Transfer Protocol,超文本传输协议)是两种定位完全不同的协议,主要区别如下: 1. 核心定位 HTTP 通用网络通信协议&am…

C++打印乘法口诀表

int main()​​&#xff1a; 这是C 程序的入口点。每个C 程序都必须有一个 main 函数&#xff0c;程序从这里开始执行。 ​​外层 for 循环​​&#xff1a; for (int i 1; i < 10; i) { int i 1&#xff1a;定义并初始化循环变量 i 为 1。这里的 i 代表乘法表中的行…

RoGBAG 与 MCAP

RoGBAG 和 MCAP 都是机器人领域常用的二进制数据格式&#xff0c;用于存储传感器数据、控制命令和状态信息。两者主要区别在于&#xff1a; RoGBAG&#xff1a;ROS 1/2 的标准日志格式&#xff0c;采用 LZF/LZ4 压缩&#xff0c;适合中小型数据集 MCAP&#xff1a;新一代机器人…

Ubuntu 空间占用情况排查常用命令

查看当前目录总大小及子目录占用详情 du -sh * | sort -hr ​​du​​&#xff1a;磁盘使用统计命令​​-s​​&#xff1a;显示每个参数的总计&#xff08;不递归子目录&#xff09;​​-h​​&#xff1a;以人类可读格式&#xff08;KB/MB/GB&#xff09;显示​​*​​&…

C语言编译优化实战与技巧

一.概述 1.C语言编译优化介绍 C语言编译优化是提升程序性能的核心手段&#xff0c;涉及从源代码到机器码的多层次转换&#xff0c;下面从优化级别、常用技术、内存管理、指令调度等多个维度详细介绍。 2.编译器优化等级&#xff08;GCC/Clang&#xff09; 二.常用优化技术 1…

Seq2Seq理解

Seq2Seq理解 写在前面&#xff1a;学习Seq2Seq由于前面底子没打好导致理解起来非常困难&#xff0c;今天索性全部搞懂逻辑部分&#xff0c;后续我会把所学的一些算法全部以理解代码的形式发布出来&#xff0c;课程代码内容全部来自李沐老师的视频&#xff0c;再次感谢&#xf…