【问题标题】:Load balancing server, how can I implement it?负载均衡服务器,我该如何实现呢?
【发布时间】:2015-10-19 11:20:03
【问题描述】:
我在谷歌上搜索了负载平衡,但我唯一能找到的是工作理论,目前,这对我来说是“简单”的部分。但是如何实现一个的零个例子。
我有几个关于负载平衡的问题:
我有一个域 (example.com),在它后面我有一个负载平衡服务器(我们称之为 A),根据理论,它会要求客户端关闭与 A 的连接,并连接到 B(子服务器)并与 B 进行请求。客户端在 Web 浏览器中是否会停止在地址栏中看到“example.com/page.html”并开始看到“ B_ip_address/page.html”代替?
如何从头实现一个简单的负载均衡器?我的疑问针对的是 HTTP 部分。是否有一些特定的消息或一组消息我需要发送给客户端,这将使他与我断开连接并连接到子服务器?
比 HTTP 更低级别的协议,例如 TCP/IP,是否有任何标准数据包告诉客户端他刚刚连接到负载平衡器服务器,现在他需要连接到 xxx.xxx.xxx。 xxx 进行请求?
什么方法最常用? (1) 客户端连接到负载均衡服务器,它要求客户端直接连接到其中一个子服务器,或者 (2) 负载均衡服务器开始将客户端的所有流量桥接到子服务器,反之亦然以透明的方式?
所以问题 2、3 和 4 是关于负载平衡协议,第一个问题是域名可以连接到负载平衡器的方式以及潜在的后果。
【问题讨论】:
标签:
java
servlets
network-programming
load-balancing
internal-load-balancer
【解决方案1】:
您的方法是一种通过将调用重定向到另一台服务器的静态负载平衡。以下所有调用都可能使用此其他服务器或再次发送到负载均衡器进行重定向。
实施取决于您的系统的实施。负载均衡器最适合没有会话状态的独立请求。您需要在“结束”服务器之间同步会话状态。或者使用共享会话存储向所有服务器提供会话状态。
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
IP 地址范围轮换。大多数 HTTP 负载均衡器作为透明负载均衡器工作,如 nginx 或其他反向代理实现。我认为重定向负载均衡器更像是一种低技术实现。
TCP/IP 不是协议。它是用于传输实现特定通信协议的数据的传输层。而 TCP/IP 本身是网络组件的协议。但不是应用程序。您可以查看https://en.wikipedia.org/wiki/OSI_model。