HAProxy URI 平衡不太平衡

HAProxy URI 平衡不太平衡

我正在尝试使用具有 URI 平衡和哈希类型一致的 HAProxy 1.4.22 在 3 个 varnish 缓存后端之间实现负载平衡。我的理解是,这永远无法实现服务器之间的完美平衡,但它应该比我看到的结果更好。

我的 HAproxy 配置的相关部分如下所示:

backend varnish
    # hash balancing
    balance uri
    hash-type consistent

    server varnish1 10.0.0.1:80 check observe layer7 maxconn 5000 id 1 weight 75 
    server varnish2 10.0.0.2:80 check observe layer7 maxconn 5000 id 2 weight 50
    server varnish3 10.0.0.3:80 check observe layer7 maxconn 5000 id 3 weight 50

我一直在通过将自己的主机文件指向新的代理服务器来进行自我测试,我甚至尝试将热门主页重新路由到平衡循环的单独后端,以将异常值从哈希平衡后端中移除,这似乎工作正常。我将 varnish1 的权重提高到 75 作为测试,但似乎没有帮助。我的负载非常不平衡,我不明白为什么会这样。

特写统计

完整统计数据

一个有趣的小知识是,如果我反转 ID,则较高的 ID 将始终获得大部分流量。为什么 ID 会影响平衡?

调整权重是件好事,但随着我网站的流量模式发生变化(我们是一个新闻网站,最受欢迎的帖子可能会迅速变化),我不想不断调整权重。我知道它永远不会达到完美的平衡,但我期望的结果比一台权重较低的服务器比另一台权重较高的服务器获得 25 倍的连接数更好。

我的目标是通过减少缓存级别的重复来减少数据库和应用服务器的负载,建议使用 HAproxy URI 平衡,但如果失衡,它对我来说根本不起作用。

有什么建议吗?

答案1

我不确定这是否有帮助,但我对同样的问题也遇到了一些困难 - 这就是我的结论;

正如您已经确定的那样,基于哈希的负载平衡永远不会给您带来完美的负载平衡。您看到的行为可以简单地解释为在同一台服务器上有几个访问量最大/访问量最大的页面 - 少数页面流量很大,而许多页面流量很少,这足以扭曲统计数据。

您的配置是使用一致性哈希。ID 和服务器权重决定了哈希条目将被定向到的最终服务器 - 这就是您的平衡受此影响的原因。文档非常清楚,即使这是一种平衡缓存的好算法 - 它可能需要您更改 ID 并增加服务器的总权重以获得更均匀的分布。

如果您采集大量唯一地址(超过 1000 个)样本,并且您访问其中的每一个地址一次 - 您应该看到,三个后端的会话计数器比您允许平衡器的“普通”流量更加相等,因为这也会受到站点流量模式的影响。

我的建议是确保对整个 URL 进行哈希处理,而不仅仅是“?”左侧的内容。这可以通过balance uri whole在配置中使用来控制。参考。haproxy 文档。如果您有许多具有相同基础但具有不同 GET 参数的 URL - 这肯定会为您带来更好的结果。

我还会考虑负载平衡如何影响缓存服务器的容量。如果它不会以任何方式有效影响冗余度 - 我不会太担心它,因为获得完美的负载平衡并不是使用 URI 哈希可以实现的。

我希望这有帮助。

答案2

我最终将配置更改如下:

backend varnish
        # hash balancing
        balance uri
        hash-type consistent

        server varnish1 64.106.164.122:80 check observe layer7 maxconn 5000 id 1 weight 75
        server varnish2 64.106.164.121:80 check observe layer7 maxconn 5000 id 715827882 weight 50
        server varnish3 64.106.164.117:80 check observe layer7 maxconn 5000 id 1431655764 weight 38

事实证明,ID 似乎非常重要,我现在已将它们分散到整个范围内,这似乎有助于平衡。如您所见,我还调整了权重。

现在得到这样的结果: 新的 haproxy 统计数据

中间服务器仍未得到充分利用,但这是我能达到的最接近平衡的服务器,而且对我的目的来说,这已经足够了。我使用 HAproxy 进行 URI 哈希处理,这样就可以添加第三个 varnish 服务器,而不会增加后端负载,而且它似乎运行良好,我发现使用 3 个 URI 平衡的 varnish 服务器与使用两个随机平衡的服务器相比,后端负载明显减少。

由此得出的结论是,ID 非常重要,应该分开,这一点我在其他任何地方都没有看到过明确说明。一旦 ID 分散开来,更改权重会有所帮助,但这仍然非常难以预测,需要大量调整和反复试验。大幅提高服务器的权重可能会导致其流量大幅下降,这是一个奇怪的结果。

相关内容