我设置了 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