如何排查 Route 53 中加权路由策略的问题?
上次更新日期:2021 年 5 月 22 日
我在 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 | 关联的运行状况检查 |
以下示例引用了此配置。
解决方法
注意:如果您在运行 AWS 命令行界面 (AWS CLI) 命令时遇到错误,请确保您使用的是最新版本的 AWS CLI。
测试您的加权路由策略以确定问题所在
发送多个(超过 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
在 AWS CLI 中使用 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 会考虑运行状况良好的零加权记录。
例如:
名称 | 类型 | 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
10000 "Record with Weight 20"
请注意,Route 53 不考虑重量为 0 的记录。除非所有加权记录都不正常,否则 Route 53 不会返回零加权记录。
如果为组中的所有记录设置相同的权重,则流量将以同等概率路由到所有运行状况良好的资源。如果将组中所有记录的“权重”都设置为零,则流量将以同等概率路由到所有运行状况良好的资源。