我不太了解 DNS 管理等,但是我知道应用程序编程的最佳实践。
目前我公司有6台服务器,分别为:
- s1.域名.com
- s2.domain.com
- s3.domain.com
- s4.domain.com
- s5.domain.com
- s6.domain.com
没关系。
但是,系统管理员要求我们在应用程序中处理这些随机端点,这意味着我们需要从这个列表中随机选择一个服务器。
在我看来这很糟糕,因为每当我们需要添加服务器时,我们都需要编辑我们的应用程序(即使它只是一个配置文件),但我认为应用程序不应该知道这些事情,类似实体不应该知道持久服务器。
我的想法是使用 DNS 负载平衡,一个域,指向不同的 IP
一个端点:mobile.domain.com
系统管理员告诉我这很糟糕或类似的话,但我相信这是最好的解决方案,而且它将允许稍后进行地理定位负载平衡,这很棒。顺便说一句,从列表中随机挑选一台服务器不会阻止服务器关闭,因为随机就是不是随机的,而且对我来说看起来效率不高。
感谢您的反馈,如果您有正反两方面的论据,我可以使用:)
答案1
DNS 轮询通常被认为是一种成本极低的负载平衡解决方案。确实,当服务器不可用时,它需要手动更改 DNS。DNS 更改也需要时间来传播(并且这取决于中间解析器)。
另一方面,与合适的负载平衡器的成本相比,它非常便宜。还有复杂性的问题。有用于负载平衡的开源解决方案,但它们的设置并不简单,如果出现问题,您(或您的系统管理员)需要具备专业知识来修复它。更新 DNS 区域是一件相对简单的事情。
除非您所处的情况是服务的可用性绝对重要,或者请求失败(由于 DNS 延迟)会导致严重的收入损失,否则最好的选择是 DNS 循环。
为了回答您需要什么样的负载平衡的问题,您需要确定失败请求的成本。
无论如何,更改应用程序(无论是代码还是配置文件)都不是一个好主意,因为这会引入更长的延迟(在传播应用程序更改时)。
答案2
我认为您的系统管理员想要说的是,使用 DNS 进行负载平衡并不坏,但不方便。您可以为特定域的 DNS 添加 6 个 IP,但这会很难管理集群。如果您想将其中一台机器从轮换中移除,您必须编辑 DNS 记录并等待其传播。这可以通过设置较低的 TTL 来处理,但您无法考虑任何不遵循 DNS 协议的中间解析器。
更方便的做法是使用负载均衡器并将域指向 LB,但后面还有 6 个服务器。它允许添加/删除服务器,因为您不必担心 DNS 传播时间。
答案3
虽然 Sameer 和 wolfgangsz 所说的循环赛是正确的,但他们低估了什么才是真正无用的机制,并且遗漏了几个会让您感到痛苦的问题,包括 DNS 客户端和解析 DNS 代理缓存以及从内容 DNS 服务器到 DNS 客户端的旅程中缺乏顺序保存保证。
如上所述,SRV
资源记录解决了所有这些问题。您获得优先权和代理 DNS 服务器中的缓存不会破坏权重。管理员可以使用它们执行您以后可能想要执行的操作,例如设置后备服务器组和主服务器组、指定后备顺序以及控制单个服务器组内的权重。编写客户端代码以使用给定的权重和优先级选择要通信的服务器也并不困难。
根据谁将使用你的应用程序(只有你还是全世界),你可能必须在SRV
注册表中注册你的协议名称(用于资源记录域名),例如这个。如你所见,其他人已经拥有了。
正如萨米尔所说,真实的负载平衡器是另一种更可取的、可以替代无用的循环改组的方法。