使用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: