問題
Elasticsearch 6 インストールでクロス クラスター レプリケーションを有効にしようとすると、次のエラーが発生します。
- リーダー インデックス [liferay-0] では論理的な削除が有効になっていません。 index.soft_deletes.enabled を true に設定して、インデックスを作成するときに論理的な削除を有効にする必要があります。
$ curl -X PUT "127.0.0.1:9200/liferay-0/_ccr/follow?wait_for_active_shards=1&pretty" -H 'Content-Type: application/json' -d'
> {
> "remote_cluster" : "leader",
> "leader_index" : "liferay-0"
> }
> '
{
"error" : {
"root_cause" : [
{
"type" : "illegal_argument_exception",
"reason" : "leader index [liferay-0] does not have soft deletes enabled. soft deletes must be enabled when the index is created by setting index.soft_deletes.enabled to true"
}
],
"type" : "illegal_argument_exception",
"reason" : "leader index [liferay-0] does not have soft deletes enabled. soft deletes must be enabled when the index is created by setting index.soft_deletes.enabled to true"
},
"status" : 400
}
インデックスの作成時に soft_deletes
プロパティを設定する必要があるようですが、Elasticsearch 6 バージョンではデフォルトで false に設定されています。 どうすればこれを解決できますか?
Environment
- Elasticsearch 6 を使用する DXP 7.0、7.1、または 7.2
解決策
残念ながら、既存のインデックスでこの値を変更することはできません。インデックスを再作成する必要があるため、再作成時に soft_deletes が true に設定されます。
構成を変更してインデックスを再生成するには、次の手順に従う必要があります。
ステップ 1: index.soft_deletes.enabled: true Liferay 構成に追加します
これは、Liferay がインデックスを作成するときに、この soft_deletes 設定を true にして作成するために必要です。
この構成を追加するには:
- Liferay で、[コントロール パネル] => [設定] => [システム設定] に移動します。
- 「Elasticsearch 6」構成を開きます
- 「追加のインデックス構成」設定で、次を追加する必要があります。
index.soft_deletes.enabled: true
ステップ 2: すべての Liferay システム インデックスを再生成して、soft_deletes を true に設定します。
これは、Liferay (単純で遅い) または Elasticsearch (より複雑ですが高速) から実行できます。
オプション 2.1 - Liferay から (シンプルで遅い)
このオプションは、Liferay データベースから Elasticsearch インデックスを再生成することで構成されます。
- [コントロール パネル] → [構成] → [検索] をクリックします (DXP 7.3 および 7.4 では、[コントロール パネル] → [検索]、および [インデックス アクション] タブにあります)。
- [実行] ボタンをクリックして、すべての検索インデックスを再インデックス化します
エンティティの数によっては、インデックスの再作成は時間とメモリを大量に消費する操作になる場合があることに注意してください。 それに応じて再インデックスのタイミングを計画してください。
Elasticsearch インデックスを再生成した後、soft_deletes 設定を true に設定して作成されます。
オプション 2.2 - Elasticsearch から (より複雑ですが、高速です)
このオプションは、Elasticsearch で見つかったデータから Elasticsearch インデックスを再生成することで構成されます。
前のオプションよりも高速ですが、手動の手順が増えるため、より複雑になります。
アイデアは、正しい構成で一時インデックスを作成し、元のインデックスからデータをコピーし、元のインデックスを削除して、一時インデックスからデータをコピーして再生成することです。
注: index-name
インデックス名に置き換え、 localhost:9200
をマシンとポートに置き換えます。
1. URL からインデックスの構成をダウンロードします:http://localhost:9200/index-name?pretty
2. 次の構造を持つ config.json
を作成します。
{
"mappings" : {<<copy here the mappings from the index>>},
"settings" : {<<copy here the setting from the index>>}
}
この config.json
ファイルをパラメーターとして使用して、新しい構成でインデックスを作成します。
3. 前のファイルの設定セクション内:
- 属性を削除します: creation_date、provided_name、uuid、および versionは、Elasticsearch によって内部的に再生成されるためです。 それらが削除されていない場合、エラーがスローされます。
- 論理的な削除のオプションを追加します。
"soft_deletes" : {
"enabled" : "true"
},
4. config.json ファイルの新しい構成を使用して一時インデックスを作成します。 CURL を使用して実行できます。
curl -X PUT http://localhost:9200/index-name_temp -d @config.json -H'Content-Type: application/json'
5. soft_deletes が有効になっていることを除いて、元のインデックスと同じ構成でインデックスが作成されていることを確認します。これを行うには、ソース インデックスと一時インデックスの構成にアクセスし、ファイルを比較します。
- ソース インデックスの構成:
http://localhost:9200/index-name?pretty
- 仮インデックス設定:
http://localhost:9200/index-name_temp?pretty
両方の構成をダウンロードして比較し、一時的な構成の soft_deletes が true に設定されていることを除いて、それらが同じであることを確認します。
6. Elasticsearch の _reindex API を使用して、元のインデックスから一時インデックスにデータをコピーします。 CURL を使用して実行できます。
curl -X POST http://localhost:9200/_reindex -d '{"source": {"index": "index-name"},"dest": {"index": "index-name_temp"}}' -H'Content-Type: application/json'
7. 元のインデックスを削除します。 CURL を使用して実行できます。
curl -X DELETE http://localhost:9200/index-name
8. config.json ファイルの新しい構成を使用して、元の名前で新しいインデックスを作成します。 CURL を使用して実行できます。
curl -X PUT http://localhost:9200/index-name -d @config.json -H'Content-Type: application/json'
9. Elasticsearch の _reindex API を使用して、一時インデックスから元の名前のインデックスにデータをコピーします。 CURL を使用して実行できます。
curl -X POST http://localhost:9200/_reindex -d '{"source": {"index": "index-name_temp"},"dest": {"index": "index-name"}}' -H'Content-Type: application/json'
10. 一時索引を削除します。 CURL を使用して実行できます。
curl -X DELETE http://localhost:9200/index-name_temp
重要: ステップ 7、8、および 9 の間、元のインデックス情報が削除され、一時インデックスから再生成されるため、この間、検索、アセット発行者、ユーザー リストなどの Liferay 機能が正しく機能しません。など、ユーザー アクティビティのない期間にこの操作を実行することが重要です。
Elasticsearch のすべてのインデックスでこの操作を繰り返します。
Liferay または Elasticsearch で再インデックスする必要がありますか?
オプション 2.1、Liferay からの再インデックス化に従う方がはるかに簡単で、より実績のある操作であるため、より良いと考えています。