Nginx 循环调度,也不完全是循环调度

Nginx 循环调度,也不完全是循环调度

我有一个非常基本的循环反向代理设置,用于学习目的。

upstream file_server_com {
    server machine-01;
    server machine-02;
}

server {
        listen 80 default_server reuseport;
        listen [::]:80 default_server ipv6only=on reuseport;

        root /usr/share/nginx/html;
        index index.html index.htm;

        server_name localhost;

        location / {
            proxy_pass http://file_server_com;
        }
}

我在每个上游服务器上都有一个 1kb 的文件。我运行 wget 来下载文件。我没有看到机器 01 和 02 之间的请求来回切换。总的来说,我确实看到两者之间大约 50/50 的分配,但我认为我应该看到请求在两台机器之间交替。

有时我会看到机器 01 连续收到请求,有时我会看到机器 02 连续收到请求,有时它们交替出现。

我对 nginx 的循环负载均衡器有什么不明白吗?

答案1

您可以尝试强制 nginx 考虑所有具有相同权重的服务器:

upstream file_server_com {
    server machine-01 weight=1;
    server machine-02 weight=1;
}

这可能有助于灌输正确的算法。

或者使用least_conn 属性如果无法获得循环。至少应选择最不繁忙的服务器。

但根据这个答案当多个线程运行时,nginx 似乎以不同的方式处理循环。“解决方案”是设置

worker_processes 1;

但这可能会降低性能。

答案2

我们在 nginx/1.13.7 的 roud roubin 模块中看到了类似的行为。借用您的示例,我们注意到发送到 的请求比例machine-01高于machine-02

最初,我们认为nginx-sticky-模块-ng可能会导致分布不均。但我们注意到粘性会话只会加剧潜在问题。

我们可以使用 curl 测试请求,而无需保留路由 cookie,这会在每个请求上触发 nginx 的默认轮询。通过计算每个上游的路由 cookie 数量,我们可以衡量哪些区域受到青睐——从上到下,上游列表中的第一个服务器似乎获得更多流量。

我们仍在尝试了解这种情况发生的原因和方式。目前,我们正在尝试通过调整weight每个上游服务器中的参数来解决这个问题。

相关内容