Documentation

例:単純なDXPクラスターの作成

DXPクラスタリングを学習する簡単な方法は、 Dockerコンテナ を使用して、単一のマシンに2ノードのDXPクラスタ環境をセットアップすることです。 ここでは、データベース、検索エンジン、およびファイルストア用のサーバーコンテナとともに、2つのDXPサーバーコンテナを作成します。

作成するサーバーコンテナは次のとおりです。

サーバータイプ

実装

コンテナ名

データベース

MariaDB

some-mariadb

ファイルストア

DBStore

some-mariadb

検索エンジン

Elasticsearch

elasticsearch

DXPサーバー

Tomcat

dxp-1

DXPサーバー

Tomcat

dxp-2

警告

この例は学習を目的としたものであり、本番環境のユースケースには適していません。 本番環境では、DXPサーバーへのリクエストの負荷分散用にHTTPサーバーを含め、読み取り専用操作と読み取り/書き込み操作に別々のデータベースサーバーを使用し、データベースサーバー、ファイルストアサーバー、および検索エンジンサーバーのクラスタリングと負荷分散を検討する必要があります。 詳細は、 高可用性のクラスタリング のすべての記事をお読みください。

主な手順は次のとおりです。

  1. データベースサーバーを起動する

  2. ファイルストアサーバーを起動する

  3. 検索エンジンサーバーを起動する

  4. 各ノードの検索エンジンを設定する

  5. DXPクラスターを開始する

  6. DXPクラスターをテストする

データベースサーバーを起動する

DXPクラスターには、すべてのDXPクラスターノードからアクセスできるデータソースが必要です。 データソースは、JNDIデータソースにするか、データベースサーバーまたはデータベースサーバークラスターへの直接接続にすることができます。 DXPバージョンがサポートするデータベースサーバーについては、 互換性マトリックス を参照してください。 詳細は、クラスタノードのデータベース構成を参照してください。

データベースサーバーとDXPデータベースを作成します。

  1. MariaDB Dockerコンテナを起動します。

    docker run --name some-mariadb -e MYSQL **ROOT** PASSWORD=my-secret-pw -d mariadb:10.2
    
  2. コンテナ上のシェルで、DXPデータベースを作成します。

    データベースサーバーにサインインします。

    docker exec -it some-mariadb bash -c "/usr/bin/mysql -uroot -pmy-secret-pw"
    

    DXP用のデータベースを作成します。

    create database dxp_db character set utf8;
    

    データベースセッションを終了します。

    quit
    

    bashセッションを終了します。

    exit
    

データベースサーバーでDXP用の準備が整いました。

ファイルストアサーバーを起動する

DXPクラスターには、すべてのDXPクラスターノードからアクセスできるファイルストアが必要です。 便宜上、この例では、DXPデータベースで構成された DBStoreファイルストアを使用しています。 この例ですでに起動しているデータベースサーバーには、ファイルストアが含まれています。 すべてのファイルストアタイプの設定については、ファイルストレージの構成を参照してください。

検索エンジンサーバーを起動する

DXPクラスターには、すべてのDXPクラスターノードからアクセス可能な検索エンジン(個別のプロセスとして実行)が必要です。 詳細は、 検索エンジンのインストール を参照してください。

Elasticsearchサーバーを作成して設定します。

  1. Elasticsearchサーバーのデータボリュームを保存するためのローカルフォルダを設定します。 例:

    mkdir -p elasticsearch/es **data** volume
    
  2. elasticsearchという名前のElasticsearchコンテナを起動します。

    docker run -it --name elasticsearch -p 9200:9200 -p 9300:9300 -e cluster.name=LiferayElasticsearchCluster -e ES **JAVA** OPTS="-Xms512m -Xmx512m" -v $(pwd)/elasticsearch/es **data** volume:/usr/share/elasticsearch/data elasticsearch:6.8.7
    

    注釈

    コンテナがmax virtual memory areas vm.max_map_count [xxxxx] is too low, increase to at least [xxxxxx]と報告してきたら、sudo sysctl -w vm.max_map_count=[xxxxxx]のようなコマンドを使って vm.max_map_countを十分な値に設定してください。 次に、コンテナを起動します。

  3. 必要なElasticsearchプラグインをインストールします。

    docker exec -it elasticsearch bash -c '/usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-icu && /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-kuromoji && /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-smartcn && /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-stempel'
    

