我正在寻找探索我发现的怪癖的技术细节。
我有一个权威的 DNS 服务器,执行全球服务负载平衡。它以基于其负载平衡算法的优先顺序响应多个 IP 地址。因此,例如,如果所有服务都正常,但 xyz3 负载最少,则响应可能如下所示:
x.y.z.3
x.y.z.1
x.y.z.2
但是,我发现如果用户使用 Google 的 DNS (8.8.8.8),他们会得到与上面完全相同的响应。然而,OpenDNS 似乎进一步循环这些响应。
换句话说,使用 8.8.8.8 作为其 DNS 服务器的用户将始终收到以下响应:
x.y.z.3
x.y.z.1
x.y.z.2
但是使用 OpenDNS 的用户可以按任何顺序查看它们。
我可以通过只返回 xyz3 来立即解决这个问题,但我想知道:
- 有没有其他方法可以解决这个问题?
- 这种行为是否包含在 RFC 或标准中?
- OpenDNS 行为是否符合预期且正确?
由于建立在与 DNS 工作方式部分不一致的假设之上,您的直接问题有点难以回答。
对于名称、类和类型的给定组合存在的资源记录形成一个资源记录集(通常称为RRSet)。
正如该术语所暗示的(特别是它是一个set),枚举记录的顺序对系统没有意义。
我相信首先指出这种缺乏排序的地方是RFC1033:
有了这些知识,已经很清楚,对订购有期望意味着依赖于最初无法保证的行为。
接下来,具有多个地址记录 (
A
/AAAA
) 的记录集的常见用例是 DNS 中负载平衡的粗略方法。为了更好地帮助这项工作,许多缓存解析器将使用每个响应重新排序记录(无论是循环还是随机顺序),以帮助简单的客户端应用程序只选择第一个地址而不是全部命中相同的地址TTL 长。
即,标准允许实施这种行为(顺序并不重要)而不是实际强制执行。
总而言之,您只需要考虑记录的顺序没有实际意义,并且可以期望客户端使用记录集中存在的所有地址。
如果只有负载最少的主机获得流量真的很重要,您将不得不只返回其地址,或者如果客户端软件支持
SRV
(这排除了网络浏览器)可能会利用它并调整SRV
优先级和/或权重字段以反映您当前的偏好。但是,请记住,缓存仍然是一件事,因此最好还是让客户端“自行”将负载分散到可用的主机上。