我问了这个问题这里首先。最终我被建议在这里询问。
我正在开发一个使用服务器端的软件澳大利亚安全情报机构用于客户端和服务器之间的 TCP 套接字通信。所有操作均使用 C++ 完成,因为该软件用于极快的低延迟数据传输。我需要能够在服务器的不同实例(进程)之间分配传入的客户端连接。因此我学到了一个新术语 -负载均衡器。现在,因为我使用 C++ 和 ASIO,我开始寻找可用的开源库。我发现这我的理解是,这是一个代理服务器,它充当客户端和服务器之间的连接中介。也就是说,它在两者之间架起了一座桥梁。
我有以下问题:
所有的代理服务器都是这样工作的吗?
是否可以创建一个代理服务器(或负载平衡器),仅将传入连接重定向到服务器实例,而不作为活动连接期间开放套接字流量的中介?
再次,我最终想要的是我的负载均衡器从客户端获取传入的连接请求,然后“告诉”我的服务器获取该连接信息(例如 IP 地址),然后继续在服务器和客户端之间建立直接连接。
答案1
“正常”负载均衡器/ADC(F5 BIG-IP、Citrix Netscaler 等)将代理连接。
您需要的是 GSLB(或类似的)基于 DNS 的负载平衡技术(而非 DNS 轮询)。我知道 F5 和 A10 也都有 GSLB 实现,我相信还有很多其他的。
它的基本工作原理是,您将拥有一个盒子,其工作是监控服务器,并使用客户端应访问的服务器的 IP 响应来自客户端的 DNS 查询。您将拥有正常的内部(或外部)DNS,但随后您将部分DNS范围委托给GSLB盒子。
从功能上讲,您的客户端将尝试通过名称进行连接,它将查询您的 DNS 服务器,然后该服务器会将客户端发送到 GSLB 盒以获取答案。GSLB 盒将使用其认为最合适的服务器(或下一个,或者您已配置的任何服务器)来响应 DNS 查询。客户端将继续访问同一 IP 以获取该记录的 TTL,此时它将重新查询 GSLB 盒。
在这方面,负载平衡永远不会介于客户端和服务器之间,它只是告诉客户端要去哪里。客户端和服务器都不需要知道这件事发生的情况。就客户端而言,这只是一个 DNS 查询,它不需要知道这是一个条件查询。