web-dev-qa-db-ja.com

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

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

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

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

クラスターの状態は黄色で、elasticsearchは正しい状態を復元するための魔法をかけていました。しばらくして、私は

  • oldindexnameが使用可能であり、完全に複製されている(BおよびCから回復したと思います)
  • 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に名前を変更するにはどうすればよいですか?

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

94
WoJ

インデックスの名前を変更するには、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:-データをバックアップする新しいインデックス名。

42
krishna kumar

これを行うには REINDEX を使用できます。

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

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

REINDEXできない場合、回避策aliasesを使用します。 official ドキュメントから:

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

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

6
Leo

インデックスの名前の変更またはマッピングの変更を実現する別の方法は、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"
 }
}
5
Gabriel Rosca

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

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

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

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

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

5
lazywiz

スナップショットモジュールの弾性検索リファレンス に示されているように、

Rename_patternおよびrename_replacementオプションは、正規表現を使用した復元時にインデックスの名前を変更するためにも使用できます。

3
oldbam

次のコマンドは私のために働いた:

POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "new_index",
        "alias": "old_index"
      }
    },
    {
      "remove_index": {
        "index": "old_index"
      }
    }
  ]
}
0
Enayat