Cname-Record
具有多個 A 記錄的 PowerDNS CNAME 會產生意外結果
據我所知,這個問題與 PowerDNS 無關。這些伺服器執行兩個程序包
pdns-static-3.0.1-1.i386.rpm
,並pdns-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 ;; 問題部分: 記憶體.domain.com。在一個 ;; 答案部分: 記憶體.domain.com。100 在 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 IN A bbb.bbb.bbb.bbb ;; 查詢時間:0毫秒 ;; 伺服器:ccc.ccc.ccc.ccc#53(ccc.ccc.ccc.ccc) ;; 時間:2012 年 7 月 2 日星期一 15:09:27 ;; 味精大小 rcvd:130
遞歸配置
允許從=0.0.0.0/0 不要查詢= 本地地址=127.0.0.1 local-port=530 # 埠應該改成530,因為和dns伺服器在同一個埠上執行不好 安靜=是 setgid=pdns setuid=pdns 禁用數據包記憶體= 數據包記憶體-ttl=0 forward-zones=domain.local=LOCALIP,domain.cloud=LOCALIP #將我們關心的兩個zone轉發回本地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
PowerDNS Recursor 在兩個級別記憶體。
它將來自權威伺服器的響應記憶體到它得到的響應中指定的 TTL(受 max-cache-ttl 限制,但永遠不會超過它從 auth 獲得的 TTL)。
此外,當生成並發送從遞歸器到客戶端(正在生成負載的客戶端)的響應數據包時,該數據包將作為一個整體進行記憶體,以便可以非常快速地回答相同的問題(無需任何解析)如果它又進來了。這稱為數據包記憶體。
洗牌發生在這兩個級別之間。這意味著您的結果實際上已被打亂,但它們的打亂順序由數據包記憶體保持穩定(預設情況下最多一個小時)。如果要按響應隨機播放,請設置“disable-packetcache”或“packetcache-ttl=0”。