HAPROXY:如何确保所有客户端只连接到一台服务器?

HAPROXY:如何确保所有客户端只连接到一台服务器?

我设置了 3 个服务器:1 个主服务器,2 个备份服务器。我使用了以下配置:

backend pg_production_backend
    option pgsql-check user pg_user
    server primary pghost.primary:5432 check on-marked-down shutdown-sessions on-marked-up shutdown-backup-sessions
    server secondary pghost.secondary:5432 check backup on-marked-down shutdown-sessions on-marked-up shutdown-backup-sessions
    server tertiary pghost.tertiary:5432 check backup on-marked-down shutdown-sessions on-marked-up shutdown-backup-sessions

当主服务器出现故障时,它可以正常工作,并且连接将转到第一个可用的备份服务器;当主服务器恢复时,连接将返回到主服务器。

当主服务器和辅服务器都宕机时,就会出现问题。连接将转到第三级服务器;当辅服务器恢复在线时,连接的客户端仍保留在第三级服务器上,新的连接将转到辅服务器。

当主连接仍处于关闭状态时,如何强制所有连接仅转到第三连接或次要连接?

答案1

这就是 haproxy 的工作方式。它不知道会话处于什么状态。空闲?等待结果?交易进行中?

您需要在客户端回收连接。

或者使用 proxysql(请注意,它比 haproxy 具有更大的性能开销)。

答案2

您可以将服务器设置为“DRAIN”状态,拒绝接受新连接。如果您没有任何持久/粘性规则,则所有连接都会很快从服务器耗尽。您可以在哈普罗西行政统计仪表板或自动实现你自己的 haproxy 代理

例如,只要您的辅助服务器可用,您的第三服务器就可以进入“DRAIN”状态,从而启动,但不允许新连接。这也适用于粘性会话,但会花费更长的时间,因为会话需要先过期。

如果您有持久设置,并且您确实想要快速摆脱用户,请将实例设置为“MAINT”模式(维护),然后再将其设置回“UP”。会引起问题对于您的用户来说,因为持久会话已经消失了!

编辑:您还可以将该non-stick选项添加到您的第三级服务器:

切勿将分配给此服务器的连接添加到 stick-table。这可以与备份结合使用,以确保备份服务器的 stick-table 持久性被禁用。

如果您的辅助或主服务器再次启动,haproxy 会提高与它们的连接的价值,并且客户端会被重定向。这也会导致您的会话持久性出现问题!

有关的:https://stackoverflow.com/questions/50408562/haproxy-prevent-stickiness-to-a-backup-server

相关内容