我有 2 台服务器 (S1、S2),IP 为 1.1.1.1 和 1.1.1.2,我想将流量负载均衡到www.example.com
它们上面。我打算在 1.1.1.3 处有一台机器作为负载均衡器:dnsexample.com
将指向 1.1.1.3,LB 将重定向到 1.1.1.1 或 1.1.1.2。
问题:Web 浏览器客户端将 1Mb 文件发送到example.com
。该文件在到达 S1 之前是否完全经过 LB ?我的意思是所有数据包是否都从客户端传输到 LB 再到 S1 ?或者是否像这样发生:Web 浏览器请求example.com
,DNS 返回 IP 1.1.1.3(LB),然后对于第一个数据包,LB 告诉客户端“嘿,改为与 1.1.1.1 通信”,因此 Web 浏览器将其所有 http 数据包发送到 S1 1.1.1.1,因此 LB 仅接收总流量的 0.001%?
另一种可能性是,我们假设该请求在 CPU/数据库访问等方面很大,因此负载均衡器不会处理该请求(而只是传输它),即使它吸收了所有的流量,它仍然会有用
我希望事情如我所说发生,但我对 http 协议了解不够,无法回答;我看到一些商业硬件可以做到这一点,这就是为什么我想知道是否存在纯软件解决方案。
我不是英语母语者,我想我的问题非常简单,所以如果它看起来很复杂,请不要犹豫,让我重新表述:)
答案1
负载平衡有多种类型。您可以拥有多个公共 IP,这些 IP 在 DNS 记录中可见。每个 IP 都可以直接指向服务器。然后客户端将在它们之间进行选择,并且客户端可以在它们之间进行故障转移。如果您将故障转移留给客户端,则不应过分依赖服务器之间的故障转移。
您可以通过不在所有 DNS 请求中分发所有公共 IP 来调整上述情况。不分发所有公共 IP 的原因有多种:
- 可能会有太多这样的情况,以致 DNS 回复变得太大。
- 您可能希望对负载去向有更多的控制。
- 您可能希望将用户引导至地理位置更接近他们的服务器。
- 您可能希望停止向客户告知当前已停止服务的公共 IP。
上述方法通常被称为基于DNS的负载平衡。
在链的下一层,您的公共 IP 可以是虚拟 IP,可以在不同的硬件单元之间迁移。每个虚拟 IP 一次只能路由到一个硬件,因此在这一层拥有比公共 IP 地址更多的设备是没有意义的。
这种虚拟 IP 通常用于实现可用性,作为负载平衡解决方案它们不是很灵活。
在下一层,您可以拥有一个传统的负载均衡器。负载均衡器接收来自客户端的请求并将其转发到服务器池。从客户端到服务器的所有流量都必须经过负载均衡器,但负载均衡器需要执行的处理可能非常轻松。
这一层负载均衡器可以以两种不同的模式运行。它们可以以传统代理模式运行,在传统代理模式下,客户端和负载均衡器之间使用一个 TCP 连接,负载均衡器和服务器之间使用另一个 TCP 连接;也可以以 DSR 模式运行,在 DSR 模式下,TCP 连接终止于负载均衡器后面的服务器上。
在代理模式下,负载均衡器不仅要处理来自客户端的所有数据包。它还必须处理从服务器返回到客户端的所有数据包。并且负载均衡器需要一个具有缓冲和重传功能的完整 TCP 堆栈。
在 DSR 模式下,负载均衡器只需要对来自客户端的每个连接进行简单的连接跟踪。这大大减少了负载均衡器的内存使用量。这也意味着从服务器到客户端的数据包不必经过负载均衡器,而是直接发送到客户端(途中显然要经过路由器)。此属性是此模式称为“直接服务器返回”的原因。
DSR 模式的缺点是网络配置稍微复杂一些。从负载均衡器到服务器的数据包不能仅依靠普通的路由。由于它不会重写从客户端到服务器的数据包的目标 IP,因此它需要在较低的协议层上操纵目标地址以将数据包路由到正确的服务器或插入隧道层,以便有一个可以放置此类目标地址的层。
上述所有方法都可以叠加使用。这就是您构建一个可容纳数亿用户的网站的方法。
答案2
那么 LB 只接收总流量的 0.001%?
不。全部流量将流经负载均衡器。然后,负载均衡器将流量传递到实际目标服务器。
是的,负载均衡器是单点故障(负载均衡不是 HA)。如果您需要 HA,请购买两个负载均衡器。
答案3
负载均衡器的工作方式通常与反向代理类似。
客户端发起与负载均衡器的连接并向其发送请求。
负载均衡器接收请求并将其传递到后端节点并等待回复。
它获取回复并将其转发给原始客户端。
所以是的,所有的流量都会流过它,包括请求和响应。