Liferay DXPの分散キャッシュの管理方法

 この記事はLiferay DXPで分散キャッシュを設定するオプションに書いて説明しています。このオプションはLiferay Digital Experience Platform (DXP)の主要なポータルテクノロジーです。 

内容: 

  1. 分散キャッシュの基本
    1. Liferayの分散キャッシュ方法
  2. 特定の設定
    1. デフォルト (MPING + UDP/IP マルチキャスト)
    2. TCP トランスポート (Unicast)
      1. JDBC PING
      2. TCP PING
      3. S3 PING

詳細

環境の条件によって、Liferay DXPは、キャッシュの実装方法が2種類あります:

  • SingleVM Pool: キャッシュがLiferayの単一インスタンスに結びついている環境
  • MultiVM Pool: キャッシュがクラスターのノード間に分散されてる環境

この記事では2つ目の設定、分散キャッシュについて解説しています。

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

分散キャッシュの設定には重要なステップが2つあります:

ディスカバリー: クラスター内のメンバー数を調べて、クラスター化されたサーバー間で通信リンクを作成できるようにします。

トランスポート: キャッシュ変更イベンントをサーバー間で送信します。

 

Liferayのプラットフォームではデフォルトの分散キャッシュはEhcacheです。 Ehcacheはディスカバリーとトランスポートの両方にClusterLinkと呼ばれるレプリケーションに効率的なアルゴリズムを使用します。LiferayのClusterLinkはJGroupsを内部テクノロジーとして利用しています。

 

この記事では、Liferayプラットフォーム専用の分散キャッシュの設定方法を説明しています。デフォルトでは、2つのプロトコル(UDP または TCP)を使用してネットワークへメッセージを送受信できます。ご使用の環境で、 UDP/マルチキャスティングを使用できない場合は、その他のユニキャストプロトコル・スタックを使用する必要があります。 (例:ディスカバリーにJDBC、 トランスポートにTCPを指定)

 

注:以前のバージョンのLiferaプラットフォームからアップグレードする場合は、Liferay Ehcache Clusterと、ehcache.cluster.link.replication.enabled=trueの両方が必要でしたが、これらはいずれもLiferay DXPでは必要がありません。Liferay DXPのクラスタリングのメカニズムに支障を来す可能性がありますので、Ehcache Clusterポートレットをアンデプロイし、プロパティーからportal-ext.propertiesを削除してください。

 

詳細設定

以下では、分散キャッシュを実装する方法の様々な構成を詳細に説明していきます。 サンプルファイルが記載されていますが、ご使用の環境に合わせて調整する必要があります。

デフォルト(MPING + UDP/IP マルチキャスト)

  1. portal-ext.propertiesを設定します

    • cluster.link.enabled=true

  2. ネットワーク条件によってマルチキャストのアドレス/ポートを微調整します

下記の例を参考にしてください。(この例は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限定)

JDBC_PING

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ファイルを抽出します。

  1. $liferay_home/osgi/marketplaceへ行きます。
  2. Liferay Foundation.lpkgパッケージを開きます。
  3. com.liferay.portal.cluster.multiple-[version number].jar jarを開きます。
  4. /libフォルダで、jgroups-3.6.4.Final.jar を開きます。
  5. tcp.xmltcp.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&amp;characterEncoding=UTF-8&amp;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の資料を参照してください。

 

TCP_PING

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.batsetenv.batに追加されます。
  • Linux/Unix環境では、プロパティーsetenv.shはsetenv.shに追加されます。

3. TCP検出設定ファイルの作成

a. tcp.xmlファイルを抽出して任意の場所に配置します。

  1. $liferay_home/osgi/marketplaceへ行きます。
  2. Liferay Foundation.lpkgパッケージを開きます。
  3. com.liferay.portal.cluster.multiple-[version number].jar を開きます。
  4. /libフォルダで、jgroups-3.6.4.Final.jarを開きます。
  5. 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では事前にの全てのクラスターメンバーを指定する必要があります。これは自動検出プロトコルではありません(例: サポートされていないクラスターメンバーの追加/削除など)。

 

S3_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ファイルを抽出して、任意の場所へ配置します。

  1. $liferay_home/osgi/marketplaceへ行きます。
  2. Liferay Foundation.lpkgパッケージを開きます。
  3. com.liferay.portal.cluster.multiple-[version number].jar ファイルを開きます。
  4. /libフォルダ内の jgroups-3.6.4.Final.jarファイルを開きます。
  5. 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
注: Liferay DXP Platform用サンプル設定ファイルは下記に添付されています: s3_ping_config.xml. この設定はS3_PINGをディスカバリーに、TCPをトランスポートに使用します。S3_PINGはAmazon Web Servicesに限り適用できます。

追加情報

デバッグに役立つ設定 

  1. 高レベルのテスト後、低レベルでテストする
    一般的に、クラスターに関連するトラブルシュートには高レベルでテストをして機能性を検証し、次に低レベルでスタックの詳細確認します。
    • 高レベルの検証:
      一つのノードからUIを通してコンテンツ。(ポートレットの追加、ユーザー情報の一部を変更等)を変更し、ページを更新後、他のノードでアクセスして変更が反映されているか確認します。反映されていたら検証は完了です。
    • 低レベルテスティング: 
      MulticastServerToolを使用してネットワークにハートビートがあるか確認できます。これを使用するには:
      1. [LIFERAY_HOME] フォルダ内に「Multicast」というフォルダを作成します。
      2. 作成した「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
      3. 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が呼び出される場合もあります。
      1. 抽出したマルチキャストフォルダからMulticastClientToolを呼び出します。 デフォルト設定は以下の通りです:
        java -cp util-java.jar;portal-kernel.jar;commons-logging.jar com.liferay.util.transport.MulticastClientTool -h 239.255.0.5 -p 23305
      アウトプットには、「com.liferay.util.transport.MulticastDatagramHandler process」とその下の変更文字が表示されるはずです。
  2. jgroupsロギングの追加

     

    UI上から、org.jgroups.protocols.pbcastのlog4jログを全て有効にします。

    これにより、制御チャネル(ハートビート)とトランスポートトラフィックの両方に関する詳細なステートメントがログに追加されます。Liferayのログに関しては、ユーザーガイドをご覧ください。

    これで問題が解決せず、ネットワークがまだ潜在的な原因である場合、組み込みされているjgroupsテストクライアント/送信クラスを使用して、Liferayが適切に機能していることを確認できます。

  3. Proxy と Firewall のセッティングを確認
    通常、これ以上のJGroups 設定は必要ありませんが、特殊なケースで、複数のネットワークにクラスターノードがでデプロイされている場合は、各ホストでファイアーウォールの外部(パブリックIP)アドレスにパラメータexternal_addrを設定する必要があります。これを設定することで、異なるネットワーク(異なるファイアーウォールで区切られている場合など)にデプロイされたクラスターノードが相互に通信できるようになります。ただし、これはInfoSecからの監査が増える可能性があります。
    JGroupsの資料をご覧ください。
  4. その他の参考リンク
この記事は役に立ちましたか?
2人中2人がこの記事が役に立ったと言っています