如何使用 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 解析器的缓存,上述结果不符合预期。
问题:我的某些加权记录未被返回。
如果您将运行状况检查与资源记录集关联,则仅当相关运行状况检查通过时,Route 53 才会响应该记录。请确保与您的加权记录关联的运行状况检查顺利通过。有关更多信息,请参阅Amazon Route 53 如何确定运行状况检查是否运行良好。 如果策略中的 RRSet 不包含附加的运行状况检查,则它将始终被认为运行状况良好,并且可能会被包含在对 DNS 查询的响应中。不会返回运行状况检查未通过的记录。检查运行状况检查配置,并确保将其报告为正常运行。 如果您使用资源记录集“评估目标运行状况”,则 Route 53 会依赖由终端资源所报告的运行状况检查。有关更多信息,请参阅当我使用“评估目标运行状况”时,指向 Application Load Balancer 的别名记录为什么标记为不正常?例如,当某些运行状况检查未通过时:
| 名称 | 类型 | 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 会考虑运行状况良好的零加权记录。如果为组中所有记录都设置相同的“权重”,则流量将以同等概率路由到所有运行状况良好的资源。如果将组中所有记录的“权重”都设置为零,则流量将以同等概率路由到所有运行状况良好的资源。