web-dev-qa-db-ja.com

haproxy:アプリセッションを開始せずにサーバーメンテナンスを準備する方法

問題

Webサーバーの負荷分散にhaproxyを使用しています。一部のアプリケーションはセッションファイルを使用し、これらはサーバー間で同期されないため、追加のCookieでセッション永続性を使用しています。

メンテナンスのためにサーバーを無効にしたいが、セッションを中断しない。したがって、既存のクライアントがアプリケーションセッションを続行できるようにしたいが、新しいクライアントは受け入れないようにしたい。

偶然の振る舞い

  • サーバーを「メンテナンス中」に設定しました
  • クライアントにCookieが設定されている場合、「メンテナンス中」とマークされていてもサーバーを使用します
  • 新しいクライアント(Cookieなし)が来た場合、別のサーバーに転送されます
  • すべてのクライアントがアプリケーションセッションを終了した後は、この特定のサーバーにCookieを設定するクライアントはなくなるため、ユーザーの混乱なしにシャットダウンすることをお勧めします。

これはいくつかのhaproxy構成で達成できると思いますか?それともそれを行うための巧妙な方法はありますか?

他の方法

このニーズを達成する他の方法の非網羅的なリスト:

  • サーバー間でセッションファイルを同期する(複数のサーバー間でファイルを同期する方法、または共通の単一マウントポイントが必要)
  • データベースを使用してセッション情報を保存する(アプリケーションの動作を変更する必要がある)

もっと詳しく

私はこの種の構成を使用します:

frontend https-in
   bind xxx.xxx.xxx.xxx:443 ssl crt /etc/haproxy/ssl/_default.pem crt /etc/haproxy/ssl
   reqadd X-Forwarded-Proto:\ https

   acl APP1 hdr(Host) -i APP1.atac.local
   use_backend APP1 if APP1

   default_backend _default

backend APP1
   redirect scheme https if !{ ssl_fc }
   mode http
   balance roundrobin
   cookie HAPROXY_SESSION insert indirect
   option httpchk HEAD /haproxy_test_page.php HTTP/1.0\nUser-Agent:\ HAProxy
   server SRV1 SRV1_IP:PORT cookie SRV1 check
   server SRV2 SRV2_IP:PORT cookie SRV2 check

SRV1を無効にするだけ(haproxy cliコマンドを使用)の場合、SRV1で開かれているすべてのアプリケーションセッションは、現在のHTTP "セッション"の終了後に中断します。そうですか?

Web管理インターフェースを使用して、サーバーをドレインモードにします。それはあなたが探している正確な機能を提供します。

6
austinian

socatを使用してhaproxy構成と通信する場合、サーバーを次のようにドレイン状態にすることができます。

echo "set server backend/serv state drain" | Sudo socat stdio /etc/haproxy/haproxysock

その他のコマンド ここ ! Ubuntuにsocatをインストールするには、この answer に移動します

私はhaproxy 1.6.3バージョンでそれをテストします:)

10

他の方法

サーバー間でセッションファイルを同期する(複数のサーバー間でファイルを同期する方法、または共通の単一マウントポイントが必要)

バックエンドサーバーでアプリケーションにPHP=)を使用している場合は、Memcacheを使用して、サーバー間でセッションを同期できます。

また、 Couchbase-Server は、そのままでmemcacheレプリケーションを実行できます。
もちろん、セッションのレプリケーションのためだけにcouchbase-serverを使用するのは一種のやり過ぎです:)

1
Cha0s