検索エンジンは検索インデックスを管理する準備ができました。

ノードごとに検索エンジンサーバーを設定する

各DXPノードにElasticsearchを設定するには、設定ファイルを使用します。

  1. 設定ファイルの場所を作成します。

    mkdir -p dxp-1/files/osgi/configs dxp-2/files/osgi/configs
    
  2. dxp-1サーバーノードのElasticsearchを設定します。

    cat <<EOT >> dxp-1/files/osgi/configs/com.liferay.portal.search.elasticsearch6.configuration.ElasticsearchConfiguration.config
    operationMode="REMOTE"
    transportAddresses="elasticsearch:9300"
    clusterName="LiferayElasticsearchCluster"
    EOT
    
  3. dxp-2サーバーノードのElasticsearchを設定します。

    cat <<EOT >> dxp-2/files/osgi/configs/com.liferay.portal.search.elasticsearch6.configuration.ElasticsearchConfiguration.config
    operationMode="REMOTE"
    transportAddresses="elasticsearch:9300"
    clusterName="LiferayElasticsearchCluster"
    EOT
    

これらの設定ファイルを、DXPサーバーコンテナのバインドマウントを介してクラスターノードからアクセスできるようにします。

注釈

後でDXPサーバーに使用されるdocker run --add-host elasticsearch:[ip] ...コマンドは、名前elasticsearchをElasticsearchサーバーのホストIPアドレスにマップする/etc/hosts/エントリを追加します。

DXPクラスターを開始する

DXPクラスターノードコンテナには、次の固有の設定があります。

設定

dxp-1

dxp-2

AJPポートマッピング

8009:8009

9009:8009

HTTPポートマッピング

8080:8080

9080:8080

OSGiコンテナポートマッピング

11311:11311

11312:11311

バインドマウント

$(pwd)/dxp-1:/mnt/liferay

$(pwd)/dxp-2:/mnt/liferay

クラスターリンク制御チャネルのロジック名

control-channel-logic-name-1

control-channel-logic-name-2

クラスターリンクトランスポートチャネルのロジック名

transport-channel-logic-name-1

transport-channel-logic-name-2

