例:シンプルな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サーバーを含め、読み取り専用操作と読み取り/書き込み操作に別々のデータベースサーバーを使用し、データベースサーバー、ファイルストアサーバー、および検索エンジンサーバーのクラスタリングと負荷分散を検討する必要があります。 詳細については、 高可用性のクラスタリング を参照してください。
主な手順は次のとおりです。
データベースサーバーを起動する
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:/var/lib/elasticsearch/data elasticsearch:6.8.7
noteコンテナが
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クラスターを開始する
-
docker network inspect bridge
コマンドを実行して、elasticsearch
とsome-mariadb
コンテナのコンテナ IP アドレスを取得する。ブリッジ
ネットワークはデフォルトのネットワークである。important以下の
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.112-ga112
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.112-ga112
-
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.112-ga112
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.112-ga112
--add-host [domain]:[IP address]
オプション ドメイン名とIPアドレスを対応させる/etc/hosts
ファイルエントリ を追加する。 これにより、設定(環境変数、ポータルのプロパティ、.config\
ファイルなど)がドメイン名でサーバーを参照できるようになる。
-e [variable]=[value]
オプションは 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とポート(Node: [id]:[port]
)は各ページの下部に表示される。 LIFERAY_WEB_PERIOD_SERVER_PERIOD_DISPLAY_PERIOD_NODE=true
環境設定は、この表示機能を有効にした。 コンテナのIDは、 docker container ls
コマンドを使って見つけることができる。
コンテンツを検索エンジンにインデックス付けする
-
コントロールパネル → 設定 → 検索 に移動します。
-
Index Actionsタブで、 Reindex all search indexes と Reindex all spell check indexes をクリックします。
コンテンツは検索エンジンにインデックス付けされます。 詳しくは 検索の概要 を参照。
DXPクラスターをテストする
ノード間のデータ同期をテストします。
-
クラスタノードの1つにコンテンツを追加します。 例えば、 New Stuff という新しいウィジェットページを追加し、そこにLanguage Selectorウィジェットを追加します。
-
他のクラスターノードの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_USERNAME=\ root | Database admin user name |
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/ Portal Property 定義を参照のこと。