legacy-knowledge-base
公開されました Sep. 10, 2025

Liferay Portal EEで分散キャッシュを管理する。

written-by

Brett Ripley

How To articles are not official guidelines or officially supported documentation. They are community-contributed content and may not always reflect the latest updates to Liferay DXP. We welcome your feedback to improve How To articles!

While we make every effort to ensure this Knowledge Base is accurate, it may not always reflect the most recent updates or official guidelines.We appreciate your understanding and encourage you to reach out with any feedback or concerns.

legacy-article

learn-legacy-article-disclaimer-text

Liferay Supportは、特定のサードパーティ製品を他の製品よりも推奨または承認するものではありません。 Liferayは、これらの製品に関して、ここに記載または参照されているいかなる指示に対しても責任を負いません。 これらの原則の実行は、加入者の責任において行われるものとします。

環境のニーズに応じて、Liferay Portalにはキャッシュの実装方法が2つあります:

  1. SingleVMプール:キャッシュがLiferayの単一インスタンスに紐づいている環境向け。
  2. MultiVM Poolです:クラスタ内の異なるノードにキャッシュが分散されている環境向け。

この記事では、後者のオプションであるMultiVM Distributed Cachingの構成オプションについて説明します。

コンテンツ

  1. 分散キャッシュの基礎知識
    1. Liferayの分散キャッシングの仕組み
  2. コンフィギュレーションの概要
    1. 6.1 GA3および6.2
    2. 6.1 GA2以前
  3. 具体的な構成
    1. デフォルト(MPING+UDP)
    2. TCPトランスポート
      1. JDBC PING
      2. TCP PING
      3. S3 PING

対象製品

Liferay Portal 6.0 EE SP2; 6.1.x EE; 6.2.x EE

解像度

分散キャッシュの基礎知識

分散キャッシュは、2つの明確で重要なステップが必要です:

ディスカバリー: クラスタ化されたサーバー間で通信リンクを作成できるように、クラスタ内に何人のメンバーがいるかを見つけること。

Transport: サーバー間でキャッシュチェンジイベントやキャッシュオブジェクトを送信する。

Liferayのデフォルトの分散キャッシュの実装はEhcacheです。 Ehcacheは、いくつかのアルゴリズムのうちの1つを使用するように設定することができます:

  1. アルゴリズム1(デフォルト)
    1. Discovery: UDP/IPマルチキャスト
    2. トランスポート: RMI/TCP/IP ユニキャスト
  2. アルゴリズム2(JGroups):
    1. Discovery: ユーザーが選択可能
    2. トランスポート: ユーザーが選択可能
      • アルゴリズム2は、設定ファイルをキャッシュするための特別な設定が必要であることに注意してください。

Liferay Enterprise Edition内では、レプリケーションのための第3の、より効率的なアルゴリズムが存在します。 このアルゴリズムは、 LiferayのClusterLink層 を発見と転送の両方に利用しています。 LiferayのClusterLinkは、その基盤技術にJGroupsを内部的に使用しています。

コンフィギュレーションの概要

この概要では、Liferayの分散キャッシュを構成するための一般的な手順を作成しました。 より具体的な説明は、以下の「特定の構成」の見出しを参照してください。

I. Liferay Portal 6.1 GA3および6.2

  1. portal-ext.properties を設定します( Liferay ユーザーガイドに準じます)。
    • ehcache.cluster.link.replication.enabled=true
    • cluster.link.enabled=true
  2. ehcache-cluster-web.warをデプロイする。
    • マルチキャスト通信の場合は、この手順だけでOKです。 ただし、ユニキャストの場合は、手順3~5を続けてください。
  3. 必要なJVMパラメータを追加する
    • -Djgroups.bind_addr=<node_address>
    • -Djgroups.tcpping.initial_hosts=<node1address>[port1],<node2address>[port2]...
  4. ディスカバリープロトコルに基づくコンフィギュレーションファイルの作成
    • CATALINA_BASEwebapps\ROOTWEB-INF\lib\jgroups.jar から tcp.xml を取り出し、目的の発見プロトコルに合わせて調整することで実現します(以下に各方法の詳細を示します)。 相対パスを使用する場合は、 tcp.xml がクラスパス上にコピーされていることを確認する (CATALINA_BASEwebapps\ROOTWEB-INF 0001).
  5. 次の portal-ext.propertiesで、Liferay を設定ファイルに指し示します:
    • cluster.link.channel.properties.control=[CONFIG_FILE_PATH]/control_file.xml
    • cluster.link.channel.properties.transport.0=[CONFIG_FILE_PATH]/transport_file.xml

