この記事の目的は、セッションレプリケーションを持つ基本的なTomcatクラスタをセットアップすることです。 真のセッションレプリケーションのためには、トラフィックをノードにリダイレクトするロードバランサーが存在しなければなりません。 ロードバランサーの設定方法については、本記事では解説していません。 ロードバランサーの設定方法については、ベンダーのドキュメント(例:Apache.)を参照してください。
また、クラスタリングに必要な分散キャッシングやインデックスレプリケーションについては、本記事では扱っていない。 クラスタ環境での Liferay Portal のインストールの記事をご参照ください。
すべてのノードが同じ時刻であることを確認し、 NTP サービスで同期します。
注意:Tomcatでセッションレプリケーションを実現する方法はこれだけではありません。 memcached など、他の方法もあります。
解決
以下の手順で、適切なセットアップ手順を説明します。
1. ${TOMCAT_HOME}/conf/server.xml
の Engine セクションに jvmRoute
の値を追加します。
このような感じになります:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="worker1">
具体的には、"worker1 "は割り当てられた名前であり、任意の英数字を使用することができます: [a-z][A-Z][0-9][_\-]
Tomcatインスタンスが同じマシンで動作している場合、 tcpListenPort
属性が各インスタンスでユニークであることを確認します。 ほとんどの場合、Tomcatは賢いので、4000-4100の範囲で利用可能なポートを自動検出し、自分で解決することができます。 これは、 server.xml
で設定されます。
2. Engineの <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" />
を以下の行に置き換えてください:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8"> <Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/> <Channel className="org.apache.catalina.tribes.group.GroupChannel"> <Membership className="org.apache.catalina.tribes.membership.McastService" address="228.0.0.4" port="45564" frequency="500" dropTime="3000"/> <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="auto" port="4000" autoBind="100" selectorTimeout="5000" maxThreads="6"/> <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> </Sender> <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/> </Channel> <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/> <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/> <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/" watchDir="/tmp/war-listen/" watchEnabled="false"/> <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/> <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> </Cluster>
3. ${TOMCAT_HOME}/webapps/ROOT/WEB-INF/web.xml
<distributable />
タグを <webapps>
タグの中に追加する。
4. ${APACHE_HOME}/conf/workers.properties
に、ワーカー情報を追加します。
このような感じになるはずです:
worker.list=balancer worker.worker1.port=8009 worker.worker1.host=${WORKER1_IP_ADDRESS/DOMAIN} worker.worker1.type=ajp13 worker.worker1.lbfactor=1 worker.worker2.port=8009 worker.worker2.host=${WORKER2_IP_ADDRESS/DOMAIN} worker.worker2.type=ajp13 worker.worker2.lbfactor=1 worker.balancer.type=lb worker.balancer.balance_workers=worker1,worker2 worker.loadbalancer.sticky_session=1 worker.balancer.method=B
名前に "worker1 "が使われていることにご注目ください。 これは、最初のステップで設定した jvmRoute
の値と同じです。 前述したように、この値は任意の英数字を使用することができます。 しかし、構成全体を通して一貫性を保たなければなりません。.
2つ以上のノードがある場合は、"worker3"、"worker4 "などのように、適切な値で追加のエントリを作成します。
5. Liferay バンドルの portal-ext.properties
ファイルに、以下を追加します:
redirect.url.security.mode=domain web.server.display.node=true
注意:最初のプロパティは、AUIボタンのようなものがApache Serverで機能することを可能にします。 2つ目のプロパティは、ノードIDをフッターとして表示させるものです。 この2つの特性は、セッションレプリケーションとは無関係です。 セッションレプリケーションの設定に関するLiferayサポートの支援は限定的です。
6. 2番目のノードと他のすべてのノードについて、この手順を繰り返します。 クラスタ設定 を portal-ext.properties
で必ず定義してください ;すべてのノードが同じデータベースを指すように、同じデータベース接続を設定します。 データベースの選択はユーザー次第であり、Liferayはこの件に関して基本的な支援しかできません。
7. サーバーを順次起動する。 クラスタノードは、どのノードがマスターノードかを判断する処理に時間がかかるため、同時に起動することはできません。
8. ロードバランサーのWebサーバーを起動します。
9. Web サーバーの IP アドレスまたはドメイン名にアクセスします。 Webサーバーは、リクエストを1つのノードにリダイレクトします。 ページ、ユーザー、またはアセットを作成します。
10. 1つのノードをシャットダウンします。 トラフィックが2番目のノードに自動的にリダイレクトされ、ページ、ユーザー、アセットが2番目のノードに表示されることを確認します。
メモ
- セッションの状態はクッキーによって追跡されるため、外部から同じように見えるURLでなければ、新しいセッションが作成されます。
- すべてのセッション属性は
java.io.Serializable
を実装する必要があります。 - カスタムクラスターバルブが定義されている場合、 ReplicationValve が
server.xml
の Cluster 要素の下に同様に定義されていることを確認します。 - ClusterモジュールはTomcatのJULIロギングフレームワークを使用しているので、ロギングは通常の
logging.properties
ファイルで設定することができます。 メッセージを追跡するには、キーでロギングを有効にします:org.apache.catalina.tribes.MESSAGES