这是我在老问题上的问题的进一步forms。 在回答的build议之后,我在这里得到了这个文本
上面显示的基于DNS的负载均衡方法并没有考虑到各种潜在的问题,例如不可用的服务器(如果一台服务器停机),或者由其他名称服务器进行DNScaching。 DNS服务器没有任何有关服务器可用性的知识,并将继续指向不可用的服务器。 它只能通过IP地址区分,而不能通过服务器端口来区分。 IP地址也可以由其他名称服务器caching,因此请求可能不会发送到负载均衡DNS服务器。
现在我正在思考什么,这些是否存在一些解决潜在问题的方法?
你引用的答案是错误的。
如不可用的服务器(如果一台服务器停机)
如果用户在一次失败(超时)后发出后续请求,客户端的parsing器应自动切换到列表中的下一个条目。
或其他名称服务器的DNScaching
当一个DNS服务器接收到一个名字的多个logging时,它应该caching所有这些或没有。 当它收到多个logging的caching名称的请求时,如果没有其他指令,它应该以(伪)随机顺序返回整个列表。
没有标准的解决scheme来恢复失败的HTTP请求(尽pipe有可能在应用层中构build这样的function),因为有两次重播相同的事务的风险。
循环法的唯一问题是客户端检测到故障所花费的时间。 当节点变得不可用时,通过在集群上实施本地地址接pipe,可以轻松解决这个问题。
不要使用DNS来进行负载平衡,而是使用一些真正的负载平衡软件或硬件来专门处理您想要的内容。
有一些DNS服务和软件可以监视服务器,并根据你想要的任何参数发出适当的响应,但是给予DNScaching,而这不是DNS的目的 – 这实际上不是你想要的。
这实际上取决于你的架构是什么样子,你打算平衡什么types的应用程序。 (一)架构:1.同网段:使用haproxy或relayd可以是一个好的开始。 也可以在防火墙内部直接进行tcp负载均衡(例如,在free | open bsd上的PF),但请参阅(B)2.服务器遍布全球:将传入请求集中到一个访问点以处理平衡逻辑(B)应用程序types1.仅静态内容传输,不是数据驱动的,没有会话(无状态):您可以安全地使用DNS RR低TTL(可以设置为零)。 如果以前失败,浏览器将尝试连接到下一个IP地址2.dynamic内容,数据驱动(数据库后端),无状态:您应该考虑数据分区或数据复制。 您仍然可以使用DNS循环。 如果某个节点出现故障,则在使用分区时只会丢失部分数据,或者在复制时完全不丢失数据。 维护主数据节点的热备份的逻辑变得复杂。 3.有状态的应用程序:如果您需要维护会话,则需要在会话级别执行请求路由。 你应该使用haproxy。 或者您可以将您的用户会话完全复制到所有服务器。 或者对会话进行分区(例如在memcached中),让会话pipe理器透明地正确查找用户会话中的一个服务器。
节点故障:haproxy和relayd都可以负责从服务器池中删除死亡节点。 对于tcp / dns平衡,你应该添加外部逻辑来维护一个好的工作列表。 关于如何做正确的负载平衡没有直接的答案。 完全取决于环境和应用。
RR-DNS只适用于分配负载,而不是负载均衡 。