クラスター内のいくつかのインデックスの名前を変更する必要があります(名前を変更する必要があります、 aliases は使用できません)。
サポートされている方法はないことがわかりました。最も近いのは インデックスのディレクトリ名の変更 で、これをクラスターで試しました。
クラスターには3つのマシンA
、B
、および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
を削除して、以前の状態にロールバックしました。クラスタは「未割り当て」エントリなしで緑色に戻ります。
それを考えると、クラスターでoldindexname
をnewindexname
に名前を変更するにはどうすればよいですか?
注:私が念頭に置いている究極の解決策は、oldindex
をスクロールしてnewindex
にコピーし、後でoldindex
を削除することです。これには時間がかかりますので、より直接的な解決策があれば素晴らしいでしょう。
インデックスの名前を変更するには、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:-データをバックアップする新しいインデックス名。
これを行うには REINDEX を使用できます。
Reindexは、宛先インデックスを設定しようとしません。ソースインデックスの設定はコピーされません。マッピング、シャードカウント、レプリカなどの設定を含む_reindexアクションを実行する前に、 宛先インデックスを設定 する必要があります。
POST /_reindex
{
"source": {
"index": "Twitter"
},
"dest": {
"index": "new_Twitter"
}
}
DELETE /Twitter
REINDEXできない場合、回避策はaliasesを使用します。 official ドキュメントから:
elasticsearchのAPIは、特定のインデックスに対して作業する場合はインデックス名を受け入れ、該当する場合は複数のインデックスを受け入れます。インデックスエイリアスAPIを使用すると、名前にインデックスのエイリアスを作成でき、すべてのAPIがエイリアス名を実際のインデックス名に自動的に変換します。エイリアスは複数のインデックスにマッピングすることもできます。エイリアスを指定すると、エイリアスはエイリアスインデックスに自動的に展開されます。エイリアスは、検索時に自動的に適用され、値をルーティングするフィルターに関連付けることもできます。エイリアスはインデックスと同じ名前を持つことはできません。
More Like This機能を使用している場合、このソリューションは機能しないことに注意してください。 https://github.com/elastic/elasticsearch/issues/1656
インデックスの名前の変更またはマッピングの変更を実現する別の方法は、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"
}
}
そのため、ESでインデックスをコピーまたは名前変更する直接的な方法はありません(自分のプロジェクトを広範囲に検索しました)
ただし、非常に簡単なオプションは、一般的な移行ツール[Elastic-Exporter]を使用することです。
http://www.retailmenot.com/corp/eng/posts/2014/12/02/elasticsearch-cluster-migration/
[PS:これは私のブログではなく、偶然見つけて、それが良いとわかった]
これにより、インデックス/タイプをコピーしてから古いものを削除できます。
スナップショットモジュールの弾性検索リファレンス に示されているように、
Rename_patternおよびrename_replacementオプションは、正規表現を使用した復元時にインデックスの名前を変更するためにも使用できます。
次のコマンドは私のために働いた:
POST /_aliases
{
"actions": [
{
"add": {
"index": "new_index",
"alias": "old_index"
}
},
{
"remove_index": {
"index": "old_index"
}
}
]
}