web-dev-qa-db-ja.com

Haproxy Resolversセクション+ Amazon ELB

現在、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のドキュメントでは、「古い」とは何を意味するのかについて、あまり助けがありませんでした。

6
Madison May

1秒のデフォルトタイムアウトではなく、1ミリ秒のデフォルトタイムアウトの問題のようです。設定timeout retry 1sは、Haproxy-1.6-dev2でこの問題を抱えている他の人のために問題を解決する必要があります。これは公式の1.6リリースで解決されると思います。

2
Madison May

HAProxyをデバッグモード(グローバルセクションの 'debug'ステートメントまたはhaproxy deamonを実行している場合は '-d')で実行し、stdoutおよびstderrの出力をここに報告してください。

それまでの間、ボックスのDNSトラフィックのtcpdumpを取り、HAProxyでDNS作業を行った開発者に送信してください:[email protected]

バプティスト

2
Baptiste