DXPコンテナを起動します。

  1. docker network inspect bridge コマンドを実行して、elasticsearchおよびsome-mariadbコンテナのコンテナIPアドレスを取得します。 bridgeネットワークがデフォルトネットワークです。

    重要

    次のdocker runコマンドでは、[IP address]elasticsearchおよびsome-mariadbコンテナのIPアドレスに置き換えます。

  2. dxp-1を開始します。

    読みやすいように拡張されたコマンド:

    docker run -it \
      --add-host elasticsearch:[IP address] \
      --add-host some-mariadb:[IP address] \
      -e LIFERAY **JDBC** PERIOD **DEFAULT** PERIOD **JNDI** PERIOD_NAME="" \
      -e LIFERAY **JDBC** PERIOD **DEFAULT** PERIOD **DRIVER** UPPERCASEC **LASS** UPPERCASEN_AME=org.mariadb.jdbc.Driver \
      -e LIFERAY **JDBC** PERIOD **DEFAULT** PERIOD **URL="jdbc:mariadb://some-mariadb:3306/dxp** db?useUnicode=true&characterEncoding=UTF-8&useFastDateParsing=false" \
      -e LIFERAY **JDBC** PERIOD **DEFAULT** PERIOD_USERNAME=root \
      -e LIFERAY **JDBC** PERIOD **DEFAULT** PERIOD_PASSWORD=my-secret-pw \
      -e LIFERAY **CLUSTER** PERIOD **LINK** PERIOD_ENABLED=true \
      -e LIFERAY **CLUSTER** PERIOD **LINK** PERIOD **CHANNEL** PERIOD **LOGIC** PERIOD **NAME** PERIOD_CONTROL=control-channel-logic-name-1 \
      -e LIFERAY **CLUSTER** PERIOD **LINK** PERIOD **CHANNEL** PERIOD **LOGIC** PERIOD **NAME** PERIOD **TRANSPORT** PERIOD_NUMBER0=transport-channel-logic-name-1 \
      -e LIFERAY **CLUSTER** PERIOD **LINK** PERIOD **AUTODETECT** PERIOD_ADDRESS=some-mariadb:3306 \
      -e LIFERAY **WEB** PERIOD **SERVER** PERIOD **DISPLAY** PERIOD_NODE=true \
      -e LIFERAY **DL** PERIOD **STORE** PERIOD_IMPL=com.liferay.portal.store.db.DBStore \
      --name dxp-1 \
      -p 11311:11311 \
      -p 8009:8009 \
      -p 8080:8080 \
      -v $(pwd)/dxp-1:/mnt/liferay \
      liferay/portal:7.3.2-ga3
    

    1行に凝縮されたコマンド:

    docker run -it --name dxp-1  --add-host elasticsearch:[IP address] --add-host some-mariadb:[IP address] -e LIFERAY **JDBC** PERIOD **DEFAULT** PERIOD **JNDI** PERIOD **NAME="" -e LIFERAY** JDBC **PERIOD** DEFAULT **PERIOD** DRIVER **UPPERCASEC** LASS **UPPERCASEN** AME=org.mariadb.jdbc.Driver -e LIFERAY **JDBC** PERIOD **DEFAULT** PERIOD **URL="jdbc:mariadb://some-mariadb:3306/dxp** db?useUnicode=true&characterEncoding=UTF-8&useFastDateParsing=false" -e LIFERAY **JDBC** PERIOD **DEFAULT** PERIOD **USERNAME=root -e LIFERAY** JDBC **PERIOD** DEFAULT **PERIOD** PASSWORD=my-secret-pw -e LIFERAY **CLUSTER** PERIOD **LINK** PERIOD **ENABLED=true -e LIFERAY** CLUSTER **PERIOD** LINK **PERIOD** CHANNEL **PERIOD** LOGIC **PERIOD** NAME **PERIOD** CONTROL=control-channel-logic-name-1 -e LIFERAY **CLUSTER** PERIOD **LINK** PERIOD **CHANNEL** PERIOD **LOGIC** PERIOD **NAME** PERIOD **TRANSPORT** PERIOD **NUMBER0=transport-channel-logic-name-1 -e LIFERAY** CLUSTER **PERIOD** LINK **PERIOD** AUTODETECT **PERIOD** ADDRESS=some-mariadb:3306 -e LIFERAY **WEB** PERIOD **SERVER** PERIOD **DISPLAY** PERIOD **NODE=true -e LIFERAY** DL **PERIOD** STORE **PERIOD** IMPL=com.liferay.portal.store.db.DBStore --name dxp-1 -p 11311:11311 -p 8009:8009 -p 8080:8080 -v $(pwd)/dxp-1:/mnt/liferay liferay/portal:7.4.3.22-ga22
    
  3. dxp-2を開始します。

    読みやすいように拡張されたコマンド:

    docker run -it \
      --add-host elasticsearch:[IP address] \
      --add-host some-mariadb:[IP address] \
      -e LIFERAY **JDBC** PERIOD **DEFAULT** PERIOD **JNDI** PERIOD_NAME="" \
      -e LIFERAY **JDBC** PERIOD **DEFAULT** PERIOD **DRIVER** UPPERCASEC **LASS** UPPERCASEN_AME=org.mariadb.jdbc.Driver \
      -e LIFERAY **JDBC** PERIOD **DEFAULT** PERIOD **URL="jdbc:mariadb://some-mariadb:3306/dxp** db?useUnicode=true&characterEncoding=UTF-8&useFastDateParsing=false" \
      -e LIFERAY **JDBC** PERIOD **DEFAULT** PERIOD_USERNAME=root \
      -e LIFERAY **JDBC** PERIOD **DEFAULT** PERIOD_PASSWORD=my-secret-pw \
      -e LIFERAY **CLUSTER** PERIOD **LINK** PERIOD_ENABLED=true \
      -e LIFERAY **CLUSTER** PERIOD **LINK** PERIOD **CHANNEL** PERIOD **LOGIC** PERIOD **NAME** PERIOD_CONTROL=control-channel-logic-name-2 \
      -e LIFERAY **CLUSTER** PERIOD **LINK** PERIOD **CHANNEL** PERIOD **LOGIC** PERIOD **NAME** PERIOD **TRANSPORT** PERIOD_NUMBER0=transport-channel-logic-name-2 \
      -e LIFERAY **CLUSTER** PERIOD **LINK** PERIOD **AUTODETECT** PERIOD_ADDRESS=some-mariadb:3306 \
      -e LIFERAY **WEB** PERIOD **SERVER** PERIOD **DISPLAY** PERIOD_NODE=true \
      -e LIFERAY **DL** PERIOD **STORE** PERIOD_IMPL=com.liferay.portal.store.db.DBStore \
      --name dxp-2 \
      -p 11312:11311 \
      -p 9009:8009 \
      -p 9080:8080 \
      -v $(pwd)/dxp-2:/mnt/liferay \
      liferay/portal:7.3.2-ga3
    

    1行に凝縮されたコマンド:

    docker run -it --add-host elasticsearch:[IP address] --add-host some-mariadb:[IP address] -e LIFERAY **JDBC** PERIOD **DEFAULT** PERIOD **JNDI** PERIOD **NAME="" -e LIFERAY** JDBC **PERIOD** DEFAULT **PERIOD** DRIVER **UPPERCASEC** LASS **UPPERCASEN** AME=org.mariadb.jdbc.Driver -e LIFERAY **JDBC** PERIOD **DEFAULT** PERIOD **URL="jdbc:mariadb://some-mariadb:3306/dxp** db?useUnicode=true&characterEncoding=UTF-8&useFastDateParsing=false" -e LIFERAY **JDBC** PERIOD **DEFAULT** PERIOD **USERNAME=root -e LIFERAY** JDBC **PERIOD** DEFAULT **PERIOD** PASSWORD=my-secret-pw -e LIFERAY **CLUSTER** PERIOD **LINK** PERIOD **ENABLED=true -e LIFERAY** CLUSTER **PERIOD** LINK **PERIOD** CHANNEL **PERIOD** LOGIC **PERIOD** NAME **PERIOD** CONTROL=control-channel-logic-name-2 -e LIFERAY **CLUSTER** PERIOD **LINK** PERIOD **CHANNEL** PERIOD **LOGIC** PERIOD **NAME** PERIOD **TRANSPORT** PERIOD **NUMBER0=transport-channel-logic-name-2 -e LIFERAY** CLUSTER **PERIOD** LINK **PERIOD** AUTODETECT **PERIOD** ADDRESS=some-mariadb:3306 -e LIFERAY **WEB** PERIOD **SERVER** PERIOD **DISPLAY** PERIOD **NODE=true -e LIFERAY** DL **PERIOD** STORE **PERIOD** IMPL=com.liferay.portal.store.db.DBStore --name dxp-2 -p 11312:11311 -p 9009:8009 -p 9080:8080 -v $(pwd)/dxp-2:/mnt/liferay liferay/portal:7.4.3.22-ga22
    

