使用nginx实现服务反向代理实现负载均衡

对外提供网络接口服务,当单机容量达到极限时,可以从业务拆分和分布式部署两个方面进行分析,来解决接口访问量大,并发量高,海量数据的问题。从单机到分布式,很重要的区别是业务拆分和分布式部署。应用拆分是将不同的算法按业务需求拆分到不同的服务器上,但是每个部署的独立业务还存在单点问题和访问统一入口问题。为解决单点故障,我们可以采取冗余的方式,将相同的应用部署到多台机器上。解决访问统一入口问题,我们可以在集群前面增加负载均衡设备,实现流量分发,我们使用nginx进行负载均衡。

nginx 反向代理(负载均衡)示意图,对于服务器集群,反向代理将其访问接口统一,用户不用关心具体使用哪一台服务器,反向代理会自动将接口调用请求进行分发。

安装nginx nginx中文网

参照此安装流程安装即可,注意在第五步的时候,增加 - -with-http_v2_module, 才能支持grpc

配置nginx.conf

以下为测试实例:

在本机的8008和8009两个端口分别启动了tf_serving, 对外统一暴露为本机80端口


http {
    client_max_body_size 20m; // 注意当使用tf_serving时,一般会传图片等内容,会大于nginx上传文件大小限制,会报413 Request Entity Too Large,因此需要修改大小
    client_header_buffer_size    20m;
    large_client_header_buffers  4 2m;
    upstream grpcservers {
         server 0.0.0.0:8008; 
         server 0.0.0.0:8009;
     }

    server {
       listen 80 http2;

       location / {
          grpc_pass grpc://grpcservers;
          error_page 502 = /error502grpc;
       }

       location = /error502grpc {
          internal;
          default_type application/grpc;
          add_header grpc-status 14;
          add_header grpc-message "unavailable";
          return 204;
      }
   }

}

测试分布式服务

如上述,使用nginx将8008和8009两个端口的tf_serving服务统一暴露为本机80端口提供对外调用接口,推理代码使用Django框架, tf_serving 端口设置为80端口:

基于Django进行测试,可以看出两个GPU的使用率基本平衡, 默认负载流量1:1分配:

设置流量1:3

GPU使用率大致符合1:3: