現在、Amazon ELBの前でHaproxy-1.6-dev2を使用していますが、DNS解決の問題が発生しています。新しいresolvers
機能により、開発バージョンのhaproxyを使用していますが、haproxyプロセスを再起動せずに、Haproxyにサーバーの内部IPアドレスリストの変更をトリガーさせることができませんでした。 AmazonはELBのIPを更新し、Haproxyは更新せずに古いIPアドレスを使用し続けます。簡単な設定ファイルを以下に示します。
global
log 127.0.0.1 local0
stats socket /var/run/haproxy.sock
defaults
log global
mode http
option httpchk GET /
option log-health-checks
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
resolvers dns
nameserver public-0 xx.xx.xx.xx:53
hold valid 1s
frontend http
bind *:8000
default_backend site-backend
backend site-backend
balance leastconn
server site sub.example.com:80 resolvers dns check inter 1000
AWS Route53で一時的なAレコードを作成しましたが、Aレコードが無効な場所を指しているため、ヘルスチェックが失敗します。
次に、Aレコードを更新して有効な場所を指定しても、ヘルスチェックが失敗し続けます。 haproxyを再起動するだけで、ヘルスチェックに合格します。
また、統計ソケットにpingして、もう少し情報を取得しました。
nameserver public-0:
sent: 153
valid: 0
update: 0
cname: 0
cname_error: 0
any_err: 0
nx: 0
timeout: 0
refused: 0
other: 0
invalid: 0
too_big: 0
outdated: 51
Haproxyのドキュメントでは、「古い」とは何を意味するのかについて、あまり助けがありませんでした。
1秒のデフォルトタイムアウトではなく、1ミリ秒のデフォルトタイムアウトの問題のようです。設定timeout retry 1s
は、Haproxy-1.6-dev2でこの問題を抱えている他の人のために問題を解決する必要があります。これは公式の1.6リリースで解決されると思います。
HAProxyをデバッグモード(グローバルセクションの 'debug'ステートメントまたはhaproxy deamonを実行している場合は '-d')で実行し、stdoutおよびstderrの出力をここに報告してください。
それまでの間、ボックスのDNSトラフィックのtcpdumpを取り、HAProxyでDNS作業を行った開発者に送信してください:[email protected]。
バプティスト