概要
Amazon Elasticsearch Service × Kibana で構築されたシステムで、
_restore apiでindexを復元するときに、
「cannot restore index [.kibana] because it's open」
というエラーについてメモします。
要因
Elasticsearch バージョン 5.1 以降では、Amazon ES が .kibana インデックスをモニタリングし、削除されている場合は再作成します。この動作により、復元が失敗します。
前提知識まとめ
・aws関連
・Elasticsearch関連(https://www.elastic.co/guide/jp/index.html)
・Kibana関連(https://www.elastic.co/products/kibana)
要件
esに登録されたデータやindexに対して、バックアップを取った時点に復元すること。
先に結論
index.kibana(Kibana自身の仕組み用)は復元できなくて、その以外のindexは指定して復元できる。
↓↓↓ AWSサポートセンターに確認した結果:
index.kibana(Kibana自身の仕組み用)は復元もできる。
通常の流れ
① _snapshot apiでsnapshotを作成
② _restore apiでindexを復元
実際にやりながら問題点を説明
※Kibana consoleで操作、検証
初期状態
GET /_cat/indices/*?v
↓
.kibanaのindexはデフォルトとして存在する。
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open .kibana abcdefghijklmnopqrstu 1 1 1 0 3.6kb 3.6kb
データやindexを投入後(投入操作は省略)
GET /_cat/indices/*?v
投入されたindexのtest-index-1、test-index-2が存在する。
↓
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open .kibana abcdefghijklmnopqrstu 1 1 1 0 3.6kb 3.6kb
yellow open test-index-1 klmnopqrstuabcdefghij 5 1 1 0 9.3kb 9.3kb
yellow open test-index-2 pqrstuabcdefghijklmno 5 1 5 0 9.4kb 9.4kb
現時点(index三つある)のsnapshotを作成(snapshot repositoryの作成は省略)
PUT _snapshot/es-backup-repo/my-snapshot
作成されたsnapshotの様子を見る
GET /_snapshot/es-backup-repo/_all
↓
snapshotは全indexが入ってる
...省略...
"indices": [
".kibana",
"test-index-1",
"test-index-2"
],
...省略...
現在すべてのindexを削除して復元する
DELETE *
↓
削除後
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open .kibana jklmnopqrstuabcdefghi 1 1 1 0 3.6kb 3.6kb
えええええーーーー
初期に存在する.kibanaは削除されていない
そのまま復元なら
POST /_snapshot/es-backup-repo/my-snapshot/_restore
↓
.kibanaが存在するので、復元ができない。
{
"error": {
"root_cause": [
{
"type": "snapshot_restore_exception",
"reason": "[es-backup-repo:my-snapshot/CAAUJ6GJSPCtkOuwSiGDnw] cannot restore index [.kibana] because it's open"
}
],
"type": "snapshot_restore_exception",
"reason": "[es-backup-repo:my-snapshot/CAAUJ6GJSPCtkOuwSiGDnw] cannot restore index [.kibana] because it's open"
},
"status": 500
}
解決案
.kibana以外のindexを復元することなら
indesを指定すればよい
POST /_snapshot/es-backup-repo/my-snapshot/_restore
{
"indices": "test-index-*"
}
確認
GET /_cat/indices/*?v
復元できた
↓
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open .kibana jklmnopqrstuabcdefghi 1 1 1 0 3.6kb 3.6kb
yellow open test-index-1 fghijklmnopqrstuabcde 5 1 1 0 9.3kb 9.3kb
yellow open test-index-2 mnopqrstuabcdefghijkl 5 1 5 0 9.4kb 9.4kb
.kibanaを復元しようにはどうする???
aws公式案:https://aws.amazon.com/jp/premiumsupport/knowledge-center/elasticsearch-kibana-error/
上記の超最近(公開日: 2018 年 08 月 31 日)の案は、やってみて、残念でだめだった。
原因は、既存のindex[.kibana]がrenameしても、reindexしても、削除できないこと。
(削除された一瞬にまた自動的.kibanaを作り直すこと。)
追記:
AWSサポートセンターへ問い合わせて、下記のような結果でした。
【2には、reindex API は dest の index が open の状態で存在していたとしても source のドキュメントを dest のドキュメントに移行可能であること、この操作によりスナップショットからリストアされた restored_.kibana インデックスの内容を .kibana インデックスに復元できるもの】って、
renameされたものindexは外見(uid)から見れば何も変わってないですが、中身もちゃんと復旧されたということですよね。