クラスタ内のインデックスの名前を変更する方法は?


110

クラスター内のいくつかのインデックスの名前を変更する必要があります(名前を変更する必要あります。エイリアスを使用できません)。

サポートされている方法はないことがわかりました。最も近いのは、インデックスのディレクトリの名前変更することです。これをクラスターで試しました。

クラスターには3台のマシンABありC、シャードはそれぞれに複製されます。でelasticsearchをシャットダウンしA、名前/var/lib/elasticsearch/security/nodes/0/indices/oldindexnameを変更し/var/lib/elasticsearch/security/nodes/0/indices/newindexnameて再起動しましたA

クラスターの状態は黄色で、elasticsearchは魔法をかけて正しい状態に戻していました。しばらくして私は結局

  • oldindexname利用可能で完全に複製されている(から回復されたBC思います)
  • newindexname 利用可能です(検索できます)が、ヘッドプラグインはその断片が「未割り当て」状態であり、グレー表示されている(複製されていない)ことを示しています

リカバリ中にsecurity.log次のメッセージが表示されました:

[2015-02-20 11:02:33,461][INFO ][gateway.local.state.meta ] [A.example.com] dangled index directory name is [newindexname], state name is [oldindexname], renaming to directory name

一方でnewindexname、検索可能で、それは正常な状態では、確かではありません。

を削除して前の状態にロールバックしましたnewindexname。クラスタは、「未割り当て」のエントリなしで緑色に戻ります。

それを考えると、どのように私は名前を変更することができますoldindexnamenewindexname、クラスタ内の?

注:私が念頭に置いている最終的な解決策は、スクロールコピーoldindexnewindexoldindex後で削除することです。これには時間がかかるので、より直接的な解決策があれば素晴らしいでしょう。

回答:


19

ElasticSearch 7.4以降、インデックスの名前を変更する最良の方法は、新しく導入されたClone Index APIを使用してインデックスをコピーし、次にDelete Index APIを使用して元のインデックスを削除することです。

Clone Index APIは、同じ目的でSnapshot APIまたはReindex APIを使用するよりもClone Index APIの主な利点です。これは、Clone Index APIがコンテンツを再処理せずにソースインデックスからターゲットインデックスにセグメントをハードリンクするためです(明らかにハードリンクをサポートするファイルシステム;そうでなければ、ファイルはファイルシステムレベルでコピーされます。これは、他の方法よりもはるかに効率的です)。クローンインデックスは、ターゲットインデックスがすべての点でソースインデックスと同一であることも保証します(つまり、インデックス再作成アプローチとは異なり、設定とマッピングを手動でコピーする必要はありません)。ローカルスナップショットディレクトリを構成する必要はありません。 。

補足:この手順は以前のソリューションよりもはるかに高速ですが、それでもダウンタイムを意味します。インデックスの名前の変更を正当化する実際の使用例があります(たとえば、分割、縮小、またはバックアップワークフローのステップとして)が、インデックスの名前の変更は日常の操作の一部であってはなりません。ワークフローで頻繁にインデックスの名前を変更する必要がある場合は、代わりにインデックスエイリアスの使用を検討してください。

ここでは、インデックスの名前を変更する操作の完全な配列の一例であるsource_indextarget_index。これは、Kibanaに統合さているコンソールなど、ElasticSearch固有のコンソールを使用して実行できます。Elastic Searchコンソールの代わりに使用する、この例の代替バージョンについては、この要旨を参照してくださいcurl

# Make sure the source index is actually open
POST /source_index/_open

# Put the source index in read-only mode
PUT /source_index/_settings
{
  "settings": {
    "index.blocks.write": "true"
  }
}

# Clone the source index to the target name, and set the target to read-write mode
POST /source_index/_clone/target_index
{
  "settings": {
    "index.blocks.write": null 
  }
}

# Wait until the target index is green;
# it should usually be fast (assuming your filesystem supports hard links).
GET /_cluster/health/target_index?wait_for_status=green&timeout=30s

# If it appears to be taking too much time for the cluster to get back to green,
# the following requests might help you identify eventual outstanding issues (if any)
GET /_cat/indices/target_index
GET /_cat/recovery/target_index
GET /_cluster/allocation/explain

# Delete the source index
DELETE /source_index

163

REINDEXを使用してそれを行うことができます。

Reindexは宛先インデックスを設定しようとしません。ソースインデックスの設定はコピーされません。マッピング、シャードカウント、レプリカなどの設定を含め、_reindexアクションを実行する前に宛先インデックス設定する必要があります

  1. 最初にインデックスを新しい名前にコピーします
POST /_reindex
{
  "source": {
    "index": "twitter"
  },
  "dest": {
    "index": "new_twitter"
  }
}
  1. 次にインデックスを削除します
DELETE /twitter

これには両方のインデックス用のスペースが(一時的に)必要ですが、これはシンプルで完全にサーバー上にあるため、これはこれまでのところ最良の解決策のようです(ドキュメントが「実験的」ステータスについて警告しています)。ありがとうございました。
WoJ 2016年

2
マッピングが持っている場合、これは機能します_source: {enabled: false}か?
ハラルド2016

2
@ハラルドいいえ、元の文書データとして_reindex使用_sourceします。
Agop 2016

6
これは、のマッピングをコピーしませんtwitterへのnew_twitter私の知る限りとして。
Nick

3
_reindexの解決策に同意しますが、質問を変更する必要があります。インデックスの再作成は、単に名前を変更するだけではありません。データのインデックス作成方法も変更できます。
lucabelluccini

62

インデックスの名前を変更するには、Elasticsearch Snapshotモジュールを使用できます。

