负载均衡服务器,我该如何实现?

Load balancing server, how can I implement it?

我在谷歌上搜索了负载平衡,但我唯一能找到的是工作理论,目前,对我来说是 "easy" 部分。但是如何实现一个的例子为零。

我有几个关于负载平衡的问题:

  1. 我有一个域 (example.com),我在它后面有一个负载平衡服务器(我们称之为 A),根据从理论上讲,将要求客户端关闭与 A 的连接,并连接到 B,一个子服务器并继续与 B 的请求。客户端是否会在 Web 浏览器中停止在地址中看到 "example.com/page.html"栏并开始看到 "B_ip_address/page.html"?

  2. 如何从头开始实现一个简单的负载均衡器?我怀疑针对 HTTP 部分。我是否需要向客户端发送一些特定的消息或一组消息,这将使他与我断开连接并连接到子服务器?

  3. 比 HTTP 更底层的协议呢,例如 TCP/IP,是否有任何标准数据包告诉客户端他刚刚连接到负载均衡服务器,现在他需要连接到xxx.xxx.xxx.xxx 进行请求?

  4. 什么方法用的最多? (1) 客户端连接到负载均衡服务器,它要求客户端直接连接到其中一个子服务器,或者 (2) 负载均衡服务器开始桥接从客户端到子服务器的所有流量,反之亦然以透明的方式?

所以问题 2、3 和 4 关于负载平衡协议,第一个问题是域名可以连接到负载平衡器的方式,以及潜在的后果是什么。

您的方法是一种通过将调用重定向到另一台服务器的静态负载平衡。以下所有调用可能会使用此其他服务器或再次发送到负载平衡器以进行重定向。

实现取决于您的系统的实现。负载均衡器最适合没有会话状态的独立请求。您需要在 "end" 服务器之间同步会话状态。或者使用共享会话存储为所有服务器提供会话状态。

存在一个简单透明的 HTTP 服务器负载平衡解决方案。您可以使用 nginx 服务器 (http://nginx.org/en/docs/http/load_balancing.html) 的负载平衡模块。这可用于 HTTP 和 HTTPS 请求。如果负载增加,它可能会动态扩展额外的服务器。您需要编辑 nginx 配置并重新启动服务器。这对现有连接可以是透明的。而且nginx不会导致更改域名或主机名的问题。

其他协议需要客户端和服务端的一些支持。如果客户端和服务器之间有专用设备,则负载平衡可能是透明的。或者通信协议需要支持连接重定向。

编辑: 负载均衡也可以通过 DNS round robin 来实现。每个 DNS 查找调用 returns 同一域名的另一个 IP 地址。客户端选择一个 IP 并连接到该服务器。另一个客户端可以使用下一个 IP。地址栏名称始终相同

示例:

Non-authoritative answer:
Name:    www.google.com
Addresses:  2a00:1450:4001:80f::1010
      173.194.116.209
      173.194.116.210
      173.194.116.212
      173.194.116.211
      173.194.116.208

Non-authoritative answer:
Name:    www.google.com
Addresses:  2a00:1450:4001:80f::1010
      173.194.116.210
      173.194.116.212
      173.194.116.211
      173.194.116.208
      173.194.116.209

Non-authoritative answer:
Name:    www.google.com
Addresses:  2a00:1450:4001:80f::1010
      173.194.116.212
      173.194.116.211
      173.194.116.208
      173.194.116.209
      173.194.116.210

IP地址范围轮换。大多数 HTTP 负载平衡器作为透明负载平衡器工作,如 nginx 或其他反向代理实现。我认为重定向负载均衡器是一种技术含量较低的实现。

TCP/IP 不是协议。它是用于传输实现特定通信协议的数据的传输层。而 TCP/IP 本身是网络组件的协议。但不是应用程序。您可以查看 https://en.wikipedia.org/wiki/OSI_model .