Elasticsearch6.0のRolling upgradesを試してみる

この記事は [NIFTY Advent Calendar 2017](https://qiita.com/advent-calendar/2017/nifty) の3日目の記事です。
2日目は @hicka04 さんの「[【Swift】MVCから脱却したいのでMVPの勉強をした](https://qiita.com/hicka04/items/25be38a90fdde29c97c2)」でした。

# 概要
2017年11月14日に[Elasticsearch 6.0がGAリリース](https://www.elastic.co/blog/elasticsearch-6-0-0-released)され、ダウンタイムなしに（クラスタの再起動なしに）Elasticsearchをバージョンアップできる [Rolling upgrades](https://www.elastic.co/guide/en/elasticsearch/reference/current/rolling-upgrades.html) が利用可能になりましたので、ドキュメントに従って手順を確認してみたいと思います。

# 環境
AWSのEC2インスタンス２台に Elasticsearch 5.6 をインストールし、クラスタ設定を行いました。

```Bash
[ec2-user@host1 ~]$ curl localhost:9200
{
  "name" : "node-1",
  "cluster_name" : "rolling-upgrades-test",
  "cluster_uuid" : "YI3En589S4yo-dLmZX57mg",
  "version" : {
    "number" : "5.6.4",
    "build_hash" : "8bbedf5",
    "build_date" : "2017-10-31T18:55:38.105Z",
    "build_snapshot" : false,
    "lucene_version" : "6.6.1"
  },
  "tagline" : "You Know, for Search"
}
```

```Bash
[ec2-user@host2 ~]$ curl localhost:9200
{
  "name" : "node-2",
  "cluster_name" : "rolling-upgrades-test",
  "cluster_uuid" : "YI3En589S4yo-dLmZX57mg",
  "version" : {
    "number" : "5.6.4",
    "build_hash" : "8bbedf5",
    "build_date" : "2017-10-31T18:55:38.105Z",
    "build_snapshot" : false,
    "lucene_version" : "6.6.1"
  },
  "tagline" : "You Know, for Search"
}
```

# 手順
## 1. シャードの再配置を無効化する
シャードの再配置を有効にしたままノードを停止すると、そのノードが保持していたシャードをクラスタ内の別のノードに移動しようとして無駄なIOが発生するため、ノードの停止前にシャードの再配置を無効化します。

```Bash
[ec2-user@host1 ~]$ curl -X PUT localhost:9200/_cluster/settings -d'
{
  "persistent": {
    "cluster.routing.allocation.enable": "none"
  }
}'
```

## 2. 不要なインデクシングを停止する
必要に応じて、Flush APIを利用して不要なインデクシングを停止することで、ノードを再組み込みする際のリカバリを高速化することができます。

```Bash
[ec2-user@host1 ~]$ curl -X POST localhost:9200/_flush/synced
```

## 3. ノードを停止する
アップデート対象のElasticsearchを停止します。
（停止方法は環境によって異なります）

```Bash
[ec2-user@host2 ~]$ sudo service elasticsearch stop
Stopping elasticsearch:                                    [  OK  ]
```

## 4. Elasticsearchをバージョンアップする
今回は5.6から6.0へアップデートします。
（アップデート方法は環境によって異なります）

```Bash
[ec2-user@host2 ~]$ sudo yum update elasticsearch
```

## 5. プラグインをアップデートする
プラグインを導入している場合は```elasticsearch-plugin```スクリプトを使ってアップデートします。

```Bash
[ec2-user@host2 elasticsearch]$ sudo bin/elasticsearch-plugin 
```

## 6. ノードを起動する
バージョンアップしたElasticsearchを起動します。
（起動方法は環境によって異なります）

```Bash
[ec2-user@host2 ~]$ sudo service elasticsearch start
Starting elasticsearch:                                    [  OK  ]
```

起動後にバージョンを確認すると、6.0へアップデートできていることがわかります。

```Bash
[ec2-user@host2 ~]$ curl localhost:9200
{
  "name" : "node-2",
  "cluster_name" : "rolling-upgrades-test",
  "cluster_uuid" : "YI3En589S4yo-dLmZX57mg",
  "version" : {
    "number" : "6.0.0",
    "build_hash" : "8f0685b",
    "build_date" : "2017-11-10T18:41:22.859Z",
    "build_snapshot" : false,
    "lucene_version" : "7.0.1",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}
```

## 7. シャードの再配置を有効化する
手順1 で無効化したシャードの再配置を有効化します。

```Bash
[ec2-user@host1 ~]$ curl -X PUT localhost:9200/_cluster/settings -d'
> {
>   "transient": {
>     "cluster.routing.allocation.enable": "all"
>   }
> }'
```

## 8. 起動したノードがクラスタへ組み込まれることを確認する
Cluster Health API等でバージョンアップしたノードが正常にクラスタへ組み込まれたことを確認します。

```Bash
[ec2-user@host1 ~]$ curl localhost:9200/_cluster/health?pretty
{
  "cluster_name" : "rolling-upgrades-test",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 2,
  "number_of_data_nodes" : 2,
  "active_primary_shards" : 0,
  "active_shards" : 0,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}
```

## 9. 手順1〜8を各ノードで繰り返す
クラスタ内のノード分だけ作業を繰り返します。

---

以上で Rolling upgrades の手順確認は完了です。
実際にバージョンアップを行う際には、バージョン間の差異など対応が必要になる箇所があるかと思いますので、都度ログを確認しながら作業しましょう。

明日は @kanishionori さんの記事です。お楽しみに！