如何解决 Route 53 中的加权路由策略问题?

5 分钟阅读
0

在 Amazon Route 53 中测试加权路由策略的 DNS 解析时,出现了意想不到的结果。

简短描述

假设您创建了一条名为“weighted.awsexampledomain.com”的文本 (TXT) 记录。该记录的生存时间 (TTL) 为 300 秒,权重配置如下:

名称类型TTL权重运行状况检查状态
weighted.awsexampledomain.com。TXT300“权重为 0 的记录”权重 = 0关联的运行状况检查
weighted.awsexampledomain.com。TXT300“权重为 20 的记录”权重 = 20关联的运行状况检查
weighted.awsexampledomain.com。TXT300“权重为 50 的记录”权重 = 50关联的运行状况检查
weighted.awsexampledomain.com。TXT300“权重为 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 解析器处有缓存。

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

示例

未通过某些运行状况检查:

名称类型TTL权重运行状况检查状态
weighted.awsexampledomain.com。TXT300“权重为 0 的记录”权重 = 0通过运行状况检查
weighted.awsexampledomain.com。TXT300“权重为 20 的记录”权重 = 20通过运行状况检查
weighted.awsexampledomain.com。TXT300“权重为 50 的记录”权重 = 50未通过运行状况检查
weighted.awsexampledomain.com。TXT300“权重为 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。TXT300“权重为 0 的记录”权重 = 0未通过运行状况检查
weighted.awsexampledomain.com。TXT300“权重为 20 的记录”权重 = 20未通过运行状况检查
weighted.awsexampledomain.com。TXT300“权重为 50 的记录”权重 = 50未通过运行状况检查
weighted.awsexampledomain.com。TXT300“权重为 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。TXT300“权重为 0 的记录”权重 = 0通过运行状况检查
weighted.awsexampledomain.com。TXT300“权重为 20 的记录”权重 = 20通过运行状况检查
weighted.awsexampledomain.com。TXT300“权重为 50 的记录”权重 = 50未通过运行状况检查
weighted.awsexampledomain.com。TXT300“权重为 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 不会返回零加权记录。

如果您为组中的所有记录设置了相等的权重,则流量将以同等概率发送到所有正常的资源。如果您将组中所有记录的“权重”均设置为零,则流量将以同等概率发送到所有正常的资源。

相关信息

选择路由策略

配置运行状况检查时,Amazon Route 53 如何选择记录

AWS 官方
AWS 官方已更新 1 年前