無数のブログ投稿、フォーラム トピック、そしてもちろん SO の質問を読むのに何日も費やした後、Amazon EC2 に合わせてユニキャスト TCP を使用して、Liferay 6.2 クラスターでキャッシュ レプリケーションを最終的に構成する方法をここに要約したいと思います。
JGroups 構成
キャッシュ レプリケーション用に Liferay を設定する前に、Liferay が JGroups チャネルに依存していることを理解する必要があります。基本的に、JGroups を使用すると、リモート インスタンスを検出して通信できます。デフォルトでは (少なくとも Liferay では)、マルチキャスト UDP を利用してこれらの目標を達成します。詳細については、 JGroups の Web サイトを参照してください。
ユニキャスト TCP を有効にするには、最初jgroups.jar
に Liferay webapp から JGroups の TCP 設定ファイルを取得する必要があります ( $LIFERAY_HOME/tomcat-7.0.42/webapps/ROOT/WEB-INF/lib/jgroups.jar
. このファイルを、Liferay webapp のクラスパスで利用可能な場所に抽出します。と言う$LIFERAY_HOME/tomcat-7.0.42/webapps/ROOT/WEB-INF/classes/custom_jgroups/tcp.xml
。このパスに注意してください。
この構成を Liferay クラスターで機能させるには、タグにsingleton_name="liferay"
属性を追加するだけです。TCP
<config xmlns="urn:org:jgroups"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:org:jgroups http://www.jgroups.org/schema/JGroups-3.1.xsd">
<TCP singleton_name="liferay"
bind_port="7800"
loopback="false"
...
お気づきかもしれませんが、
A. この構成ファイルでは、リッスンするバインド アドレスが指定されていません。
B. クラスタの初期ホストは、システム プロパティを介して設定する必要があります。
$LIFERAY_HOME/tomcat-7.0.42/bin/setenv.sh
実際には、次の JVM システム プロパティを追加するために変更する必要があります。
-Djava.net.preferIPv4Stack=true
-Djgroups.bind_addr=192.168.0.1
-Djgroups.tcpping.initial_hosts=192.168.0.1[7800],80.200.230.2[7800]
バインド アドレスは、リッスンするネットワーク インターフェイスを定義します (JGroups ポートは、TCP 構成ファイルで 7800 に設定されています)。初期ホスト プロパティには、クラスターのすべての単一インスタンスが含まれている必要があります(詳細については、JGroups ドキュメントの TCPPING および MERGE2 を参照してください)。リモート インスタンスは、ホスト名、ローカル アドレス、またはパブリック アドレスで参照できます。
(ヒント: Amazon EC2 で Liferay クラスターをセットアップしている場合、再起動するたびにインスタンスのローカル IP アドレスとホスト名が異なる可能性があります。これを回避するには、setenv.sh のローカル アドレスをhostname コマンドの結果: `hostname`
-- バッククォートに注意してください)
(ヒント: EC2 でセキュリティ グループを使用する場合は、同じセキュリティ グループ内のすべてのインスタンスに対してポート 7800 を開くことも確認する必要があります)
ライフレイ構成
JGroups レプリケーションは、次のプロパティを portal-ext.properties に追加することで、Liferay で有効になります。
# Tells Liferay to enable Cluster Link. This sets up JGroups control and transport channels (necessary for indexes and cache replication)
cluster.link.enabled=true
# This external address is used to determine which network interface must be used. This typically points to the database shared between the instances.
cluster.link.autodetect.address=shareddatabase.eu-west-1.rds.amazonaws.com:5432
ユニキャスト TCP 用に JGroups を設定するには、正しいファイルを指定するだけです。
# Configures JGroups control channel for unicast TCP
cluster.link.channel.properties.control=/custom_jgroups/tcp.xml
# Configures JGroups transport channel for unicast TCP
cluster.link.channel.properties.transport.0=/custom_jgroups/tcp.xml
同じファイルで、Lucene インデックスのレプリケーションには次の 1 つのプロパティが必要です。
# Enable Lucene indexes replication through Cluster Link
lucene.replicate.write=true
EhCache キャッシュのレプリケーションはより微妙です。Hibernate キャッシュと Liferay の内部キャッシュの両方に JGroups を設定する必要があります。この構成を理解するには、Liferay 6.2 以降、デフォルトのEhCache 構成ファイルが「クラスター化」されていることを知っておく必要があります (これらのプロパティを設定しないでください)。
# Default hibernate cache configuration file
net.sf.ehcache.configurationResourceName=/ehcache/hibernate-clustered.xml
# Default internal cache configuration file
ehcache.multi.vm.config.location=/ehcache/liferay-multi-vm-clustered.xml
これらの構成ファイルは両方とも、有効な JGroups を設定する必要がある EhCache ファクトリに依存しています。
# Enable EhCache caches replication through JGroups
ehcache.bootstrap.cache.loader.factory=com.liferay.portal.cache.ehcache.JGroupsBootstrapCacheLoaderFactory
ehcache.cache.event.listener.factory=net.sf.ehcache.distribution.jgroups.JGroupsCacheReplicatorFactory
ehcache.cache.manager.peer.provider.factory=net.sf.ehcache.distribution.jgroups.JGroupsCacheManagerPeerProviderFactory
JGroups のキャッシュ マネージャー ピア プロバイダー ファクトリはfile
、JGroups 構成を含むパラメーターを予期します。ユニキャスト TCP 構成ファイルを指定します。
# Configure hibernate cache replication for unicast TCP
net.sf.ehcache.configurationResourceName.peerProviderProperties=file=/custom_jgroups/tcp.xml
# Configure internal caches replication for unicast TCP
ehcache.multi.vm.config.location.peerProviderProperties=file=/custom_jgroups/tcp.xml
(ヒント:疑問がある場合は、プロパティの定義とデフォルト値を参照してください: https://docs.liferay.com/portal/6.2/propertiesdoc/portal.properties.html )
デバッグ
さらに、次の方法でデバッグ トレースを有効にできます。
cluster.executor.debug.enabled=true
リクエストを処理したノードの名前をすべてのページに表示するように Liferay に指示することもできます。
web.server.display.node=true
最後に、JGroups チャネルは、プローブ ツールを通じて利用可能な診断サービスを公開します。
最後の注意事項
これはインデックスとキャッシュ レプリケーションのみを対象とすることに注意してください。Liferay クラスターをセットアップするときは、次のセットアップも検討する必要があります。
- 共有データベース (RDS on AWS)、
- 共有DocumentLibrary (AWS 上の S3 または RDS)、
- Tomcat でのセッション レプリケーション、
- Liferay の使用方法によっては、さらに多くの可能性があります。