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

Ped*_*roD 8 java network-programming servlets load-balancing internal-load-balancer

我用谷歌搜索负载平衡,但我唯一能找到的是工作理论,目前,对我来说是“简单”的部分。但是如何实现一个的零示例。

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

  1. 我有一个域(example.com),在它后面我有一个负载平衡服务器(我们称之为A),根据理论,它会要求客户端关闭与 A 的连接,并连接到 B,一个子-server 并与 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 是关于负载平衡协议的,第一个问题是域名可以连接到负载平衡器的方式以及潜在的后果是什么。

Kon*_*rad 8

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

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

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

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

编辑:负载平衡也可以通过 DNS 循环实现。每个 DNS 查找调用都会返回同一个域名的另一个 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
Run Code Online (Sandbox Code Playgroud)

IP 地址范围轮换。大多数 HTTP 负载均衡器像 nginx 或其他反向代理实现一样用作透明负载均衡器。我认为重定向负载平衡器更像是一种低技术实现。

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