Cname-Record

具有多個 A 記錄的 PowerDNS CNAME 會產生意外結果

  • July 2, 2012

據我所知,這個問題與 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”。

引用自:https://serverfault.com/questions/403457