答案1
您引用的答案是错误的。
例如不可用的服务器(如果一台服务器宕机)
如果用户在一次请求失败(超时)后发出后续请求,则客户端上的解析器应自动切换到列表中的下一个条目。
或其他名称服务器的 DNS 缓存
当 DNS 服务器收到某个名称的多个记录时,它应该缓存所有记录或不缓存任何记录。当它收到对具有多个记录的缓存名称的请求时,如果没有其他指令,它应该以(伪)随机顺序返回整个列表。
由于存在两次重放同一事务的风险,因此没有标准解决方案来恢复失败的 HTTP 请求(尽管可以将这种功能构建到应用程序层)。
循环的唯一问题是客户端检测故障所需的时间。当某个节点不可用时,通过在集群上实施本地地址接管,可以轻松解决这个问题。
答案2
不要使用 DNS 进行负载平衡,而要使用一些真正的负载平衡软件或硬件来专门处理您需要的内容。
有一些 DNS 服务和软件可以监控服务器并根据您想要的参数发出适当的响应,但考虑到 DNS 缓存,这并不是 DNS 的真正目的 - 这真的不是您想要的。
答案3
这实际上取决于您的架构是什么样的以及您计划对哪种类型的应用程序进行负载平衡。 (A) 架构: 1. 同一网段:使用 haproxy 或 replyd 是一个不错的开始。也可以直接在防火墙内进行 tcp 负载平衡(例如 free|open bsd 上的 PF),但请参见 (B) 2. 服务器遍布全球:将传入的请求集中到一个接入点来处理平衡逻辑是可行的,但您可能需要考虑使用 DNS RR 并在每个节点级别复制平衡逻辑 (B) 应用程序类型 1. 仅静态内容传递,非数据驱动,无会话(无状态):您可以安全地使用具有低 TTL(可以设置为零)的 DNS RR。如果前一个失败,浏览器将尝试连接到下一个 ip 地址 2. 动态内容,数据驱动(数据库后端),无状态:您应该考虑数据分区或数据复制。您仍然可以使用 DNS 循环。如果节点发生故障,则使用分区时您只会丢失部分数据,复制时则不会丢失任何数据。维护主数据节点的热备份时,逻辑变得复杂。3. 有状态应用程序:如果您需要维护会话,则需要在会话级别进行请求路由。您应该使用 haproxy。或者您可以将用户会话完全复制到所有服务器。或者对会话进行分区(例如在 memcached 中),并让您的会话管理器透明地在其中一个服务器上正确查找用户会话。
节点故障:haproxy 和 Relayd 都可以负责从服务器池中删除死节点。对于 TCP/DNS 平衡,您应该添加外部逻辑来维护良好的工作程序列表。如何以正确的方式进行负载平衡没有直接的答案。这完全取决于环境和应用程序。
答案4
RR-DNS 仅适用于分发负荷,而非负荷平衡。