我调查了 mod_proxy_balancer 和优雅重启的行为。我发现,几乎所有关于负载平衡的设置都需要 A) 重新启动而不是正常重启,或者 B) 给平衡器一个新的 id,然后进行正常重启才能生效。
我将提供一个例子。假设我们有一个这样配置的负载均衡器:
<VirtualHost 22.11.22.11:443>
ServerName Hostname
ProxyHCExpr isok {hc('body') =~ /==welcome ok1==/}
ProxyHCTemplate template1 hcinterval=1 hcexpr=isok hcmethod=get hcuri=/healthcheck.php
ProxyHCTemplate template2 hcinterval=1 hcexpr=isok hcmethod=head hcuri=/head_check.php
<Proxy balancer:mybalancer>
BalancerMember https://www.backend1.com:443 hctemplate=template1
BalancerMember https://www.backend1.com:443 hctemplate=template1
</Proxy>
<VirtualHost>
如果我们想将健康检查模板更改为“template2”,则此配置不起作用:
<VirtualHost 22.11.22.11:443>
ServerName Hostname
ProxyHCExpr isok {hc('body') =~ /==welcome ok1==/}
ProxyHCTemplate template1 hcinterval=1 hcexpr=isok hcmethod=get hcuri=/healthcheck.php
ProxyHCTemplate template2 hcinterval=1 hcexpr=isok hcmethod=head hcuri=/head_check.php
<Proxy balancer:mybalancer>
BalancerMember https://www.backend1.com:443 hctemplate=template2
BalancerMember https://www.backend1.com:443 hctemplate=template2
</Proxy>
<VirtualHost>
但是相反,如果我做同样的事情并重命名平衡器,它会在正常重启后工作:
<VirtualHost 22.11.22.11:443>
ServerName Hostname
ProxyHCExpr isok {hc('body') =~ /==welcome ok1==/}
ProxyHCTemplate template1 hcinterval=1 hcexpr=isok hcmethod=get hcuri=/healthcheck.php
ProxyHCTemplate template2 hcinterval=1 hcexpr=isok hcmethod=head hcuri=/head_check.php
<Proxy balancer:myNEWbalancer>
BalancerMember https://www.backend1.com:443 hctemplate=template2
BalancerMember https://www.backend1.com:443 hctemplate=template2
</Proxy>
<VirtualHost>
正如我所说,这几乎适用于所有与负载均衡器相关的设置:
- 间隔
- 模板
- 胡里
- hcexpr
- 代理集粘性会话=
- 代理集 lbmethod=
- 代理HC模板
- 代理HCExpr
- 打开/关闭健康检查
使用 Apache v. 2.4.33 测试。
我们现在的策略是,将所有这些设置包含到一个哈希中,然后使用该哈希作为 balancer-id。像这样,每当更改其中一个设置时,平衡器都会获得一个新的 id,并且更改会起作用。这是一个好的解决方案吗?是否有人为此找到了更好的解决方法/解决方案,或者更多的见解为什么必须重命名平衡器?重启对我们来说是没有选择的..
我发现似乎与此相关的错误报告:
https://bz.apache.org/bugzilla/show_bug.cgi?id=58529
https://bz.apache.org/bugzilla/show_bug.cgi?id=49771
和:
https://bz.apache.org/bugzilla/show_bug.cgi?id=55152
在最后一个,它说它是固定的,但这个问题仍然出现在2.4.33