3

現在、Tomcat サーバーにデプロイされている websocket アプリケーションを開発しています。ユーザー数が非常に多いため、ワークロードを複数の Tomcat インスタンスに分散したいと考えています。負荷分散には Apache を使用することにしました。

現在、Websockets リクエストの Apache ロード バランシングとスティッキー セッションの実装に問題があります。これは私のApache構成です:

ProxyRequests off
SSLProxyEngine on
RewriteEngine On

<Proxy balancer://http-localhost/>
    BalancerMember  https://mcsgest1.desy.de:8443/Whiteboard/ route=jvm1 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900
    BalancerMember  https://mcsgest1.desy.de:8444/Whiteboard/ route=jvm2 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900
    ProxySet lbmethod=byrequests
    ProxySet stickysession=JSESSIONID|sid scolonpathdelim=On
</Proxy>

<Proxy balancer://ws-localhost/>
    BalancerMember  wss://mcsgest1.desy.de:8443/Whiteboard/ route=jvm1 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900
    BalancerMember  wss://mcsgest1.desy.de:8444/Whiteboard/ route=jvm2 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900
    ProxySet lbmethod=byrequests
    ProxySet stickysession=JSESSIONID|sid scolonpathdelim=On
</Proxy>

RewriteCond       %{HTTP:Upgrade} =websocket
RewriteRule       /jddd/(.*)      balancer://ws-localhost/$1 [P,L]
ProxyPassReverse  /jddd/          balancer://ws-localhost/
RewriteCond       %{HTTP:Upgrade} !=websocket
RewriteRule       /jddd/(.*)      balancer://http-localhost/$1 [P,L]
ProxyPassReverse  /jddd/          balancer://http-localhost/

最初の https 要求はポート 8443 に分散されます。アップグレードされた wss 要求も 8443 に転送されます。

2 番目の https 要求には、最初の要求のセッション ID が含まれています: https://...&sid=C28C13EEEC525D203F8CA4E827605E0B.jvm1

Apache ログ ファイルで確認できるように、このセッション ID は stickySession に対して評価されます。

...stickysession sid の値 C28C13EEEC525D203F8CA4E827605E0B.jvm1 が見つかりました

...見つかったルート jvm1

...balancer://http-localhost: ワーカー (htttps://mcsgest1.desy.de:8443/Whiteboard/) が htttps://mcsgest1.desy.de:8443/Whiteboard//?file=octocenter に書き換えられました。 xml&address=///&sid=C28C13EEEC525D203F8CA4E827605E0B.jvm1

2 番目の https 要求はポート 8443 のままですが、websocket プロトコルにアップグレードした後、ws-balancer は sessionID を評価せず、8444 に書き換えます。

...balancer://ws-localhost: ワーカー (wss://mcsgest1.desy.de:8444/Whiteboard/) が wss://mcsgest1.desy.de:8444/Whiteboard//whiteboardendpoint に書き換えられました

wss プロトコルでも stickysession を有効にするには、Apache 構成で何を変更する必要がありますか? Websocket のバランスを取るには、本当に 2 つのバランサー (http と ws) が必要ですか?

4

1 に答える 1