例:シンプルなDXPクラスターの作成¶
DXPクラスタリングを学習する簡単な方法は、 Dockerコンテナ を使用して、単一のマシンに2ノードのDXPクラスタ環境をセットアップすることです。 ここでは、データベース、検索エンジン、およびファイルストア用のサーバーコンテナとともに、2つのDXPサーバーコンテナを作成します。
作成するサーバーコンテナは次のとおりです。
サーバータイプ |
実装 |
コンテナ名 |
---|---|---|
データベース |
MariaDB |
|
ファイルストア |
DBStore |
|
検索エンジン |
Elasticsearch |
|
DXPサーバー |
Tomcat |
|
DXPサーバー |
Tomcat |
|
警告
この例は学習を目的としたものであり、本番環境のユースケースには適していません。 本番環境では、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 character set utf8;
データベースセッションを終了します。
quit
bashセッションを終了します。
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:/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
を十分な値に設定してください。 次に、コンテナを起動します。必要な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サーバーコンテナのバインドマウントを介してクラスターノードからアクセスできるようにします。
注釈
後でDXPサーバーに使用されるdocker run --add-host elasticsearch:[ip] ...
コマンドは、名前elasticsearch
をElasticsearchサーバーのホストIPアドレスにマップする/etc/hosts/
エントリを追加します。
DXPクラスターを開始する¶
DXPクラスターノードコンテナには、次の固有の設定があります。
設定 |
dxp-1 |
dxp-2 |
---|---|---|
AJPポートマッピング |
|
|
HTTPポートマッピング |
|
|
OSGiコンテナポートマッピング |
|
|
バインドマウント |
|
|
クラスターリンク制御チャネルのロジック名 |
control-channel-logic-name-1 |
control-channel-logic-name-2 |
クラスターリンクトランスポートチャネルのロジック名 |
transport-channel-logic-name-1 |
transport-channel-logic-name-2 |
DXPコンテナを起動します。
docker network inspect bridge
コマンドを実行して、elasticsearch
およびsome-mariadb
コンテナのコンテナIPアドレスを取得します。bridge
ネットワークがデフォルトネットワークです。重要
次の
docker run
コマンドでは、[IP address]
を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.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.55-ga55
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.55-ga55
--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
次の図は、クラスターノードのホームページを示しています。
各ノードのコンテナIDとポート(ノード: [id]:[port]
)は、各ページの下部に表示されます。 LIFERAY_WEB_PERIOD_SERVER_PERIOD_DISPLAY_PERIOD_NODE=true
環境設定により、この表示機能が有効になりました。 docker container ls
コマンドを使用してコンテナのIDを見つけることができます。
コンテンツを検索エンジンにインデックス付けする¶
DXPコンテンツのインデックス作成を開始します。
[コントロールパネル] → [設定] → [検索機能] に移動します。
[アクションをインデックスする]タブで、次のオプションをクリックします。
Reindex all search indexes
Reindex all spell check indexes
コンテンツは検索エンジンにインデックス付けされます。 詳細は、 検索機能の概要 を参照してください。
DXPクラスターをテストする¶
ノード間のデータ同期をテストします。
クラスタノードの1つにコンテンツを追加します。
たとえば、 New Stuff という名前の新しいウィジェットページを追加し、それに言語セレクタウィジェットを追加します。
他のクラスターノードのUIを更新します。
両方のノードに同じ新しいコンテンツが表示されます。
これで作業中の DXPクラスタを作成できました!
次のステップ¶
DXPクラスター用にデータベースを設定します。
付録A:環境設定¶
サンプルのDXPサーバーコンテナは次の設定を使用しています。
設定 |
説明 |
---|---|
LIFERAY JDBC PERIOD DEFAULT PERIOD JNDI PERIOD_NAME= |
データソースJNDI名 |
LIFERAY JDBC PERIOD DEFAULT PERIOD DRIVER UPPERCASEC LASS\ |
データベースドライバークラス |
LIFERAY JDBC PERIOD DEFAULT PERIOD URL=\ |
データソースURL |
LIFERAY JDBC PERIOD DEFAULT PERIOD_USERNAME=\ |
データベース管理者のユーザー名 |
LIFERAY JDBC PERIOD DEFAULT PERIOD_PASSWORD=\ |
データベース管理者ユーザーのパスワード |
LIFERAY CLUSTER PERIOD LINK PERIOD_ENABLED=\ |
クラスタリンクを有効にする |
LIFERAY CLUSTER PERIOD LINK PERIOD CHANNEL PERIOD LOGIC PERIOD NAME\ |
クラスターノードの一意のコントロールチャネル名 |
LIFERAY CLUSTER PERIOD LINK PERIOD CHANNEL PERIOD LOGIC PERIOD NAME\ |
クラスターノードの一意のトランスポートチャネル名 |
LIFERAY CLUSTER PERIOD LINK PERIOD AUTODETECT PERIOD_ADDRESS=\ |
クラスターノードアドレスを取得するためにpingする既知のアドレス |
LIFERAY WEB PERIOD SERVER PERIOD DISPLAY PERIOD_NODE=\ |
サーバーアドレスとウェブサーバーポートを表示します |
LIFERAY DL PERIOD STORE PERIOD_IMPL=\ |
ファイルストア(ドキュメントライブラリストア)クラス |
詳細は、Env/ Portal Property の定義を参照してください。