如何使用 Route 53 中的加权路由策略来排查 DNS 解析问题?

上次更新时间:2020 年 6 月 24 日

我在 Amazon Route 53 中配置了加权路由策略。然而,测试 DNS 解析时,我得到意外结果。我应该如何排查此问题?

简短描述

考虑到您已创建了一个名为“weighted.awsexampledomain.com”的 TXT 记录。该记录的生存时间值 (TTL) 为 300 秒,其权重的配置如下所示:

名称 类型 TTL 权重 运行状况检查状态
weighted.awsexampledomain.com。 TXT 300 “权重为 0 的记录” Weight = 0 关联的运行状况检查
weighted.awsexampledomain.com。 TXT 300 “权重为 20 的记录” Weight = 20 关联的运行状况检查
weighted.awsexampledomain.com。 TXT 300 “权重为 50 的记录” Weight = 50 关联的运行状况检查
weighted.awsexampledomain.com。 TXT 300 “权重为 70 的记录” 权重 = 70 关联的运行状况检查

以下示例引用了此配置。

解决方案

测试您的加权路由策略来明确问题所在

发送多个(超过 10000 个)查询以测试您的加权路由策略。从多个位置测试该 DNS 解析,或直接查询权威名称服务器以了解该策略。使用以下脚本为您的域名发送多个 DNS 查询。

使用递归解析器发送 DNS 查询:

#!/bin/bash
for i in {1..10000}
do
domain=$(dig <domain-name> <type> @RecursiveResolver_IP +short)
echo -e  "$domain" >> RecursiveResolver_results.txt
done

直接向权威名称服务器发送 DNS 查询:

#!/bin/bash
for i in {1..10000}
do
domain=$(dig <domain-name> <type> @AuthoritativeNameserver_IP +short)
echo -e  "$domain" >> AuthoritativeNameServer_results.txt
done

使用的是awk 工具的示例输出:

$ for i in {1..10000}; do domain=$(dig weighted.awsexampledomain.com. TXT @172.16.173.64 +short); echo -e  "$domain" >> RecursiveResolver_results.txt; done

$ awk ' " " ' RecursiveResolver_results.txt | sort | uniq -c
1344 "Record with Weight 20"
3780 "Record with Weight 50"
4876 "Record with Weight 70"

使用您的测试结果来排查您的特定问题

问题: 加权记录的终端节点资源未收到预期的流量比率。

Route 53 是根据您分配给记录的权重(占所有记录的总权重的比例)将流量发送到资源的。在记录 TTL 的持续时间内,DNS 响应由中间 DNS 解析器进行缓存。由于响应被缓存,在持续时间内,客户端仅被定向到特定的终端节点。

例如,如果您查询的是缓存 DNS 解析器192.168.1.2:

$ for i in {1..10000}; do domain=$(dig weighted.awsexampledomain.com. TXT @192.168.1.2 +short); echo -e  "$domain" >> CachingResolver_results.txt; done

$ awk ' " " ' CachingResolver_results.txt | sort | uniq -c
3561 "Record with Weight 20"
1256 "Record with Weight 50"
5183 "Record with Weight 70"

请注意,由于递归 DNS 解析器的缓存,上述结果不符合预期。

问题: 我的某些加权记录未被返回。

例如,当某些运行状况检查未通过时:

名称 类型 TTL 权重 运行状况检查状态
weighted.awsexampledomain.com。 TXT 300 “权重为 0 的记录” Weight = 0 通过运行状况检查
weighted.awsexampledomain.com。 TXT 300 “权重为 20 的记录” Weight = 20 通过运行状况检查
weighted.awsexampledomain.com。 TXT 300 “权重为 50 的记录” Weight = 50 未通过运行状况检查
weighted.awsexampledomain.com。 TXT 300 “权重为 70 的记录” 权重 = 70 通过运行状况检查
$ for i in {1..10000}; do domain=$(dig weighted.awsexampledomain.com. TXT @192.168.1.2 +short); echo -e  "$domain" >> HealthCheck_results.txt; done

$ awk ' " " ' HealthCheck_results.txt | sort | uniq -c
3602 "Record with Weight 20"
6398 "Record with Weight 70"

请注意,Route 53 不会返回“权重为 50 的记录”,因为其运行状况检查不会通过。

问题:我所有加权记录的状况都不正常。

即使一组记录中的任何记录都不正常,Route 53 仍然必须为 DNS查询 提供响应。然而,没有理由选择一条记录而不选择另一条。在这种情况下,Route 53 会认为该组中的所有记录都是正常的。根据路由策略和为每个记录指定的值选择一个记录。

例如:

名称 类型 TTL 权重 运行状况检查状态
weighted.awsexampledomain.com。 TXT 300 “权重为 0 的记录” Weight = 0 未通过运行状况检查
weighted.awsexampledomain.com。 TXT 300 “权重为 20 的记录” Weight = 20 未通过运行状况检查
weighted.awsexampledomain.com。 TXT 300 “权重为 50 的记录” Weight = 50 未通过运行状况检查
weighted.awsexampledomain.com。 TXT 300 “权重为 70 的记录” 权重 = 70 未通过运行状况检查
$ for i in {1..10000}; do domain=$(dig weighted.awsexampledomain.com. TXT @205.251.194.16 +short); echo -e  "$domain" >> All_UnHealthy_results.txt; done

$ awk ' " " ' All_UnHealthy_results.txt | sort | uniq -c
1446 "Record with Weight 20"
3554 "Record with Weight 50"
5000 "Record with Weight 70"

请注意,Route 53 认为所有记录都运行状况良好(失效开放)。Route 53 是按照配置的比例来响应 DNS 请求的。由于权重为零,因此未返回“权重为 0 的记录”。

请注意:如果您为一些记录设置了非零的权重,将其他记录的权重设置为零,则运行状况检查的情况将与所有记录的权重都设置为非零时相同。有一些例外:

  • Route 53 起初仅考虑运行状况良好的非零加权记录(如果有的话)。
  • 如果所有非零记录的运行都不正常,则 Route 53 会考虑运行状况良好的零加权记录。

如果为组中所有记录都设置相同的“权重”,则流量将以同等概率路由到所有运行状况良好的资源。如果将组中所有记录的“权重”都设置为零,则流量将以同等概率路由到所有运行状况良好的资源。


这篇文章对您是否有帮助?

我们可以改进什么?


需要更多帮助?