例:シンプルなDXPクラスターの作成
DXPクラスタリングを素早く簡単に学ぶには、 個のDockerコンテナを使用して、1台のマシン上に2ノードのDXPクラスタ環境をセットアップします。この例では、2つのDXPサーバーコンテナに加え、データベース、検索エンジン、ファイルストア用のサーバーコンテナを作成します。
| サーバータイプ | 実装 | コンテナ名 |
|---|---|---|
| データベース | MariaDB | some-mariadb |
| ファイルストア | DBストア | some-mariadb |
| 検索エンジン | Elasticsearch | elasticsearch |
| DXPサーバー | トムキャット | dxp-1 |
| DXPサーバー | トムキャット | dxp-2 |
この例は学習目的のものであり、実運用環境での使用には適していません。本番環境では、DXPサーバーへのリクエストの負荷分散を行うためのHTTPサーバーを含め、読み取り専用操作と読み書き操作用に別々のデータベースサーバーを使用し、データベースサーバー、ファイルストアサーバー、検索エンジンサーバーのクラスタリングと負荷分散を検討する必要があります。詳細については、 高可用性のためのクラスタリング を参照してください。
主な手順は以下のとおりです。
データベースサーバーを起動する
DXPクラスタには、すべてのDXPクラスタノードからアクセス可能なデータソースが必要です。データソースは、JNDIデータソース、データベースサーバーへの直接接続、またはデータベースサーバークラスタのいずれかになります。お使いのDXPバージョンがサポートするデータベースサーバーについては、互換性マトリックスをご確認ください。
データベースサーバーとDXPデータベースを作成します。
-
MariaDBのDockerコンテナを起動します。
docker run --name some-mariadb -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mariadb:10.2 -
コンテナのシェルで、 DXP データベース を作成します。
データベースサーバーにログインしてください。
docker exec -it some-mariadb bash -c "/usr/bin/mysql -uroot -pmy-secret-pw"DXP用のデータベースを作成します。
create database dxp_db default character set utf8mb4 collate utf8mb4_unicode_ci;データベースセッションを終了します。
quitbashセッションを終了します。
exit
お使いのデータベースサーバーはDXPに対応しています。詳細については、 クラスタノードのデータベース構成 を参照してください。
ファイルストアサーバーを起動する
DXPクラスタには、すべてのDXPクラスタノードからアクセス可能なファイルストアが必要です。便宜上、この例では DXP データベースに構成された DBStore ファイル ストア を使用します。この例では、既に起動しているデータベースサーバーにはファイルストアが含まれています。すべてのファイルストアタイプの構成方法については、 ファイルストレージの構成 を参照してください。
検索エンジンサーバーを起動する
DXPクラスタには、すべてのDXPクラスタノードからアクセス可能な検索エンジン(別プロセスとして実行)が必要です。詳細については、 検索エンジンのインストール を参照してください。
Elasticsearchサーバーの作成と設定:
-
Elasticsearchサーバーのデータボリュームを保存するためのローカルフォルダを設定します。例えば、
mkdir -p elasticsearch/es_data_volume -
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:/var/lib/elasticsearch/data elasticsearch:6.8.7注記コンテナが
max virtual memory areas vm.max_map_count [xxxxx] が低すぎると報告する場合は、少なくとも [xxxxxx]まで増やし、vm.max_map_countを次のようなコマンドを使用して十分な値に設定します:sudo sysctl -w vm.max_map_count=[xxxxxx]。次にコンテナを起動します。 -
必要な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 を設定するには、 設定ファイル を使用します。
-
設定ファイルの保存場所を作成します。
mkdir -p dxp-1/files/osgi/configs dxp-2/files/osgi/configs -
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 -
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サーバーコンテナ上のバインドマウントを介して、クラスタノードからアクセスできるようにします。
docker run --add-host elasticsearch:[ip] ... DXP サーバーで後で使用するコマンドは、 /etc/hosts/ エントリを追加し、名前 elasticsearch を Elasticsearch サーバー ホストの IP アドレスにマッピングします。
DXPクラスターを起動する
-
elasticsearchおよびsome-mariadbコンテナのコンテナ IP アドレスを取得するには、docker network inspect bridgeコマンドを実行します。ブリッジネットワークはデフォルト ネットワークです。重要以下の
docker runコマンドでは、[IP アドレス]をelasticsearchおよびsome-mariadbコンテナの IP アドレスに置き換えてください。 -
開始
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.4.3.132-ga132コマンドを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.132-ga132 -
開始
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.4.3.132-ga132コマンドを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.132-ga132
--add-host [domain]:[IP address] オプション は、ドメイン名を IP アドレスにマッピングする /etc/hosts ファイルのエントリ を追加します。これにより、構成(環境変数、ポータルプロパティ、および .config ファイルなど)がドメイン名でサーバーを参照できるようになります。
-e [変数]=[値] オプションは、DXP コンテナの環境変数を設定します。詳細については、 付録 A: 環境設定 を参照してください。
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ノードを訪問する
DXPクラスタノードは、以下のURLからアクセスできます。
- DXP-1: http://localhost:8080
- DXP-2: http://localhost:9080
下図は、クラスタノードのホームページを示しています。

各ノードのコンテナIDとポート(ノード:[id]:[port])は、各ページの下部に表示されます。 LIFERAY_WEB_PERIOD_SERVER_PERIOD_DISPLAY_PERIOD_NODE=true 環境設定により、この表示機能が有効になりました。 docker container ls コマンドを使用して、コンテナの ID を見つけることができます。
コンテンツを検索エンジンにインデックス登録する
-
コントロール パネル → 設定 → 検索 に移動します。
-
[インデックス操作] タブで、 すべての検索インデックスを再インデックスする と すべてのスペルチェックインデックスを再インデックスする をクリックします。
コンテンツは検索エンジンにインデックス登録されます。詳細については、 検索概要 を参照してください。
DXPクラスターをテストする
ノード間のテストデータ同期:
-
クラスタノードのいずれかにコンテンツを追加します。例えば、 新着情報 という名前の新しいウィジェット ページを追加し、そこに言語セレクタ ウィジェットを追加します。
-
もう一方のクラスタノードの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/ポータルプロパティ の定義を参照してください。