我对此进行了大量的研究和实验,但确实遇到了困难:
我正在尝试将 HAProxy 设置为高可用性环境的反向代理。进出此环境的所有流量都经过 SSL 加密,因此最初的设计是让 HAProxy 执行 SSL 终止并将流量以明文形式传递到安全区,然后再以另一种方式转换回来。到目前为止,一切顺利,有很多关于此的出色文档。
问题是这样的:单个 SSL 终止 HAProxy 盒无法处理巨大的流量,因此需要多个 SSL 终止反向代理。
好吧,我对此进行了深入研究,发现许多文章似乎都指向了正确的方向,但最终总是会得到 1 个主 HAProxy 和 1 个备份(例如,所有现有的心跳和 keepalived 解决方案,例如这里和这里),或者完全忽略 SSL 终止,并讨论将 DNS 循环用于您的负载均衡器。
所以我想我真正想要的是多个 haproxy ssl 终端盒能够同时共享负载的能力。有没有办法在 DNS 轮询之外做到这一点?
我想我认为有一种方法可以让它们共享相同的虚拟 IP 地址,并同时在它们之间分配流量,就像集群一样。如果一个盒子出现故障,那么可以使用上述 keepalived 方法或其他方法解决故障转移问题。这似乎不是一个常见的用例……有可能吗?
(当然,存在如何在 HAProxy 进程之间共享 SSL 会话的问题,但如果这不可能,在这种情况下偶尔重新建立一个新会话并不是什么大问题。)
提前致谢!
答案1
两个 haproxy 实例可以通过使用 2 个虚拟 IP 来共享负载,每个实例都是其中一个实例的主实例。循环 DNS 大致在 2 个虚拟 IP 之间平衡(因此在两个 haproxy 实例之间平衡)。此方法也适用于 SSL。不过,要仔细考虑这种主动-主动设置的一个原因是,如果一个实例无法独自应对总流量,那么如果任何一个实例发生故障,它就会超载。从根本上讲,这只能通过拥有备用的“浪费”容量或接受暂时的性能下降来解决。
或者,您可以在 SSL 终止代理前面安装一个 TCP 模式下的 haproxy 平衡器。一个 TCP 会话将坚持到后端,因此您无需过多担心重新协商。