我想知道是否可以仅使用 DNS 记录来“负载平衡”到达我的名称服务器的流量。
我考虑过每个名称服务器有多个 A 记录,如下所示:
IN NS ns1.example.com
IN NS ns2.example.com
ns1 IN A 10.0.0.1
ns1 IN A 10.0.0.2
ns2 IN A 10.0.0.1
ns2 IN A 10.0.0.2
这个想法是,即使解析器总是选择 ns1,或者中间 dns 缓存造成麻烦,请求也会被均匀地路由到两个服务器。
我已经为我的 MX 使用了类似的东西,而且它有效,但我不确定它是否也适用于 NS 记录。我真的不明白为什么它不起作用,但我想听听你的意见。
谢谢。
编辑
需要明确的是,我在这里并不是寻找完美的负载平衡解决方案,并且我知道如果第一个 NS 发生故障,客户端将必须在第二个 NS 上重试。
我只是希望在每台服务器上有相同的带宽重新分配,并不是因为一台服务器超载了,而是因为每台服务器都有流量上限,所以我想避免 90% 的请求发往 ns1,其余的发往 ns2。
答案1
DNS 已实现负载平衡
DNS(大多数情况下)本质上通过两种机制之一进行负载平衡。
NS 记录以随机顺序返回
大多数 DNS 服务器会以随机顺序返回 NS 查询。
请注意以下两个查询。查看后续查询中名称服务器的顺序如何改变。
dig @8.8.8.8 NS serverfault.com
;; ANSWER SECTION:
serverfault.com. 300 IN NS ns1.serverfault.com.
serverfault.com. 300 IN NS ns3.serverfault.com.
serverfault.com. 300 IN NS ns4.serverfault.com.
serverfault.com. 300 IN NS ns2.serverfault.com.
;; ANSWER SECTION:
serverfault.com. 300 IN NS ns2.serverfault.com.
serverfault.com. 300 IN NS ns3.serverfault.com.
serverfault.com. 300 IN NS ns1.serverfault.com.
serverfault.com. 300 IN NS ns4.serverfault.com.
DNS 解析器行为
大多数 DNS 解析器会选择列表中的第一个名称服务器并对其进行查询。有些会随机选择一个名称服务器。
无论哪种情况,如果您的 DNS 服务器正在随机化您的 NS 记录,那么流量应该是平衡的。
负载平衡 DNS
在您的例子中,您将 NS1/NS2 指向相同的 IP。没有必要这样做。但是,如果您有的话。
ns1.domain.com 10.0.0.1
ns1.domain.com 10.0.0.2
ns2.domain.com 10.0.0.3
ns2.domain.com 10.0.0.4
您不会将 NS1 的流量拆分到两台服务器上。这会将 NS1 的请求分散到两台服务器上。在 DNS 提供商开始使用任播方法之前,这是一种流行的技术。
(请注意,IPv6 有一些变化。
请参阅http://blogs.technet.com/b/networking/archive/2009/04/17/dns-round-robin-and-destination-ip-address-selection.aspx)
答案2
一个 A 记录对应多个 IP 地址的概念称为“循环 DNS”。它已经存在很长时间了。
这并不能保证均匀分配流量,并且还有许多其他方法可以配置 DNS 以实现负载平衡或高可用性或两者兼而有之,但为了简单起见,循环法无疑是最好的选择。
但是,据我了解,解析器会始终选择响应速度最快的 NS。除非您能够从逻辑上或地理位置上将每个 NS 设置为对约 50% 的客户端来说更快,否则一个 NS 将比另一个更受青睐。
答案3
我会避免这种情况,因为没有办法表明服务器是启动还是关闭,所以如果服务器10.0.0.1
关闭,这意味着发送到您服务器的大约 50% 的请求将在第一次失败,需要重试,这将对使用 DNS 的任何事情产生负面影响。BillThor 和 suprjami 已经指出,响应更快的服务器最终会带来更多流量,这很可能意味着您需要手动调整以平衡它。
适当的负载平衡会考虑正在工作的机器的状态、它们正在执行的工作量,并且通常可以进行透明的更改来调整情况,而无需您的干预。
答案4
DNS 流量已实现负载平衡(并缓存)。添加额外的 A 记录将增加所有名称服务器的负载,因为它们需要提供额外的地址。
如果您的一个名称服务器超载,但另一个没有,请查看服务器配置或网络配置。如果一个服务器无法访问,流量将转移到其他服务器,从而导致负载不平衡。
还要检查您的 TTL 值,以确保服务器可以在合理的时间内缓存您的数据。在大多数情况下,您的数据应该可以缓存数小时或数天。如果地址发生变化,请减少 TTL 并减轻负载。
还要检查以确保您的服务器不能用于 DNS 放大。从互联网上看,它应该只响应它有权处理的查询。这可能会很快耗尽您的带宽,而无法提供预期的服务。
编辑:如果您想减少服务器的流量,请在不同的网络上添加辅助服务器。有多个组织提供辅助 DNS 服务。使用循环调度,流量可以分散到更多服务器上。