当前位置: 首页 > news >正文

Nginx之Stream(TCP/UDP)负载均衡

        Nginx 的 TCP/UDP 负载均衡是应用 Stream 代理模块(ngx_stream_proxy_module)和 Stream 上游模块(ngx_stream_upstream_module)实现的。Nginx 的 TCP 负载均衡与 LVS 都是四层负载均衡的应用,所不同的是,LVS 是被置于 Linux 内核中的,而 Nginx 是运行于用户层的,基于 Nginx 的 TCP 负载可以实现更灵活的用户访问管理和控制。

1.TCP/UDP 负载均衡

        Nginx 的 Stream 上游模块支持与 Nginx HTTP 上游模块一致的轮询(Round Robin)、哈希(Hash)及最少连接数(least_conn)负载均衡策略。Nginx 默认使用轮询负载均衡策略,配置样例如下:

stream {upstream backend {server 192.168.2.145:389 weight=5;server 192.168.2.159:389 weight=1;server 192.168.2.109:389 weight=1;}server {listen 389;proxy_pass backend;}
}

        哈希负载均衡策略可以通过客户端 IP($remote_addr)实现简单的会话保持,其可将同一 IP 客户端始终转发给同一台后端服务器。配置样例如下:

stream {upstream backend {hash $remote_addr;server 192.168.2.145:389 weight=5;server 192.168.2.159:389 weight=1;server 192.168.2.109:389 weight=1;}server {listen 389;proxy_pass backend;}
}

         哈希负载均衡策略通过指令参数 consistent 设定是否开启一致性哈希负载均衡策略。Nginx 的一致性哈希负载均衡策略是采用 Ketama 一致性哈希算法,当后端服务器组中的服务器数量变化时,只会影响少部分客户端的请求。配置样例如下:

stream {upstream backend {hash $remote_addr consistent;server 192.168.2.145:389 weight=5;server 192.168.2.159:389 weight=1;server 192.168.2.109:389 weight=1;}server {listen 389;proxy_pass backend;}
}

        最少连接负载均衡策略,可以在后端被代理服务器性能不均时,在考虑上游服务器组中各服务器权重的前提下,将客户端连接分配给活跃连接最少的被代理服务器,从而有效提高处理性能高的被代理服务器的使用率。 配置样例如下:

stream {upstream backend {least_conn;server 192.168.2.145:389 weight=5;server 192.168.2.159:389 weight=1;server 192.168.2.109:389 weight=1;}server {listen 389;proxy_pass backend;}
}

2.TCP/UDP 负载均衡的容错机制 

        Nginx 的 TCP/UDP 负载均衡在连接分配时也支持被动健康检测模式,如果与后端服务器建立连接失败,并在 fail_timeout 参数的时间内连续超过 max_fails 参数设置的次数,Nginx 就会将该服务器置为不可用状态,并且在 fail_timeout 参数的时间内不再给该服务器分配连接。当 fail_timeout 参数的时间结束时将尝试分配连接检测该服务器是否恢复,如果可以建立连接,则判定为恢复。

        配置样例如下:

stream {upstream backend {# 10s内出现3次错误,该服务器将被熔断10sserver 192.168.2.154:8080 max_fails=3 fail_timeout=10s;server 192.168.2.109:8080 max_fails=3 fail_timeout=10s;server 192.168.2.108:8080 max_fails=3 fail_timeout=10s;server 192.168.2.107:8080 max_fails=3 fail_timeout=10s;}server {proxy_connect_timeout 5s;           # 与被代理服务器建立连接的超时时间为5sproxy_timeout 10s;          # 获取被代理服务器的响应最大超时时间为10s# 当被代理的服务器返回错误或超时时,将未返回响应的客户端连接请求传递给upstream中的下# 一个服务器proxy_next_upstream on;proxy_next_upstream_tries 3;        # 转发尝试请求最多3次proxy_next_upstream_timeout 10s;    # 总尝试超时时间为10sproxy_socket_keepalive on;  # 开启SO_KEEPALIVE选项进行心跳检测proxy_pass backend;}
}

        其中的参数及指令说明如下。

  • 指令值参数 max_fails 是指 10s 内 Nginx 分配给当前服务器的连接失败次数累加值,每 10s 会重置为 0;
  • 指令值参数 fail_timeout 既是失败计数的最大时间,又是服务器被置为失败状态的熔断时间,超过这个时间将再次被分配连接;
  • 指令 proxy_connect_timeout 或 proxy_timeout 为超时状态时,都会触发 proxy_next_upstream 机制;
  • proxy_next_upstream 是 Nginx 下提高连接成功率的机制,当被代理服务器返回错误或超时时,将尝试转发给下一个可用的被代理服务器;
  • 指令 proxy_next_upstream_tries 的指令值次数包括第一次转发请求的次数。

        TCP 连接在接收到关闭连接通知前将一直保持连接,当 Nginx 与被代理服务器的两个连续成功的读或写操作的最大间隔时间超过 proxy_timeout 指令配置的时间时,连接将会被关闭。在 TCP 长连接的场景中,应适当调整 proxy_timeout 的设置,同时关注系统内核 SO_KEEPALIVE 选项的配置,可以防止过早地断开连接。 

 

相关文章:

  • Ubuntu24多版本python解释器使用
  • 基于可视化设计的低代码开发分析与应用探讨
  • VBA技术资料MF160:提取文件夹中文件的详细信息
  • 项目计划
  • 基于QT和C++实现的中国象棋
  • Cascadia Code 字体
  • 【面试八股文】谈一谈你对TCP和UDP的区别是怎么理解的?
  • 小甲鱼——字典
  • 【并发编程实战】内存模型--解决可见性和有序性的利器
  • LoRA用于高效微调的基本原理
  • 【C语言】回调函数 和 部分库函数的用法以及模拟实现
  • 深入理解 MySQL 查询分析工具 EXPLAIN 的使用
  • 【ARMv8/ARMv9 硬件加速系列 4 -- 加解密 Cryptographic Extension 介绍】
  • 通过摄像头检测步频
  • 【C语言】数组参数和指针参数详解
  • 时间复杂度分析经典问题——最大子序列和
  • 10个最佳ES6特性 ES7与ES8的特性
  • Angular2开发踩坑系列-生产环境编译
  • ERLANG 网工修炼笔记 ---- UDP
  • github从入门到放弃(1)
  • HashMap ConcurrentHashMap
  • HomeBrew常规使用教程
  • iOS编译提示和导航提示
  • Javascript编码规范
  • JavaScript学习总结——原型
  • Ruby 2.x 源代码分析:扩展 概述
  • Service Worker
  • 初识MongoDB分片
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 解析 Webpack中import、require、按需加载的执行过程
  • 开发基于以太坊智能合约的DApp
  • 前端性能优化--懒加载和预加载
  • -- 数据结构 顺序表 --Java
  • 通信类
  • 写代码的正确姿势
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • 说说我为什么看好Spring Cloud Alibaba
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • #QT(智能家居界面-界面切换)
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (3)医疗图像处理:MRI磁共振成像-快速采集--(杨正汉)
  • (6)添加vue-cookie
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (ibm)Java 语言的 XPath API
  • (Qt) 默认QtWidget应用包含什么?
  • (五)Python 垃圾回收机制
  • (新)网络工程师考点串讲与真题详解
  • (一)80c52学习之旅-起始篇
  • (转载)hibernate缓存
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .net6 webapi log4net完整配置使用流程
  • .NET未来路在何方?