我们在 NGINX Plus R5 中引入了 TCP 负载均衡,并不断在后续版本中添加新功能以及 UDP 负载均衡支持。本文探讨了 TCP 负载均衡的关键要求以及 NGINX Plus 如何满足这些要求。
为了探讨 NGINX 的功能,我们将使用一个简单的测试环境,来代表具有可扩展数据库后端的应用的关键组件。有关构建该测试环境的完整说明,请参阅附录。
在该环境中,NGINX 充当数据库服务器的反向代理,监听 MySQL 默认端口 3306。这为客户端提供了一个简单的接口,同时后端 MySQL 节点可以向外扩展(甚至脱机),且不会对客户端产生任何影响。我们将 MySQL 命令行工具用作客户端,代表测试环境中的前端应用。
本文描述的许多功能都适用于 NGINX 开源版和 NGINX Plus。为简单起见,我们全文只提 NGINX,并明确指出 NGINX 开源版不具备的功能。
我们将探讨以下用例:
TCP 负载均衡
在为任何应用配置负载均衡之前,我们最好先了解应用是如何连接到数据库的。我们的大多数测试都使用 mysql(1)
命令行工具连接 Galera 集群、运行查询,然后关闭连接。然而,许多应用框架都使用连接池来最大限度地减少延迟并高效利用数据库服务器资源。
TCP 负载均衡在 stream 配置上下文中进行配置,因此我们在 nginx.conf 主文件中添加了一个 stream
块来创建基本的 MySQL 负载均衡配置。
stream {
include stream.conf;
}
这可以将我们的 TCP 负载均衡配置与主配置文件分隔开来。然后我们在与 nginx.conf 相同的目录下创建 stream.conf。请注意,默认情况下,conf.d 目录是留给 http
配置上下文的,因此无法向该目录添加 stream
配置文件。
upstream galera_cluster {
server 127.0.0.1:33061; # node1
server 127.0.0.1:33062; # node2
server 127.0.0.1:33063; # node3
zone tcp_mem 64k;
}
server {
listen 3306; # MySQL default
proxy_pass galera_cluster;
}
首先,我们定义一个名为 galera_cluster 的上游组,其中包含 Galera 集群中的三个 MySQL 节点。在我们的测试环境中,它们都支持在本地主机上通过唯一的端口号进行访问。zone 指令定义了所有 NGINX worker 进程共享的内存容量,以维持负载均衡状态。Server{} 块配置了 NGINX 处理客户端的方式。NGINX 监听 MySQL 默认端口 3306,并将所有流量转发到在上游
块中定义的 Galera 集群。<