II. Liferay Portal 6.1 GA2以前のバージョン。

  1. portal-ext.properties を設定します( Liferay ユーザーガイドに準じます)。
    • ehcache.cluster.link.replication.enabled=true
    • cluster.link.enabled=true
  2. ehcache-cluster-webをデプロイする。
    • マルチキャスト通信の場合は、この手順だけでOKです。 ただし、ユニキャストの場合は、手順3~5を続けてください。
  3. 必要なJVMパラメータを追加する。
    • -Djgroups.bind_addr=<node_IP_address>
    • -Djgroups.tcpping.initial_hosts=<node1address>[port1],<node2address>[port2]...
    • Liferay 6.1以下では、以前のJGroups-IPv6互換性のため、 -Djava.net.preferIPv4Stack=true を追加する必要があります。
  4. ディスカバリープロトコルに基づくコンフィギュレーションファイルの作成
    • CATALINA_BASEwebapps\ROOTWEB-INF\lib\jgroups.jar から tcp.xml を取り出し、目的の発見プロトコルに合わせて調整することで実現します(以下に各方法の詳細を示します)。 相対パスを使用する場合は、 tcp.xml がクラスパス上にコピーされていることを確認する (CATALINA_BASEwebapps\ROOTWEB-INF 0001).
  5. 以下の portal-ext.properties で Liferay を設定ファイルに指し示します:
    • cluster.link.channel.properties.control=[CONFIG_FILE_PATH]/control_file.xml
    • cluster.link.channel.properties.transport.0=[CONFIG_FILE_PATH]/transport_file.xml
  6. (Liferay6.1の場合): liferay-multi-vm-clustered.xmlhibernate-clustered.xml ファイルを変更するために、キャッシュ設定フック を作成します。
    • liferay-multi-vm-clustered LPS-28163.
      (例: EntityCache と com の間に以下のように "..." が表示されることがある。

      <cache
      eternal="false"
      maxElementsInMemory="100000"
      name="comliferayportalkerneldaoormEntityCachestrongstrongcomliferayportalmodelimplResourceActionImpl"
      overflowToDisk="false"
      timeToIdleSeconds="600"
      >

    • SocialEquitySettingLocalServiceImpl は Liferay 6.0 以下で、 SocialActivitySettingLocalServiceImpl は Liferay 6.1 EE 以上で呼び出す必要があります。

セットアップの概要

上記の手順をまとめると、UDP/マルチキャストをサポートしている環境であれば、必要な設定はマルチキャスト通信のポート設定のみとなります。 ただし、UDP/マルチキャストを利用できない環境では、別のユニキャストプロトコルスタックを利用する必要があります(例:ディスカバリーにJDBC、トランスポートにTCP)。

具体的な構成

以下は、分散キャッシュの実装方法別の具体的な構成である。 サンプルファイルが含まれていますが、あなたの環境に合わせて微調整する必要があることに留意してください。

デフォルト(MPING + UDP/IP Multicast)

  1. portal-ext.propertiesを設定する
    • cluster.link.enabled=true
    • ehcache.cluster.link.replication.enabled=true
  2. ehcache-cluster-webをデプロイする。
  3. ネットワークの仕様に合わせてマルチキャストアドレス/ポートを調整する

例をご覧ください(デフォルトで運用されているportal.propertiesファイルから引用しています)。 上記のように、IPアドレスはネットワークによって微調整が必要な場合があります)。

本構成では、ディスカバリーにMPINGを、トランスポートにUDPを使用します。 一般に、 UDPが使用できれば、他のプロトコルを使用したり設定したりする必要はない。

TCPトランスポート

トランスポートにTCPを使用する場合は、カスタムディスカバリープロトコルを選択する必要があります:JDBC_PING、TCP_PING、MPING、S3_PING(Amazonのみ)、RACKSPACE_PING(Rackspaceのみ)。

JDBC_PING

