我在 IP 的 1.1.1.1 和 1.1.1.2 上有 2 个服务器(S1、S2),我想将流量负载平衡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 协议的了解不够,无法回答;我看到一些商业硬件可以做到这一点,这就是为什么我想知道是否存在纯软件解决方案。
我不是英语母语,我认为我的问题非常基本,所以如果它看起来很复杂,请不要犹豫,让我重新表述:)
Rex*_*Rex 12
所以LB只收到总流量的0.001%?
不会。所有流量都将流经负载平衡器。然后负载平衡器会将流量传递到实际的目标服务器。
是的,负载均衡器是单点故障(负载均衡不是 HA)。如果您需要 HA,请获取两个负载平衡器。
负载均衡器的工作方式通常类似于反向代理。
客户端发起与负载均衡器的连接并向其发送请求。
负载均衡器接收请求并将其传递给后端节点并等待回复。
它获取回复并将其转发给原始客户端。
所以是的,完整的流量将流过它,包括请求和响应。
有不同种类的负载平衡。您可以拥有多个公共 IP,这些 IP 在 DNS 记录中可见。这些 IP 中的每一个都可以直接指向服务器。然后由客户端在它们之间进行选择,客户端可以在它们之间进行故障转移。如果将其留给客户端,则不应过分依赖服务器之间的故障转移。
您可以通过不在所有 DNS 请求中分发所有公共 IP 来调整上述方案。不分发所有公共 IP 的原因有多种:
上述方法通常称为基于 DNS 的负载平衡。
在链的下一层,您的公共 IP 可以是虚拟 IP,可以在不同的硬件单元之间迁移。每个虚拟 IP 一次只能路由到一个硬件,因此在这一层拥有比公共 IP 地址更多的盒子是没有意义的。
此类虚拟 IP 更常用于可用性,它们作为负载平衡解决方案不是很灵活。
在下一层,您可以使用传统的负载平衡器。负载平衡器接收来自客户端的请求并将它们转发到服务器池。从客户端到服务器的所有流量都必须通过负载平衡器,但负载平衡器需要执行的处理可能非常轻。
这一层负载均衡器可以在两种不同的模式下运行。它们可以在传统的代理模式下运行,其中客户端和负载均衡器之间使用一个 TCP 连接,负载均衡器和服务器之间使用另一个 TCP 连接,或者在 DSR 模式下,TCP 连接在后面的服务器上终止负载均衡器。
在代理模式下,负载均衡器不仅要处理来自客户端的所有数据包。它还必须处理从服务器返回到客户端的所有数据包。并且负载平衡器需要一个完整的 TCP 堆栈,具有缓冲和重传功能。
在 DSR 模式下,负载均衡器只需要对来自客户端的每个连接进行简单的连接跟踪。这显着减少了负载平衡器上的内存使用量。这也意味着从服务器到客户端的数据包没有经过负载均衡器,它直接发送到客户端(显然在途中经过路由器)。此属性是此模式称为直接服务器返回的原因。
DSR 模式的缺点是网络配置有点复杂。从负载均衡器到服务器的数据包不能仅仅依赖于普通路由。由于它不会重写从客户端到服务器的数据包的目标 IP,它需要在较低的协议层操纵目标地址以将数据包路由到适当的服务器或插入隧道层以便有一个层放置这样的目的地址。
以上所有方法都可以在彼此的前面进行分层。这就是您如何构建可扩展到数亿用户的站点。