Elasticsearchをバージョンアップする前の準備


## 概要

Kibanaを利用するにあたり、開発環境に入っているElasticsearchが古すぎたため、最新のバージョンにアップデートをしようと。
[こちら](https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-upgrade.html)の公式ガイドを見たところ、[Elasticsearch Migration Plugin](https://github.com/elastic/elasticsearch-migration/)なるものがあり、移行時に必要な作業等をチェックしてくれる模様。

ここでは、1.x -> 2.xのバージョンアップが可能かをチェックしてみる。ガイドは[こちら](https://github.com/elastic/elasticsearch-migration/tree/1.x)。
ちなみに、2.x -> 5.xの場合は[こちら](https://github.com/elastic/elasticsearch-migration/tree/2.x)を参照。

作業環境はAWSのEC2インスタンス。

## Elasticsearch Migration Pluginの導入

```bash
# elasticsearchのあるディレクトリに移動
$ cd /usr/local/share/elasticsearch

# インストール実行
$ ./bin/plugin -i migration -u https://github.com/elastic/elasticsearch-migration/releases/download/v1.19/elasticsearch-migration-1.19.zip
-> Installing migration...

# エラー(ディレクトリのパーミッションの問題)
Failed to install migration, reason: plugin directory /usr/local/share/elasticsearch/plugins is read only

# rootで実行
$ sudo ./bin/plugin -i migration -u https://github.com/elastic/elasticsearch-migration/releases/download/v1.19/elasticsearch-migration-1.19.zip
-> Installing migration...
Trying https://github.com/elastic/elasticsearch-migration/releases/download/v1.19/elasticsearch-migration-1.19.zip...
Failed: IOException[Can't get https://github.com/elastic/elasticsearch-migration/releases/download/v1.19/elasticsearch-migration-1.19.zip to /usr/local/share/elasticsearch/plugins/migration.zip]; nested: FileNotFoundException[https://github.com/elastic/elasticsearch-migration/releases/download/v1.19/elasticsearch-migration-1.19.zip]; nested: FileNotFoundException[https://github.com/elastic/elasticsearch-migration/releases/download/v1.19/elasticsearch-migration-1.19.zip];
Trying https://github.com/null/migration/archive/master.zip...
Failed to install migration, reason: failed to download out of all possible locations..., use --verbose to get detailed information
```

バージョンが存在しない、と怒られた。

[releases](https://github.com/elastic/elasticsearch-migration/releases)を確認したところ、v1.18がいたので、とりあえずこれを入れてみる。

```bash
# インストール
$ sudo ./bin/plugin -i migration -u https://github.com/elastic/elasticsearch-migration/releases/download/v1.18/elasticsearch-migration-1.18.zip
-> Installing migration...
Trying https://github.com/elastic/elasticsearch-migration/releases/download/v1.18/elasticsearch-migration-1.18.zip...
Downloading ...............................................................DONE
Installed migration into /usr/local/share/elasticsearch/plugins/migration
```

## ブラウザから確認

http://<ホスト名>:9200/_plugin/migration/
をブラウザで開く。
![capture_elastic_migration.png](https://qiita-image-store.s3.amazonaws.com/0/30307/042b7a0e-5fa0-71f2-5ee7-cf672cef2401.png "capture_elastic_migration.png")

「Run checks now」のボタンをクリックし、下記のように「All checks completed successfully.」と表示されれば、バージョン移行可能なことが分かる。
![Kobito.5pvKaA.png](https://qiita-image-store.s3.amazonaws.com/0/30307/2246d04a-5118-f50d-e16d-72e7428df26d.png "Kobito.5pvKaA.png")


## インデックスのバックアップ

移行時はこちらの[スナップショットとリストア](https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html)の機能を利用すれば良いらしい。

elasticsearch.ymlに下記を追記。

```config/elasticsearch.yml
path.repo: ["/usr/local/share/elasticsearch_snapshot"]
```


```bash
# バックアップ先のディレクトリ作成
$ sudo mkdir -p /usr/local/share/elasticsearch_snapshot
$ sudo chmod 777 /usr/local/share/elasticsearch_snapshot

# リポジトリを登録
$ curl -XPUT 'http://localhost:9200/_snapshot/snapshot1' -d '{
    "type": "fs",
    "settings": {
        "location": "/usr/local/share/elasticsearch_snapshot/snapshot1",
        "compress": true
    }
}'
{"acknowledged":true}

# 確認
$ ls -l /usr/local/share/elasticsearch_snapshot
合計 4
drwxr-xr-x 2 root root 4096  1月 15 22:08 snapshot1

# バックアップ(スナップショットの取得)
# ここでは、「areas」インデックスのスナップショットを、「areas-2017.01.15」に取得する
$ curl -XPUT 'http://localhost:9200/_snapshot/snapshot1/areas-2017.01.15?wait_for_completion=true' -d '{
    "indices": "areas",
    "ignore_unavailable": true,
    "include_global_state": false
}'
{"snapshot":{"snapshot":"areas-2017.01.15","indices":["areas"],"state":"SUCCESS","start_time":"2017-01-15T13:13:55.213Z","start_time_in_millis":1484486035213,"end_time":"2017-01-15T13:13:55.353Z","end_time_in_millis":1484486035353,"duration_in_millis":140,"failures":[],"shards":{"total":5,"failed":0,"successful":5}}}

# ディレクトリ確認
$ ls -l /usr/local/share/elasticsearch_snapshot/snapshot1
合計 16
-rw-r--r-- 1 root root   39  1月 15 22:13 index
drwxr-xr-x 3 root root 4096  1月 15 22:13 indices
-rw-r--r-- 1 root root   61  1月 15 22:13 metadata-areas-2017.01.15
-rw-r--r-- 1 root root  183  1月 15 22:13 snapshot-areas-2017.01.15

# スナップショット確認
$ curl -XGET 'http://localhost:9200/_snapshot/snapshot1/areas-2017.01.15'
{"snapshots":[{"snapshot":"areas-2017.01.15","indices":["areas"],"state":"SUCCESS","start_time":"2017-01-15T13:13:55.213Z","start_time_in_millis":1484486035213,"end_time":"2017-01-15T13:13:55.353Z","end_time_in_millis":1484486035353,"duration_in_millis":140,"failures":[],"shards":{"total":5,"failed":0,"successful":5}}]}

```




## バックアップを利用してリストアを試す

```bash
$ curl -XPOST 'http://localhost:9200/_snapshot/snapshot1/areas-2017.01.15/_restore' -d '{
    "indices": "areas",
    "include_global_state": false
}'
{"error":"SnapshotRestoreException[[snapshot1:areas-2017.01.15] cannot restore index [areas] because it's open]","status":500}
```

インデックスが登録済なので上書きできない、ということのよう。
ので、一旦削除。

```bash
$ curl -XDELETE http://localhost:9200/areas
{"acknowledged":true}
```

再度リストア実行。

```bash
$ curl -XPOST 'http://localhost:9200/_snapshot/snapshot1/areas-2017.01.15/_restore' -d '{
    "indices": "areas",
    "include_global_state": false
}'
{"accepted":true}
```