web-dev-qa-db-ja.com

複数のAレコードを持つPowerDNSCNAMEは、予期しない結果を生成します

私が言えることからこの問題はPowerDNSに分離されています。サーバーは2つのパッケージを実行していますpdns-static-3.0.1-1.i386.rpmおよびpdns-recursor-3.3-1.i386.rpm AmazonLinuxの最新バージョン。

Amazon 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を変更しても、何も影響がないようです。リゾルバーにキャッシュがあるように見えます。応答。これは、すべての負荷がロードバランサー(アベイラビリティーゾーン)の1つにのみ送信されるため、アプリケーションに悪影響を及ぼします。したがって、2つのゾーンにサーバーがある場合、一度に1つのゾーンのみに負荷がかかります。

ホストが解決されるたびにアドレスの順序が交互になるように、これを修正する方法を知っていますか。


出力を掘る

 
;掘る9.7.6-P1-RedHat-9.7.6-1.P1.18.amzn1cache.domain.com 
 ;;グローバルオプション:+ cmd 
 ;;答えを得た:
 ;; HEADERオペコード:QUERY、ステータス:NOERROR、ID:54610 
 ;;フラグ:qr rd ra;クエリ:1、回答:3、権限:0、追加:0 
 
 ;;質問セクション:
 cache.domain.com。 IN A 
 
 ;;回答セクション:
 cache.domain.com。 100 IN CNAMExxxxx.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)
 ;;いつ:月7月2日15:09:27 2012 
 ;; MSGサイズrcvd:130 

再帰設定

 allow-from = 0.0.0.0/0 
 dont-query = 
 local-address = 127.0.0.1 
 local-port = 530#ポートを変更する必要がありますdns server 
 quiet = yes 
 setgid = pdns 
 setuid = pdns 
 disable-packetcache = [と同じポートで実行するのは適切ではないため、530になります。 ____。] packetcache-ttl = 0 
 forward-zones = domain.local = LOCALIP、domain.cloud = LOCALIP#関心のある2つのゾーンをローカルのDNSサーバーに転送します
 forward-zones -recurse = amazonaws.com = 172.16.0.23、compute-1.internal = 172.16.0.23#amazonドメインのクエリをAmazonのリゾルバーに転送します

解決

次の行をrecursor.confに追加します

disable-packetcache=
packetcache-ttl=0

次の行をpdns.confに追加します

recursive-cache-ttl=0
3
bwight

PowerDNSRecursorは2つのレベルでキャッシュします。

権限のあるサーバーからの応答を、取得した応答で指定されたTTLまでキャッシュします(max-cache-ttlによって制限されますが、取得したTTL認証から)。

さらに、リカーサーからクライアント(負荷を生成しているクライアント)への応答パケットが生成されて送信されると、このパケットは全体としてキャッシュされるため、同じ質問に(解析せずに)非常に迅速に回答できます。再び入ってくる。これはパケットキャッシュと呼ばれます。

シャッフルは、これら2つのレベルの間で発生します。つまり、結果は実際にはシャッフルされますが、シャッフルの順序はパケットキャッシュによって安定した状態に保たれます(デフォルトでは最大1時間)。応答ごとのシャッフルが必要な場合は、「disable-packetcache」または「packetcache-ttl = 0」を設定します。

4
Habbie

必ずしも「修正」ではありませんが、基になるAレコードに直接クエリを実行するのではなく、アプリケーションからCNAMEを使用する必要がありますか?おそらく、CNAME =>レコードマッピングはそれほど頻繁には変更されません。

時には最も単純なダム修正で十分であり、必要な結果を得るためだけに世界のすべての問題を解決する必要はありません!

0
Bron Gondwana