具有多个Alogging的PowerDNS CNAME会产生意外的结果

这个问题从我可以告诉PowerDNS孤立。 服务器在最新版本的Amazon Linux上运行两个软件包pdns-static-3.0.1-1.i386.rpmpdns-recursor-3.3-1.i386.rpm

亚马逊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分钟的caching计时器改变logging的TTL似乎不会影响任何东西。 看起来好像parsing器有一个caching的响应。 这会对我的应用程序产生不利的影响,因为所有的负载只能发送到其中一个负载均衡器(可用区域),所以如果我在两个区域中有服务器,则一次只有一个区域负载不足。

你知道我可以如何解决这个问题,以便每次解决主机地址的顺序是交替的。


DIG OUTPUT


 ;  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;  QUERY:1,答案:3,AUTHORITY:0,ADDITIONAL:0

 ;; 问题部分:
 cache.domain.com。 在一个

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

 ;; 查询时间:0毫秒
 ;;  SERVER:ccc.ccc.ccc.ccc#53(ccc.ccc.ccc.ccc)
 ;; 时间:星期一7月2日15:09:27 2012
 ;; 味精大小rcvd:130

Recursorconfiguration

允许-从= 0.0.0.0 / 0
不查询=
本地地址127.0.0.1 =
 local-port = 530#端口应该更改为530,因为它不适合在与dns服务器相同的端口上运行
安静= YES
 setgid的= PDNS
的setuid = PDNS
禁用-packetcache =
 packetcache-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#将amazons域的查询转发给amazon的parsing器

将以下行添加到recursor.conf

 disable-packetcache= packetcache-ttl=0 

将以下行添加到pdns.conf

 recursive-cache-ttl=0 

PowerDNS Recursorcaching在两个级别。

它caching来自权威服务器的响应,直到在其获得的响应中指定的TTL(受max-cache-ttl限制,但从不超过从auth获得的TTL)。

另外,当一个从recursor到一个客户端(产生负载的客户端)的响应数据包被生成并发送时,这个数据包被作为一个整体被caching,这样,如果这个数据包相同的问题可以被非常快速地解决(没有任何parsing)再次进来。 这被称为分组caching。

洗牌发生在这两个级别之间。 这意味着你的结果实际上是在洗牌,但是它们的洗牌顺序通过数据包caching保持稳定(默认长达一个小时)。 如果你想要每个响应shuffle,设置“disable-packetcache”或“packetcache-ttl = 0”。

不一定是“修复” – 但是您是否需要使用应用程序中的CNAME,而不是直接查询底层的Alogging? 据推测,CNAME =>logging映射不会经常改变。

有时候最简单的修正就足够了,避免为了得到你需要的结果而解决所有世界的问题!