--add-host [domain]:[IP address]オプションは、ドメイン名をマップする/etc/hosts ファイルエントリ をIPアドレスに追加します。 これにより、設定(環境変数、ポータルプロパティ、 .configファイルなど)がドメイン名でサーバーを参照できるようになります。

-e [variable]=[value]オプションは、DXPコンテナ環境変数を設定します。 詳細は、 付録A:環境設定 を参照してください。

DXPノードにアクセスする

DXPクラスターノードは、次のURLで入手できます。

  • DXP-1:http://localhost:8080

  • DXP-2:http://localhost:9080

次の図は、クラスターノードのホームページを示しています。

DXPクラスターノード。

各ノードのコンテナIDとポート(ノード:  [id]:[port])は、各ページの下部に表示されます。 LIFERAY_WEB_PERIOD_SERVER_PERIOD_DISPLAY_PERIOD_NODE=true環境設定により、この表示機能が有効になりました。 docker container ls コマンドを使用してコンテナのIDを見つけることができます。

コンテンツを検索エンジンにインデックス付けする

DXPコンテンツのインデックス作成を開始します。

  1. [コントロールパネル] → [設定] → [検索機能] に移動します。

  2. [アクションをインデックスする]タブで、次のオプションをクリックします。

    **Reindex all search indexes **Reindex all spell check indexes

