この記事はLiferay DXPで分散キャッシュを設定するオプションに書いて説明しています。このオプションはLiferay Digital Experience Platform (DXP)の主要なポータルテクノロジーです。
内容:
- 分散キャッシュの基本
- Liferayの分散キャッシュ方法
- 特定の設定
詳細
環境の条件によって、Liferay DXPは、キャッシュの実装方法が2種類あります:
- SingleVM Pool: キャッシュがLiferayの単一インスタンスに結びついている環境
- MultiVM Pool: キャッシュがクラスターのノード間に分散されてる環境
この記事では2つ目の設定、分散キャッシュについて解説しています。
分散キャッシュの設定には重要なステップが2つあります:
ディスカバリー: クラスター内のメンバー数を調べて、クラスター化されたサーバー間で通信リンクを作成できるようにします。
トランスポート: キャッシュ変更イベンントをサーバー間で送信します。
Liferayのプラットフォームではデフォルトの分散キャッシュはEhcacheです。 Ehcacheはディスカバリーとトランスポートの両方にClusterLinkと呼ばれるレプリケーションに効率的なアルゴリズムを使用します。LiferayのClusterLinkはJGroupsを内部テクノロジーとして利用しています。
この記事では、Liferayプラットフォーム専用の分散キャッシュの設定方法を説明しています。デフォルトでは、2つのプロトコル(UDP または TCP)を使用してネットワークへメッセージを送受信できます。ご使用の環境で、 UDP/マルチキャスティングを使用できない場合は、その他のユニキャストプロトコル・スタックを使用する必要があります。 (例:ディスカバリーにJDBC、 トランスポートにTCPを指定)
ehcache.cluster.link.replication.enabled=true
の両方が必要でしたが、これらはいずれもLiferay DXPでは必要がありません。Liferay DXPのクラスタリングのメカニズムに支障を来す可能性がありますので、Ehcache Clusterポートレットをアンデプロイし、プロパティーからportal-ext.propertiesを削除してください。詳細設定
以下では、分散キャッシュを実装する方法の様々な構成を詳細に説明していきます。 サンプルファイルが記載されていますが、ご使用の環境に合わせて調整する必要があります。
デフォルト(MPING + UDP/IP マルチキャスト)
-
portal-ext.propertiesを設定します
-
cluster.link.enabled=true
-
-
ネットワーク条件によってマルチキャストのアドレス/ポートを微調整します
下記の例を参考にしてください。(この例はportal.propertiesファイルから取得したファイルで、デフォルトで設定済みです。上記のように、ネットワーク構成によってはIPアドレスを適切に調整する必要があるかもしれません。)
## ## Multicast ## # Consolidate multicast address and port settings in one location for easier # maintenance. These settings must correlate to your physical network # configuration (i.e. firewall, switch, and other network hardware matter) # to ensure speedy and accurate communication across a cluster. # # Each address and port combination represent a conversation that is made # between different nodes. If they are not unique or correctly set, there # will be a potential of unnecessary network traffic that may cause slower # updates or inaccurate updates. # # # See the property "cluster.link.channel.properties.control". # multicast.group.address["cluster-link-control"]=239.255.0.1 #multicast.group.address["cluster-link-control"]=ff0e::8:8:1 multicast.group.port["cluster-link-control"]=23301 # # See the properties "cluster.link.channel.properties.transport.0" and # "cluster.link.channel.system.properties". # multicast.group.address["cluster-link-udp"]=239.255.0.2 #multicast.group.address["cluster-link-udp"]=ff0e::8:8:2 multicast.group.port["cluster-link-udp"]=23302 # # See the property "cluster.link.channel.system.properties". # multicast.group.address["cluster-link-mping"]=239.255.0.3 #multicast.group.address["cluster-link-mping"]=ff0e::8:8:3 multicast.group.port["cluster-link-mping"]=23303 # # See the properties "ehcache.multi.vm.config.location" and # "ehcache.multi.vm.config.location.peerProviderProperties". # multicast.group.address["multi-vm"]=239.255.0.5 multicast.group.port["multi-vm"]=23305
この設定では、MPINGをディスカバリーとして、UDPをトランスポートとして使用しています。一般的に UDPが使用できる場合は、その他のプロトコルを設定する必要はありません。
TCP トランスポート (ユニキャスト)
TCPをトランスポートに使用するには、ディスカバリーカスタムプロトコルを選択する必要があります。: JDBC_PING, TCP_PING, MPING, S3_PING (Amazon限定), RACKSPACE_PING (Rackspace限定)
1. portal-ext.propertiesの設定
cluster.link.enabled=true
(後ほど、cluster.link.channel.propertiesを追加します。)
2.全クラスターノードのIPアドレスをJVMパラメータを介して追加
-Djgroups.bind_addr=<node_address>
- Windowsの環境の場合これらのプロパティーは
setenv.bat
に追加されます。 - Linux/Unix環境では、プロパティーは
setenv.sh
に追加されます。
3. JDBC Discovery 設定ファイルを作成
tcp.xml
を抽出してクラスパスの任意の場所に配置します。 7zipなどのファイルアーカイバーを使ってtcp.xml
ファイルを抽出します。
$liferay_home/osgi/marketplace
へ行きます。Liferay Foundation.lpkg
パッケージを開きます。com.liferay.portal.cluster.multiple-[version number].jar
jarを開きます。- /
lib
フォルダで、jgroups-3.6.4.Final.jar
を開きます。 tcp.xml
tcp.xml ファイルはここにあります。
b. コピーをしたtcp.xmlファイルを “jdbc_ping_config.xml”と名前をつけます。
c. 上記のファイル内で、以下を探します。
<TCPPING async_discovery="true" initial_hosts="${jgroups.tcpping.initial_hosts:localhost[7800],localhost[7801]}" port_range="2"/>
上記のファイルを以下のように書き換えます。
<JDBC_PING connection_url="jdbc:mysql://[DATABASE_IP]/[DATABASE_NAME]?useUnicode=true&characterEncoding=UTF-8&useFastDateParsing=false" connection_username="DATABASE_USER" connection_password="[DATABASE_PASSWORD]" connection_driver="com.mysql.jdbc.Driver"/>
4.複数のチャネルでトランスポートを共有する (注: これは Liferay DXP 7.2 fixpack 1+ bundlesには使用し ない でください)
singleton_name="liferay_tcp_cluster"
を tcp.xmlのTCPタグに追加する
5. 以下のようにportal-ext.propertiesを追加してLiferayが設定ファイルを指すようにします:
cluster.link.channel.properties.control=[CONFIG_FILE_PATH]/jdbc_ping_config.xml
cluster.link.channel.properties.transport.0=[CONFIG_FILE_PATH]/jdbc_ping_config.xml
JDBC_PING 注意: データベースに表を作成する機能がない場合は、事前にJGROUPSPING表を作成する必要があります。詳細はJDBCPINGの資料を参照してください。
1. portal-ext.propertiesを設定する
cluster.link.enabled=true
(後の手順でcluster.link.channel.propertiesを設定します。)
2. VM パラメーターで全クラスターノードのIPアドレスを追加
-Djgroups.bind_addr=<node_address>
-Djgroups.tcpping.initial_hosts=<node1address>[port1],<node2address>[port2]...
- Windowsの環境の場合これらのプロパティーは
setenv.bat
setenv.batに追加されます。 - Linux/Unix環境では、プロパティー
setenv.sh
はsetenv.shに追加されます。
3. TCP検出設定ファイルの作成
a. tcp.xml
ファイルを抽出して任意の場所に配置します。
$liferay_home/osgi/marketplace
へ行きます。Liferay Foundation.lpkg
パッケージを開きます。com.liferay.portal.cluster.multiple-[version number].jar
を開きます。/lib
フォルダで、jgroups-3.6.4.Final.jar
を開きます。tcp.xml
ファイルはここにあります。
b. TCP_PINGはデフォルトの検出方法であるため、同じマシン上で複数のノードを実行する場合、変更する必要があるのはTCP bind_portのみです。
4. 複数のチャネルでトランスポートを共有する(注: これは Liferay DXP 7.2 fixpack 1+ bundlesには使用し ない でください)
tcp.xml内のTCPタグに singleton_name="liferay_tcp_cluster"
を追加します。
5. 以下のようにportal-ext.propertiesを追加してLiferayが設定ファイルを指すようにします:
cluster.link.channel.properties.control=[CONFIG_FILE_PATH]/tcp.xml
cluster.link.channel.properties.transport.0=[CONFIG_FILE_PATH]/tcp.xml
この設定はTCP_PINGをディスカバリーに、TCPをトランスポートに使用します。TCP_PINGでは事前にの全てのクラスターメンバーを指定する必要があります。これは自動検出プロトコルではありません(例: サポートされていないクラスターメンバーの追加/削除など)。
1. portal-ext.propertiesの設定
cluster.link.enabled=true
(後の手順でcluster.link.channel.propertiesを追加します。)
2. JVM パラメーターからクラスターノードのIPアドレスを追加する
-Djgroups.bind_addr=<node_address>
- Windowsの環境の場合これらのプロパティーは
setenv.bat
に追加されます。 - Linux/Unix環境では、プロパティーは
setenv.sh
に追加されます。
3. JDBC Discovery 設定ファイルを作成
a. tcp.xml
ファイルを抽出して、任意の場所へ配置します。
$liferay_home/osgi/marketplace
へ行きます。Liferay Foundation.lpkg
パッケージを開きます。com.liferay.portal.cluster.multiple-[version number].jar
ファイルを開きます。/lib
フォルダ内のjgroups-3.6.4.Final.jar
ファイルを開きます。tcp.xml
ファイルはここにあります。
b. コピーをしたtcp.xmlファイルを“jdbc_ping_config.xml”と名前をつけます。
c. 上記のファイル内で以下を探します。
<TCPPING async_discovery="true" initial_hosts="${jgroups.tcpping.initial_hosts:localhost[7800],localhost[7801]}" port_range="2"/>
上記のファイルを以下のように書き換えます。
<S3_PING secret_access_key="SECRETKEY" access_key="ACCESSKEY" location="ControlBucket"/>
4. 複数のチャネルでトランスポートを共有する (注: これは Liferay DXP 7.2 fixpack 1+ bundlesには使用し ない でください)
tcp.xml内のTCPタグにsingleton_name="liferay_tcp_cluster"
を追加する
5. 以下のようにportal-ext.propertiesを追加してLiferayが設定ファイルを指すようにします:
cluster.link.channel.properties.control=[CONFIG_FILE_PATH]/s3_ping_config.xml
cluster.link.channel.properties.transport.0=[CONFIG_FILE_PATH]/s3_ping_config.xml
追加情報
デバッグに役立つ設定
- 高レベルのテスト後、低レベルでテストする
一般的に、クラスターに関連するトラブルシュートには高レベルでテストをして機能性を検証し、次に低レベルでスタックの詳細確認します。- 高レベルの検証:
一つのノードからUIを通してコンテンツ。(ポートレットの追加、ユーザー情報の一部を変更等)を変更し、ページを更新後、他のノードでアクセスして変更が反映されているか確認します。反映されていたら検証は完了です。 - 低レベルテスティング:
MulticastServerToolを使用してネットワークにハートビートがあるか確認できます。これを使用するには:- [LIFERAY_HOME] フォルダ内に「Multicast」というフォルダを作成します。
- 作成した「Multicast」フォルダに以下の3クラスをコピーします:
CATALINA_BASE/lib/ext/portal-kernel.jar
CATALINA_BASE/webapps/ROOT/WEB-INF/lib/util-java.ja
CATALINA_BASE/webapps/ROOT/WEB-INF/lib/commons-logging.jar
- Multicast フォルダのコマンドプロンプトから、マルチキャストサーバーを呼び出します。デフォルト設定を使用している場合は、コマンドは以下の用になります:
java -cp util-java.jar;portal-kernel.jar;commons-logging.jar com.liferay.util.transport.MulticastServerTool 239.255.0.5 23305 5000
ネットワークにUDPが装備されている場合は、アウトプットに「ハートビート」が表示されます。
- 抽出したマルチキャストフォルダからMulticastClientToolを呼び出します。 デフォルト設定は以下の通りです:
java -cp util-java.jar;portal-kernel.jar;commons-logging.jar com.liferay.util.transport.MulticastClientTool -h 239.255.0.5 -p 23305
- 高レベルの検証:
- jgroupsロギングの追加
UI上から、org.jgroups.protocols.pbcastのlog4jログを全て有効にします。
これにより、制御チャネル(ハートビート)とトランスポートトラフィックの両方に関する詳細なステートメントがログに追加されます。Liferayのログに関しては、ユーザーガイドをご覧ください。
これで問題が解決せず、ネットワークがまだ潜在的な原因である場合、組み込みされているjgroupsテストクライアント/送信クラスを使用して、Liferayが適切に機能していることを確認できます。
- Proxy と Firewall のセッティングを確認
通常、これ以上のJGroups 設定は必要ありませんが、特殊なケースで、複数のネットワークにクラスターノードがでデプロイされている場合は、各ホストでファイアーウォールの外部(パブリックIP)アドレスにパラメータexternal_addr
を設定する必要があります。これを設定することで、異なるネットワーク(異なるファイアーウォールで区切られている場合など)にデプロイされたクラスターノードが相互に通信できるようになります。ただし、これはInfoSecからの監査が増える可能性があります。
JGroupsの資料をご覧ください。 - その他の参考リンク