Skip to main content

网络数据吞吐能力

目标#

  • 提升系统的网络数据吞吐能力

前提#

对于静态资源文件(如 HTML、CSS、JavaScript、图片等)或稳定数据(如行政区数据)的网络传输速度的提高,可以通过 CDN 服务实现。本章节的内容主要针对在固定带宽的服务器系统上提升动态数据的网络传输速度。

实现原理#

当使用固定带宽的服务器时,根据前一章节的部署方式,系统整体的网络数据吞吐能力将受限于负载均衡服务器的带宽。在不改变单台服务器的网络带宽的前提下,可以按如下图所示的部署方式对前一章节的部署方式进行改造,提高系统整体的网络数据吞吐能力。

选择服务器

如上图所示,在客户端发送业务请求前,会先向经过负载均衡服务器发送一个应用服务器路由请求,该请求转发给应用服务器后,应用服务器会在响应数据中返回自己的域名,在后续请求中客户端均以该域名作为请求的主机名,从而使得系统整体的网络数据吞吐能力不再受限于负载均衡服务器。

由于转发规则是在负载均衡服务器中定义的,所以应用服务器可以从负载均衡服务器转发的请求的头信息中取得相应的域名,也就是说应用服务器之间不存在配置或实现上的差异。

但是按以上方式部署后系统的容错性将下降,一旦某一应用服务器发生故障,客户端的所有后续请求将无法被正确处理。为使客户端不必再次发送请求选择应用服务器,可以按如下图的方式进一步改进。

二级负载均衡

改进后的架构增加了二级负载均衡服务器,需要注意的是,此时二级负载均衡服务器后端的应用服务器共享同一个域名。

NginX 配置#

假设有如下服务器实例

内网 IP 地址用途域名服务进程及端口
10.0.0.1负载均衡服务器api.proding.netnginx:80
10.0.0.2二级负载均衡服务器#1api-01.proding.netnginx:80
10.0.0.3二级负载均衡服务器#2api-02.proding.netnginx:80
10.0.0.4应用服务器#1 node:3000
10.0.0.5应用服务器#2 node:3000
10.0.0.6应用服务器#3 node:3000

负载均衡服务器的 NginX 配置

# 定义应用服务器列表
upstream api.proding.net {
ip_hash;
server 10.0.0.2:80;
server 10.0.0.3:80;
}
# HTTP 服务
server {
listen 80;
server_name api.proding.net;
location / {
proxy_pass http://api.proding.net;
proxy_next_upstream http_500 http_501 http_502 http_503 http_504;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}

二级负载均衡服务器#1/2的 NginX 配置

# 定义应用服务器列表
upstream api.proding.net {
ip_hash;
server 10.0.0.4:3000;
server 10.0.0.5:3000;
server 10.0.0.6:3000;
}
# HTTP 服务
server {
listen 80;
server_name api.proding.net
api-01.proding.net; # 二级负载均衡服务器#2时为“api-02.proding.net”
location / {
proxy_pass http://api.proding.net;
proxy_next_upstream http_500 http_501 http_502 http_503 http_504;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Domain-Name "api-01.proding.net"; # 二级负载均衡服务器#2时为“api-02.proding.net”
}
}

应用服务器中的服务进程接收到客户端的路由请求后取得由二级负载均衡服务器设置的 X-Domain-Name 请求头数据并将其返回给客户端。