![除了 DNS 之外,还有其他技术可以在负载均衡器之间分配流量吗?](https://linux22.com/image/772623/%E9%99%A4%E4%BA%86%20DNS%20%E4%B9%8B%E5%A4%96%EF%BC%8C%E8%BF%98%E6%9C%89%E5%85%B6%E4%BB%96%E6%8A%80%E6%9C%AF%E5%8F%AF%E4%BB%A5%E5%9C%A8%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E5%99%A8%E4%B9%8B%E9%97%B4%E5%88%86%E9%85%8D%E6%B5%81%E9%87%8F%E5%90%97%EF%BC%9F.png)
首先,我已经读过这个: 负载均衡器本身的高可用性
但这个问题问得还不够。
似乎 DNS 负载平衡是仅有的在负载均衡器之间分配流量的方法。(除了使用负载均衡器,如果所有流量最终都必须通过单个服务器,这显然对分配负载没有任何作用)
这似乎是对 DNS 协议的滥用。我的理解是 DNS 是为名称解析而设计的,而不是负载平衡。如果我想要一个除了循环之外更复杂的负载平衡算法怎么办?这是在负载平衡器之间分配流量的唯一方法吗?如果不是唯一的方法,还有哪些其他方法?
确实,它看起来确实运行良好,并且是所有主要公司的现行标准,对吗?
答案1
我的理解是 DNS 是为了名称解析而不是负载平衡而设计的。
对于两者,因为(几乎)所有记录都可以设置,因此对于给定的问题,客户端可以得到多个答案,然后可以自由选择它喜欢的任何项目。
这就是为什么频繁模式在回复中循环出现,以便客户端选择“第一个”项目,但每次都会有所不同。
A
当然,客户端可以实现更智能的算法,特别是对于具有和记录的到 IPv6 的过渡AAAA
,请参阅 RFC 8305“Happy Eyeballs 版本 2:使用并发实现更好的连接”,但这不再是负载平衡了。
所以这一切都取决于客户端有多少“智能”。
SRV
记录允许对任何可能通过 TCP 或 UDP 的协议进行优先级(故障转移)和权重(负载平衡)编码,并且不再需要对端口号进行硬编码。遗憾的是,浏览器从未实现它。较新的迭代是SVCB
和HTTPS
记录,它们允许类似的事情。
事实上,在当前草案中请注意这一点:
SRV 记录指定不平衡随机负载平衡的“权重”。SVCB 仅支持平衡随机负载平衡,但可以通过未来的 SvcParam 添加权重。
下列的:
如果我想要一个除了循环之外更复杂的负载平衡算法怎么办?
如今,这意味着SRV
应用程序(客户端)中的记录和一些智能。或者更智能的名称服务器,它根据外部动态因素(例如 CDN 所做的)更改其回复。
DNS 级别的负载平衡面临的基本问题是针对 TTL 量身定制的,因为某些解析器不会遵循太小的值。
您还需要记住,拥有数据的权威名称服务器只能看到客户端大多数时间使用的递归名称服务器,而不是客户端本身。因此,它的选择也受到限制。
答案2
不,DNS 不是在负载均衡器之间切换的唯一方法。
考虑一下多层负载均衡器设计. 可扩展且有弹性。
- 第 7 层有许多实例,它们为后端提供应用程序感知代理。终止 TCP 连接,可能还有 TLS。例如 HAProxy。
- 前面的第 4 层用于一致地路由数据包。例如,使用 IPVS 进行 keepalived。使用合适的一致性哈希算法,甚至可以是无状态的。
- ECMP 路由器提供冗余路径和链路的水平扩展。
- 最后,DNS 让用户可以查找服务地址。
巧妙地返回结果属于 DNS 规范的范围,因此可以实现健康检查、基于地理 IP 的结果和其他动态功能。gdnsd 是一个可以执行此类操作的权威 DNS 服务器。
但是,DNS 缓存量很大,因此更改速度很慢。客户端行为古怪且不一致,这也使得 DNS 轮询不切实际。因此,DNS 可能仅限于查找前门,即负载平衡器主机所在的正确区域。激活灾难恢复环境会造成破坏,但 DNS 更改可以切换到完全独立的基础设施。
答案3
DNS 中最基本的解决方案实际上是简单地设置多个相同类型的记录,并使用不同的值,并让名称服务器在客户端请求该资源记录时将它们全部返回给客户端。
这种效果通常称为轮询 DNS尽管它有几个缺点,但它得到了 DNS 服务器和客户端的良好支持。使用该技术的问题可能适用于所有 DNS 负载平衡解决方案。
此外帕特里克的回答一些 DNS 服务器内置或附加了更多智能。响应经过调整,而不是返回所有记录的完整集合。一些算法如下:
健康检查可以通过删除响应中故障节点的记录和/或使用备用服务器的记录来确保故障转移。
有多个名称服务器具有提供不同 DNS 信息集的实现,通常由 DNS 请求的源地址选择。
- 调用该函数的更简单的用例通常是 “水平分割 DNS” 来自校园或公司网络内客户的请求将触发与其他请求不同的响应。
- 更高级的用例是“GeoDNS”或类似。例如,一个网站可能有 2 个服务器(或负载平衡器 IP 后面的集群),一个位于法国,一个位于美国。使用 GeoDNS 可以创建一个 DNS 记录,让来自欧洲的客户端获得法国服务器的 IP 地址,而来自美国的客户端获得美国服务器的 IP 地址。
但是除了基于 DNS 的解决方案之外还存在许多其他方法。
“任播”其中单个目标 IP 地址由多个位置的服务器/负载均衡器共享,并且路由器将发往该目标的数据包定向到最靠近发送方的位置。
具有服务发现和故障转移功能的应用程序中的内置逻辑