具有多个 A 记录的 PowerDNS CNAME 产生意外结果

具有多个 A 记录的 PowerDNS CNAME 产生意外结果

据我所知,这个问题与 PowerDNS 无关。服务器运行的是两个软件包pdns-static-3.0.1-1.i386.rpmpdns-recursor-3.3-1.i386.rpm使用的是最新版本的 Amazon Linux。

亚马逊 ec2 负载均衡器被分配了一个具有多个主机的 CNAME。以下是实际行为的示例。请注意主机始终按相同顺序排列。

[root@localhost ~]# host cache.domain.com
cache.domain.com is an alias for xxxxx.us-east-1.elb.amazonaws.com.
xxxxx.us-east-1.elb.amazonaws.com has address aaa.aaa.aaa.aaa
xxxxx.us-east-1.elb.amazonaws.com has address bbb.bbb.bbb.bbb
[root@localhost ~]# host cache.domain.com
cache.domain.com is an alias for xxxxx.us-east-1.elb.amazonaws.com.
xxxxx.us-east-1.elb.amazonaws.com has address aaa.aaa.aaa.aaa
xxxxx.us-east-1.elb.amazonaws.com has address bbb.bbb.bbb.bbb
[root@localhost ~]# host cache.domain.com
cache.domain.com is an alias for xxxxx.us-east-1.elb.amazonaws.com.
xxxxx.us-east-1.elb.amazonaws.com has address aaa.aaa.aaa.aaa
xxxxx.us-east-1.elb.amazonaws.com has address bbb.bbb.bbb.bbb

预期行为是主机采用循环赛

[root@localhost ~]# host cache.domain.com
cache.domain.com is an alias for xxxxx.us-east-1.elb.amazonaws.com.
xxxxx.us-east-1.elb.amazonaws.com has address aaa.aaa.aaa.aaa
xxxxx.us-east-1.elb.amazonaws.com has address bbb.bbb.bbb.bbb
[root@localhost ~]# host cache.domain.com
cache.domain.com is an alias for xxxxx.us-east-1.elb.amazonaws.com.
xxxxx.us-east-1.elb.amazonaws.com has address bbb.bbb.bbb.bbb
xxxxx.us-east-1.elb.amazonaws.com has address aaa.aaa.aaa.aaa
[root@localhost ~]# host cache.domain.com
cache.domain.com is an alias for xxxxx.us-east-1.elb.amazonaws.com.
xxxxx.us-east-1.elb.amazonaws.com has address aaa.aaa.aaa.aaa
xxxxx.us-east-1.elb.amazonaws.com has address bbb.bbb.bbb.bbb

地址最终会交换,但似乎在 30 分钟的缓存计时器上,更改记录的 TTL 似乎不会影响任何事情。解析器似乎有响应的缓存。这对我的应用程序产生了不利影响,因为所有负载仅发送到其中一个负载均衡器(可用区域),因此如果我在两个区域中有服务器,那么一次只有一个区域处于负载状态。

您知道我该如何解决这个问题,以便每次解析主机时地址的顺序都会交替。


挖掘输出

; DiG 9.7.6-P1-RedHat-9.7.6-1.P1.18.amzn1 cache.domain.com
;; 全局选项: +cmd
;; 得到答案:
;; HEADER 操作码:QUERY,状态:NOERROR,id:54610
;; 标志:qr rd ra;查询:1,答案:3,权限:0,附加:0

;; 问题部分:
cache.domain.com. 在 A

;; 答案部分:
cache.domain.com.100 IN CNAME xxxxx.us-east-1.elb.amazonaws.com。                                                                                                                 
xxxxx.us-east-1.elb.amazonaws.com.3 IN A aaa.aaa.aaa.aaa
xxxxx.us-east-1.elb.amazonaws.com.3 合 1 bbb.bbb.bbb.bbb

;; 查询时间:0 毫秒
;; 服务器:ccc.ccc.ccc.ccc#53(ccc.ccc.ccc.ccc)
;; 时间:2012 年 7 月 2 日星期一 15:09:27
;; 收到的消息大小:130

递归器配置

允许来自=0.0.0.0/0
不要查询=
本地地址=127.0.0.1
local-port=530 # 端口应该改为 530,因为不适合和 dns 服务器在同一个端口上运行
安静=是
设置 gid=pdns
设置 ID=pdns
禁用数据包缓存=
数据包缓存-TTL=0
forward-zones=domain.local=LOCALIP,domain.cloud=LOCALIP # 将我们关心的两个区域转发回本地 DNS 服务器
forward-zones-recurse=amazonaws.com=172.16.0.23,compute-1.internal=172.16.0.23 # 将对亚马逊域的查询转发到亚马逊的解析器

解决方案

将以下几行添加到 recursor.conf

disable-packetcache=
packetcache-ttl=0

将以下行添加到 pdns.conf

recursive-cache-ttl=0

答案1

PowerDNS Recursor 在两个级别进行缓存。

它会缓存来自权威服务器的响应,最长可达其收到的响应中指定的 TTL(受 max-cache-ttl 限制,但不会超过从身份验证获得的 TTL)。

此外,当生成并发送从递归器到客户端(正在生成负载的客户端)的响应数据包时,该数据包将作为一个整体进行缓存,这样如果再次收到相同的问题,就可以非常快速地(无需任何解析)回答。这称为数据包缓存。

改组发生在这两个级别之间。这意味着您的结果实际上是经过改组的,但它们的改组顺序由数据包缓存保持稳定(默认情况下最多一个小时)。如果您想要每个响应都进行改组,请设置“disable-packetcache”或“packetcache-ttl=0”。

答案2

不一定是“修复” - 但您是否需要使用应用程序中的 CNAME,而不是直接查询底层 A 记录? 假设 CNAME => A 记录映射不会经常更改。

有时最简单的修复实际上就足够了,避免为了获得所需的结果而解决世界上所有的问题!

相关内容