Knowledge Center Monthly Newsletter - March 2025
Stay up to date with the latest from the Knowledge Center. See all new and updated Knowledge Center articles published in the last month and re:Post’s top contributors.
如何解决 Route 53 中的加权路由策略问题?
在 Amazon Route 53 中测试加权路由策略的 DNS 解析时,出现了意想不到的结果。
简短描述
假设您创建了一条名为“weighted.awsexampledomain.com”的文本 (TXT) 记录。该记录的生存时间 (TTL) 为 300 秒,权重配置如下:
名称 | 类型 | TTL | 值 | 权重 | 运行状况检查状态 |
weighted.awsexampledomain.com。 | TXT | 300 | “权重为 0 的记录” | 权重 = 0 | 关联的运行状况检查 |
weighted.awsexampledomain.com。 | TXT | 300 | “权重为 20 的记录” | 权重 = 20 | 关联的运行状况检查 |
weighted.awsexampledomain.com。 | TXT | 300 | “权重为 50 的记录” | 权重 = 50 | 关联的运行状况检查 |
weighted.awsexampledomain.com。 | TXT | 300 | “权重为 70 的记录” | 权重 = 70 | 关联的运行状况检查 |
以下示例中引用了此配置。
解决方法
**注意:**如果在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请确保您使用的是最新的 AWS CLI 版本。
测试您的加权路由策略,找出问题
发送多个(超过 10,000 个)查询,测试您的加权路由策略。从多个位置测试 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 根据分配给记录的权重占所有记录总权重的比例向资源发送流量。中间 DNS 解析器在记录 TTL 期间缓存 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 依赖于最终资源报告的运行状况检查。有关详细信息,请参阅当我使用“评估目标运行状况”时,为什么我的指向应用程序负载均衡器的别名记录被标记为不正常?
示例
未通过某些运行状况检查:
名称 | 类型 | TTL | 值 | 权重 | 运行状况检查状态 |
weighted.awsexampledomain.com。 | TXT | 300 | “权重为 0 的记录” | 权重 = 0 | 通过运行状况检查 |
weighted.awsexampledomain.com。 | TXT | 300 | “权重为 20 的记录” | 权重 = 20 | 通过运行状况检查 |
weighted.awsexampledomain.com。 | TXT | 300 | “权重为 50 的记录” | 权重 = 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 的记录” | 权重 = 0 | 未通过运行状况检查 |
weighted.awsexampledomain.com。 | TXT | 300 | “权重为 20 的记录” | 权重 = 20 | 未通过运行状况检查 |
weighted.awsexampledomain.com。 | TXT | 300 | “权重为 50 的记录” | 权重 = 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 的记录” | 权重 = 0 | 通过运行状况检查 |
weighted.awsexampledomain.com。 | TXT | 300 | “权重为 20 的记录” | 权重 = 20 | 通过运行状况检查 |
weighted.awsexampledomain.com。 | TXT | 300 | “权重为 50 的记录” | 权重 = 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 不会返回零加权记录。
如果您为组中的所有记录设置了相等的权重,则流量将以同等概率发送到所有正常的资源。如果您将组中所有记录的“权重”均设置为零,则流量将以同等概率发送到所有正常的资源。
相关信息

相关内容
- AWS 官方已更新 7 个月前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前