Nginx stream模块是连接级别的负载均衡
在Nginx的stream模块中,upstream的权重配置实现的是连接级别的负载均衡,这和http模块不同。
当客户端发起一个新的TCP连接时,Nginx根据各upstream的权重值选择其中一个upstream建立连接,之后该连接上的所有数据传输都由这个upstream处理。
核心机制
-
连接级别的负载均衡
- 当客户端与Nginx建立TCP连接时,Nginx会根据
upstream
块中配置的权重(weight
),选择一个后端服务器建立连接。 - 一旦连接建立,该连接的所有数据通信都会固定转发到同一个后端服务器。即使客户端通过此连接发送多个请求(例如通过TCP长连接),所有请求仍会由同一个后端处理。
- 当客户端与Nginx建立TCP连接时,Nginx会根据
-
权重的具体作用
- 权重(
weight
)决定了后端服务器接收新连接的比例。例如:upstream backend {server backend1.example.com weight=3;server backend2.example.com weight=1; }
- 在此配置中,
backend1
会接收约75%的新连接(3/(3+1)),backend2
接收约25%。
- 在此配置中,
- 权重通过加权轮询算法实现,Nginx会在多个连接建立时按权重比例分配后端。
- 权重(
-
与HTTP模块的区别
- 在HTTP模块(如
http
块中的upstream
)中,负载均衡可以基于请求级别(例如每个HTTP请求独立分配后端)。但stream
模块工作在传输层(TCP/UDP),不解析应用层协议(如HTTP),因此只能在连接建立时决定后端,无法针对单个请求进行负载均衡。
- 在HTTP模块(如
详细原理
-
连接建立阶段
- 客户端发起TCP连接请求到Nginx。
- Nginx根据配置的负载均衡算法(默认为加权轮询)选择一个后端服务器。
- Nginx与后端服务器建立连接,并将客户端连接绑定到此后端。
-
数据传输阶段
- 客户端通过已建立的TCP连接发送数据,Nginx仅作为代理转发数据,不会中断连接或重新选择后端。
- 如果客户端断开并重新建立连接,Nginx会再次根据权重分配新的后端服务器。
-
支持的负载均衡算法
weight
参数与轮询(round-robin
)算法配合使用。- 其他算法如
least_conn
(最小连接数)或hash
(一致性哈希)也可能影响分配逻辑,但权重仅在轮询算法中直接生效。
示例场景
- 场景1:客户端建立100个TCP连接到Nginx。
- 如果
backend1
权重为3,backend2
权重为1,则大约75个连接分配给backend1
,25个给backend2
。
- 如果
- 场景2:客户端通过单个TCP连接发送10个请求。
- 所有10个请求均由同一个后端服务器处理,Nginx不会重新分配。
总结
- 权重影响的是连接分配比例,而非单个请求。
- 适合场景:需要长连接的TCP服务(如数据库、SSH、SMTP),其中连接的建立成本较高,保持连接固定到后端更高效。
- 不适用场景:需要按请求动态分配负载的应用层协议(如HTTP短连接),此时应使用HTTP模块的负载均衡功能。