这个问题从我可以告诉PowerDNS孤立。 服务器在最新版本的Amazon Linux上运行两个软件包pdns-static-3.0.1-1.i386.rpm和pdns-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映射不会经常改变。
有时候最简单的修正就足够了,避免为了得到你需要的结果而解决所有世界的问题!