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


13

問題

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

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

haproxyの動作

  • サーバーを「メンテナンス中」に設定しました
  • クライアントに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

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


サーバーはHTTPモードまたはTCPモードで実行されていますか?
オースティン

1
@austinian; Cookieに基づいた分散と永続性について話していると思われるhttpモード(TCPモードではこのような機能は提供されません)。
GregL

@Christophe、「haproxy behaviour」セクションで説明されている設定を実際に試しましたか?
GregL

@GregL、そうです、それも私が考えていることです。HTTPモードを使用しており、サーバーをメンテナンスモードに設定するだけの場合、新しいセッションの受け入れは停止しますが、有効なセッションは有効期限が切れるまで維持されます。TCPモードでもCookieなどを保持できますが、HAProxyには何の意味もありません。
オースティン

@Christophe、「より賢い方法」を使用してメンテナンス時間を短縮しようとしていますか、またはメンテナンスを待つ間にセッションを正常に終了する方法を探していますか?
オースティン

回答:


6

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


3
あなたはメイントに設定した場合は、送信を停止するために起こっている任意の概説として、それへのトラフィックをここに。むしろ、彼はそれをドレインモードに入れstick-table、永続性を提供するためにaの有効期限を使用したいでしょう。
GregL

@GregL、おっと、今すぐ修正
オースティン

回答ありがとうございます。オーストラリア人と@GredL。やってみます。難しい部分はスティックテーブルにあると思います。このスティックテーブルで、ドレインモードサーバーに設定されたCookieを持つすべてのクライアントを保存する方法を見つける必要があります。
クリストフドレヴェドロゲ

私の場合、ドレインモードで十分だと思われます。Cookieが既に設定されているセッションでは、引き続きドレインされたサーバーが使用され、新しいセッションは他のサーバーに転送されます。
クリストフドレヴェドロゲ

1
Webインターフェースのモードをどのように変更しますか?単なる情報提供のようです。
kagronick

9

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

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

その他のコマンドはこちら!Ubuntuにsocatをインストールするには、この回答にアクセスしてください

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


1

他の方法

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

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

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


より良い方法ですが、コードの変更が必要だと思います。そこで、セッションを同期しない現在のアプリケーションに対する回答として、オーストラリアンとGregLを使用します。
クリストフドレヴェドロゲ

コードでカスタムセッションハンドラを設定しない場合、セッションでmemcacheを使用するためにPHPのコードを変更する必要はありません。コードではなく、すべてphp.iniで構成されます。
Cha0s

OK、Cha0s、私はそれを見ます。
クリストフドレヴェドロゲ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.