コンテンツは検索エンジンにインデックス付けされます。 詳細は、 検索の概要 を参照してください。

DXPクラスターをテストする

ノード間のデータ同期をテストします。

  1. クラスタノードの1つにコンテンツを追加します。

    たとえば、 New Stuff という名前の新しいウィジェットページを追加し、それに言語セレクタウィジェットを追加します。

  2. 他のクラスターノードのUIを更新します。

両方のノードに同じ新しいコンテンツが表示されます。

コンテンツはクラスターノード間で同期されます。

作業中の DXPクラスタを作成しました!

次のステップ

DXPクラスター用にデータベースを設定します。

付録A:環境設定

サンプルのDXPサーバーコンテナは次の設定を使用しています。

設定

説明

LIFERAY\ *JDBC* PERIOD\ *DEFAULT* PERIOD\ *JNDI* PERIOD_NAME=

データソースJNDI名

LIFERAY\ *JDBC* PERIOD\ *DEFAULT* PERIOD\ *DRIVER* UPPERCASEC\ *LASS\
*
UPPERCASEN_AME=\
org.mariadb.jdbc.Driver

データベースドライバークラス

LIFERAY\ *JDBC* PERIOD\ *DEFAULT* PERIOD\ *URL=\
jdbc:mariadb://some-mariadb:3306/dxp*
db?\
useUnicode=true&characterEncoding=UTF-8&useFastDateParsing=false

データソースURL

LIFERAY\ *JDBC* PERIOD\ *DEFAULT* PERIOD_USERNAME=\
root

データベース管理者のユーザー名

LIFERAY\ *JDBC* PERIOD\ *DEFAULT* PERIOD_PASSWORD=\
my-secret-pw

データベース管理者ユーザーのパスワード

LIFERAY\ *CLUSTER* PERIOD\ *LINK* PERIOD_ENABLED=\
true

クラスタリンクを有効にする

LIFERAY\ *CLUSTER* PERIOD\ *LINK* PERIOD\ *CHANNEL* PERIOD\ *LOGIC* PERIOD\ *NAME\
*
PERIOD_CONTROL=\
control-channel-logic-name-2

クラスターノードの一意のコントロールチャネル名

LIFERAY\ *CLUSTER* PERIOD\ *LINK* PERIOD\ *CHANNEL* PERIOD\ *LOGIC* PERIOD\ *NAME\
*
PERIOD\ *TRANSPORT* PERIOD_NUMBER0=\
transport-channel-logic-name-2

クラスターノードの一意のトランスポートチャネル名

LIFERAY\ *CLUSTER* PERIOD\ *LINK* PERIOD\ *AUTODETECT* PERIOD_ADDRESS=\
some-mariadb:3306

クラスターノードアドレスを取得するためにpingする既知のアドレス

LIFERAY\ *WEB* PERIOD\ *SERVER* PERIOD\ *DISPLAY* PERIOD_NODE=\
true

サーバーアドレスとウェブサーバーポートを表示します

LIFERAY\ *DL* PERIOD\ *STORE* PERIOD_IMPL=\
com.liferay.portal.store.db.DBStore

ファイルストア(ドキュメントライブラリストア)クラス

詳細は、Env/ ポータルプロパティ の定義を参照してください。