如何排查 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 解析器中的缓存,这些结果不符合预期。

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

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

名称 类型 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 不会返回零加权记录。

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


这篇文章对您有帮助吗?


您是否需要账单或技术支持?