JDBC PINGは、Liferay 6.2以上(および platform-12-6130 以上のフィックスパックをインストールしたLiferay 6.1 EE GA3)でしか利用できないことに注意してください。これらのバージョンでは、JGroups 3.2.6 を使用するからです。

  1. portal-ext.propertiesを設定する
    1. cluster.link.enabled=true
    2. ehcache.cluster.link.replication.enabled=true
    3. (後のステップで cluster.link.channel.properties を追加する予定です。)
  2. ehcache-cluster-webプラグインをデプロイする。
  3. 必要なJVMパラメータを追加する
    1. -Djgroups.bind_addr=<node_address>
    2. -Djgroups.tcpping.initial_hosts=<node1address>[port1],<node2address>[port2]...
    3. Windows 環境の場合、これらのプロパティは setenv.batに追加されます。 Linux/Unix 環境では、プロパティを setenv.shに追加することができます。
  4. JDBC Discovery設定ファイルの作成
    1. CATALINA_BASEwebapps から tcp.xml\ROOT\WEB-INF\lib\jgroups.jar を取り出し、クラスパスのどこかに配置する。
    2. コピーした tcp.xml ファイルを jdbc_ping_config.xmlにリネームします。
    3. ファイル内で、置き換える:
      <TCPPING timeout="3000"
      initial_hosts="${jgroups.tcpping.initial_hosts:localhost[7800],localhost[7801]}"
      port_range="1
      num_initial_members="3"/>
      					
      を持つ:
      <JDBC_PING
      connection_url="jdbc:mysql://[DATABASE_IP]/[DATABASE_NAME]?useUnicode=true&amp;characterEncoding=UTF-8&amp;useFastDateParsing=false"
      connection_username="DATABASE_USER"
      connection_password="[DATABASE_PASSWORD]"
      connection_driver="com.mysql.jdbc.Driver"/>
      				
  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

最後に、データベース・ユーザーにテーブルを作成する能力がない場合、事前にJGROUPSPINGテーブルを手動で作成する必要があります。 詳しくは、JDBCPINGのドキュメントをご覧ください。

TCP_PING

  1. portal-ext.propertiesを設定する
    1. cluster.link.enabled=true
    2. ehcache.cluster.link.replication.enabled=true
    3. (後のステップで cluster.link.channel.properties を追加する予定です。)
  2. ehcache-cluster-webプラグインをデプロイする。
  3. 必要なJVMパラメータを追加する
    1. -Djgroups.bind_addr=<node_address>
    2. -Djgroups.tcpping.initial_hosts=<node1address>[port1],<node2address>[port2]...
    3. Windows 環境の場合、これらのプロパティは setenv.batに追加されます。 Linux/Unix 環境では、プロパティを setenv.shに追加することができます。
  4. TCPディスカバリー設定ファイルの作成
    1. CATALINA_BASEwebapps から tcp.xml\ROOT\WEB-INF\lib\jgroups.jar を取り出し、クラスパスのどこかに配置する。
    2. ファイルをコピーし、1つのコピーをリネームする tcp_ping_control.xml. もう一方のコピー tcp_ping_transport.xmlの名前を変更します。
    3. TCP_PINGはデフォルトの検出方法なので、修正するのは以下の設定だけです。 HostAとHostBを例として挙げている
      1. TCP bind_port
      2. のIPアドレス/ポートが表示されます。
        1. <TCPPING timeout="3000"
        2. initial_hosts="HostA[7800],HostB[7801]"
        3. port_range="1"
        4. num_initial_members="3"/>
    4. singleton_name="liferay_tcp_cluster"TCP タグに追加します。
  5. 以下の portal-ext.properties を追加して、Liferay を設定ファイルに指し示します:
    1. cluster.link.channel.properties.control=[CONFIG_FILE_PATH]/tcp_ping_control.xml
    2. cluster.link.channel.properties.transport.0=[CONFIG_FILE_PATH]/tcp_ping_transport.xml

本構成では、ディスカバリーにTCP_PING、トランスポートにTCPを使用します。 TCP_PINGの場合は、クラスタの全メンバーを事前に指定する必要があります。 自動検出プロトコルではありません(例:クラスタのメンバーの追加・削除はサポートされません)。

S3_PING

  1. portal-ext.propertiesを設定する
    1. cluster.link.enabled=true
    2. ehcache.cluster.link.replication.enabled=true
    3. (後のステップで cluster.link.channel.properties を追加する予定です。)
  2. ehcache-cluster-webプラグインをデプロイする。
  3. 必要なJVMパラメータを追加する
    1. -Djgroups.bind_addr=<node_address>
    2. -Djgroups.tcpping.initial_hosts=<node1address>[port1],<node2address>[port2]...
    3. Windows 環境の場合、これらのプロパティは setenv.batに追加されます。 Linux/Unix 環境では、プロパティを setenv.shに追加することができます。
  4. S3 Discovery設定ファイルの作成
    1. CATALINA_BASEwebapps から tcp.xml\ROOT WEB-INF\lib\jgroups.jar を抜き出し、見やすい場所に置く。
    2. コピーした tcp.xml ファイル s3_ping_config.xmlをリネームします。
    3. ファイル内で、置き換える:
      1. <TCPPING timeout="3000" initial_hosts="HostA[7800],HostB[7801]" port_range="1" num_initial_members="3"/>
      1. <S3_PING secret_access_key="SECRETKEY" access_key="ACCESSKEY" location="ControlBucket"/>
  5. 次の portal-ext.properties を追加して、Liferay を設定ファイルに指し示します
    1. cluster.link.channel.properties.control=[CONFIG_FILE_PATH]/s3_ping_config.xml
    2. cluster.link.channel.properties.transport.0=[CONFIG_FILE_PATH]/s3_ping_config.xml

