nginx四层负载均衡配置解析以及卡顿问题的处理

通常我们在使用nginx做代理时,不使用http协议的场景下,我们需要使用四层的负载均衡,例如在mysql和k8s场景在都是使用4层负载均衡来做代理,通常在大并发的场景下也会在七层负载前面增加四层的负载均衡

然而在nginx四层负载均衡的配置上和七层是稍有一些差别,例如在代理配置中不能在添加http协议,日志中的字段也和七层有一些区别,七层上的有些字段不能直接套用在四层上

我们接下来看下四层的配置实例,首先还是从安装开始,要使用stream模块需要安装nginx-mod-stream模块

yum install nginx nginx-mod-stream keepalived -y

在http同一层级,创建stream配置

http {
    ......
}

stream {
    log_format  main  '$remote_addr [$time_local] $status $session_time $upstream_addr $upstream_bytes_sent $upstream_bytes_received $upstream_connect_time';
    access_log  /var/log/nginx/k8s-access.log  main;
    upstream k8s-proxy {
        server   192.168.1.72:6443 weight=5 max_fails=2 fail_timeout=300s;
        server   192.168.1.73:6443 weight=5 max_fails=2 fail_timeout=300s;
        server   192.168.1.74:6443 weight=5 max_fails=2 fail_timeout=300s;
    }
    server {
        listen       16443;
        proxy_pass k8s-proxy;
    }
}

我们来看下配置内容,首先是log_format是日志的输出格式,这里需要给四层的负载均衡代理单独设置格式,不能照搬http里面的log_format,日志格式可以查看官网这里介绍:http://nginx.org/en/docs/stream/ngx_stream_log_module.html,我上面列的字段比较全,可以根据自己的需求进行删减。

remote_addr 客户端地址
time_local 访问时间和时区
status 请求状态,正常是200, 还有其他500, 502等状态码
session_time 请求会话耗时
upstream_addr 后端提供服务真实节点地址
upstream_bytes_sent 发送到后端的字节
upstream_bytes_received 接受到手段的字节
upstream_connect_time 连接到后端的时长

接着是在upstream模块内,三个后端的相关配置

weight 是权重,在轮询策略的基础上指定轮询的几率
max_fails 是在fail_timeout参数设置的时间内最大失败次数。如果在这个时间内,所有该服务器的请求都失败了,那么认为该服务器停机
fail_timeout 与max_fails结合使用,设置的时长内不再转发请求到该后端

在server模块内就是起的服务,使用的16443端口

proxy_pass 是代理的后端,k8s-proxy就是定义的后端负载服务器集群

我们通常遇到多个后端节点的其中一个节点挂掉以后,前面代理仍然会将请求转发到这个异常节点,可以将max_fails,fail_timeout参数配置上。

例如以下截图,192.168.1.72节点其实已经挂掉,从图里可以看到请求被代理转到192.168.1.72节点以后,由于节点异常又被转到102.168.1.73上,这个中间多一次转发在k8s上感觉卡顿是很明显的

企业微信截图_20240105154033.png


内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/958.html

我要评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。