最初に、インデックスのスナップショットを取得する必要があります。それを復元しながら、インデックスの名前を変更できます。

    POST /_snapshot/my_backup/snapshot_1/_restore
    {
     "indices": "jal",
     "ignore_unavailable": "true",
     "include_global_state": false,
     "rename_pattern": "jal",
     "rename_replacement": "jal1"
     }

rename_replacement:-データをバックアップする新しいインデックス名。


4
Holycrap、それは信じられないほど便利です。ありがとうございました!
クリスコグドン2017年

1
受け入れられているソリューションよりもはるかに優れています!これは実際にはインデックスのバイナリコピーなので、何かを失うリスクはなく_source、インデックスで有効にする必要はありません。問題なくいくつかのマルチTBインデックスの名前をこのように変更しました。
ジャケット

2
@ジャケット-私の答えが本当にあなたを助けることを知ってうれしいです。
krishna kumar 2018年

1
私は、インデックスの再作成よりもはるかに優れたソリューションであり、データ損失の問題がなく、ビッグインデックスの方が
はるかに高速です

1
マッピングは保持されますか?
Amogh Mishra

5

そのため、ESでインデックスをコピーまたは名前変更する直接的な方法はありません(私は自分のプロジェクトを徹底的に検索しました)

ただし、非常に簡単なオプションは、一般的な移行ツール[Elastic-Exporter]を使用することです。

http://www.retailmenot.com/corp/eng/posts/2014/12/02/elasticsearch-cluster-migration/

[PS:これは私のブログではなく、偶然偶然見つけて良かった]

これにより、インデックス/タイプをコピーしてから、古いものを削除できます。


リンクはもう機能しません。それを見つけたり、この情報を入手できる他の場所はありますか?
elachell 2017

5

REINDEXできない場合の回避策は、エイリアスを使用することです。公式ドキュメントから:

elasticsearchのAPIは、特定のインデックスに対して作業する場合はインデックス名を受け入れ、該当する場合はいくつかのインデックスを受け入れます。インデックスエイリアスAPIを使用すると、インデックスに名前を付けることができ、すべてのAPIがエイリアス名を実際のインデックス名に自動的に変換します。エイリアスは複数のインデックスにマッピングすることもでき、それを指定すると、エイリアスは自動的にエイリアスインデックスに展開されます。エイリアスは、検索時に自動的に適用されるフィルターやルーティング値に関連付けることもできます。エイリアスは、インデックスと同じ名前にすることはできません。

このような機能を使用している場合、このソリューションは機能しないことに注意してください。https://github.com/elastic/elasticsearch/issues/16560


1
I need to rename several indexes in a cluster (their name must be changed I cannot use aliases).@WoJによる
Thales P

理由エイリアスが機能しない:を使用alias するには、事前に計画を立ててas an alias、実際のインデックスに元のインデックス名を作成する必要があります。次に、新しいエイリアス名を作成し、古いエイリアス名を別の名前に再利用できます。 しかし、real_indexしかない場合はold_dataにアクセスできなくなり、エイリアスを作成して、古いreal_indexを削除します。エイリアスは何も指していません。
ジェシーチザム

@JesseChrisholm「何も指していないエイリアス」はあり得ないと思います。real_indexを削除してみてください。エイリアス「そのエイリアス」も削除されることがわかります。
mgaert

5

インデックスの名前変更またはマッピングを変更する別の方法は、logstashを使用してインデックスを再作成することです。以下は、logstash 2.1構成のサンプルです。

input {
  elasticsearch {
   hosts => ["es01.example.com", "es02.example.com"]
   index => "old-index-name"
   size => 500
   scroll => "5m"
  }
}
filter {

 mutate {
  remove_field => [ "@version" ]
 }

 date {
   "match" => [ "custom_timestamp", "MM/dd/YYYY HH:mm:ss" ]
   target => "@timestamp"
 }

}
output {
 elasticsearch {
   hosts => ["es01.example.com", "es02.example.com" ]
   manage_template => false
   index => "new-index-name"
 }
}

4
Elasticsearchインデックスのインデックスを再作成する最良の方法は、Logstashをインストールして、それを使用して再インデックスすることです。特に実際にLogstashを使用したくない/使用しない場合は、少しやり過ぎに思われます...
M. Justin

答えの唯一の問題は「最高の」部分です。。私は、「別の方法「を言うそれ以外は、それは良い答えがある。
ロバート・


-5

誰かがまだそれを必要とする場合に備えて。インデックスの名前を変更する、公式ではない、成功した方法は次のとおりです。

  1. 名前を変更する必要があるインデックスを閉じる
  2. マスターノードとデータノードのすべてのデータディレクトリにあるインデックスのフォルダーの名前を変更します。
  3. 古い閉じたインデックスを再度開きます(私はkofpプラグインを使用しています)。古いインデックスは再度開かれますが、割り当てられないままです。新しいインデックスは閉じた状態で表示されます
  4. 新しいインデックスを再度開く
  5. 古いインデックスを削除する

このエラー「偶然のインデックスディレクトリ名は」が発生した場合は、すべてのマスターノード(データノードではない)でインデックスフォルダーを削除し、データノードの1つを再起動します。


2
Elasticには強く非推奨。必要な場合は、バックアップがあることを確認してください。
lucabelluccini

インデックスの名前がデータディレクトリのどこにあるのかわかりません。/ var / lib / elasticsearch / nodes / 0 / indices /を見ると、「1aS4RusHSYWLdt-Wx7NnBw」(Elasticsearchバージョン5.6.3)
JohanBouléNov

1
@JohanBoulé、このメソッドはElasticsearchのバージョン5以降は無効です。
Anh Le

@lucabelluccini、同意した。そのままにして、エイリアスを使用することをお勧めします。
Anh Le
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.