s3_ping_config.xmlLiferay 6.1 の設定ファイルのサンプルを以下に示します。

本構成では、ディスカバリーにS3_PINGを使用し、トランスポートにTCPを使用しています。 S3_PINGは、Amazon Web Servicesにのみ適用されます。

追加情報

デバッグのヒント

高水準のテスト、次に低水準のテスト

一般的なルールとして、クラスタリングの問題をトラブルシューティングする最善の方法は、高いレベルでテストして機能を確認し、低いレベルでスタックを歩き回ることです。

  1. ハイレベルな検証を行う:
    1. UIで1つのノードのコンテンツを変更し(ポートレットを追加、ユーザープロファイルのフィールドを変更)、ページ更新後に別のノードに表示されるかどうかを確認します。 うまくいったら終了です。
  2. ローレベルのテスト:
    1. MulticastServerToolは、ネットワーク上にハートビートが存在するかどうかを判断するために使用することができる。 本ツールを活用するために
      1. ~[LIFERAY_HOME~] フォルダ内に Multicastcode というフォルダを作成します。
      2. 次の3つのクラスをMulticastcodeフォルダにコピーしてください:
        1. CATALINA_BASE~/webapps~/ROOT~/WEB-INF~/lib~/commons-logging.jar
        2. CATALINA_BASE~/webapps~/ROOT~/WEB-INF~/lib~/util-java.ja
        3. CATALINA_BASE~/lib~/ext~/portal-service.jar
      3. Multicastcodeフォルダのコマンドプロンプトから、マルチキャストサーバツールを呼び出します。 デフォルトの設定であれば、コマンドはこうなります:
        1. java -cp util-java.jar;portal-service.jar;commons-logging.jar com.liferay.util.transport.MulticastServerTool 239.255.0.5 23305 5000code
      4. ネットワークにUDPが装備されていれば、出力に「心拍数」が表示されるはずです:
      5. 同様に、MultiCastClientToolは、クラスタ上の異なるノードの同じフォルダから呼び出すことができます。
      6. 解凍したマルチキャストフォルダから、MulticastClientToolを呼び出します。 初期設定の場合、このようになります:
        1. java -cp util-java.jar;portal-service.jar;commons-logging.jar com.liferay.util.transport.MulticastClientTool -h 239.255.0.5 -p 23305
      7. 出力については、 com.liferay.util.transport.MulticastDatagramHandler の処理 と、その下の文字が変化していることが確認できるはずです。
    2. デバッグ用プロパティを追加する
      1. cluster.executor.debug.enabled~=truecode
      2. このプロパティは、クラスタのJOIN~/DEPARTイベントbに関する非常に有用な情報を記録します。 小規模なクラスタでは、このような事象は十分に稀であるため、このプロパティは実稼働時に残されている可能性があります。
    3. jgroups Loggingの追加
      1. org.jgroups.protocols.pbcastcode で log4jcode のロギングを ALL (UIから) に変更する。
      2. これにより、制御チャネル(ハートビート)およびトランスポートトラフィックの両方に関するログに冗長な記述が追加されます。 Liferay のロギングについては、ユーザーガイドを参照してください。
      3. 問題が解決せず、ネットワークが原因である可能性がある場合、組み込みのjgroups test client~/senderクラスを使用して、ポータルが適切に機能していることを確認することができます。
    4. プロキシとファイアウォールの設定を確認する
      1. 通常、これ以上のJGroupsの設定は必要ありません。 ただし、非常に特殊なケースとして、クラスタノードが複数のネットワークにまたがって配置されている場合(に限り)、各ホストでパラメータ external_addrcode をファイアウォールの外部(パブリックIP)アドレスに設定する必要があります。 これを設定することで、別々のネットワーク(異なるファイアウォールで隔てられているなど)に配置されたクラスターノードが一緒に通信できるようになります。 しかし、これはより多くのInfoSec audits.JGroups documentationを引き起こす可能性があります。
    5. お役立ちリンク集
      1. JGroups Toolkitによる信頼性の高いマルチキャスティング
      2. 既知の問題点NACKACKがメモリリークを起こす可能性がある。
      3. Ehcache: http:~//www.ehcache.org~/documentation~/user-guide~/configuration
did-this-article-resolve-your-issue

legacy-knowledge-base