如果我为同一主机创建多个 DNS A 记录,例如:
my-domain.com A 1.2.3.4 3600s
my-domain.com A 4.5.6.7 3600s
my-domain.com A 7.8.9.0 3600s
查询真的会在三台服务器之间循环吗?均匀吗?
假设客户请求我的域名.com然后返回
1.2.3.4
。然后缓存一个小时,这样客户端发出的每个请求都会使用1.2.3.4
,还是每个请求都会抓取一个随机主机?如果
4.5.6.7
发生故障,DNS 是否会自动将其取出,或者请求是否仍会以循环方式路由到它?
答案1
是的,您可以使用多个 DNS 记录为同一服务实现一些负载共享。但是,这不是实现负载共享的最佳方式,尤其是在所有主机都位于同一位置的情况下。更有效的方法是使用专用机器作为负载平衡器。该机器接收所有流量并根据以下几个标准将其转发到其中一个真实服务器:
- 并发连接。
- 服务器负载。
- 用户源IP。
- 循环赛。
- 加权循环赛等等...
负载均衡器(例如 haproxy)的另一个重点是能够检查故障节点并将其从服务器列表中排除,而基于 DNS 的方法则不具备此功能。
此外,DNS 缓存使事情变得更加复杂和难以管理。DNS 缓存可以发生在从您的客户端到任何中间 DNS 服务器的任何节点,直到到达权威 DNS 服务器。
答案2
是的,它会在这三者之间进行轮循。对于 Windows 服务器 DNS,您需要在 DNS 服务器中启用轮循。启用后,它将以轮流模式响应所有三条记录:
第一个客户端 - 1.2.3.4、4.5.6.7、7.8.9.0
第二个客户端 - 4.5.6.7、7.8.9.0、1.2.3.4
第三个客户端 - 7.8.9.0、1.2.3.4、4.5.6.7
这取决于客户端的实现。有些客户端会在每个连接之间轮换记录,有些客户端则倾向于使用收到的第一个地址。由于上面的第二个客户端与第一个客户端的有序列表不同,因此负载仍然平衡。
如果
4.5.6.7
发生故障,它不会被自动删除。客户端仍会尝试连接该 IP。这是循环 DNS 的缺点。