ちょっと話題の記事

【アップデート】Amazon Elasticsearch Serviceでダウンタイム無しアップグレードが可能になりました

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

大栗です。

Amazon Elasticsearch Serviceでダウンタイム無しのインプレースアップグレードが可能になりました。早速試してみましたのでレポートします。

Elasticsearch Serviceのアップグレード

今までElasticsearch Serviceのアップグレードは以下のエントリーのように一旦スナップショットを取得して新しいバージョンのドメインを再作成する必要がありました。

Amazon Elasticsearch Service でバージョン 2.3 から 5.1 へ移行する

今回のアップデートではElasticsearchのローリングアップグレードに対応したことでダウンタイム無しのアップグレードが可能になっている模様です。

Elasticsearchのアップグレードのドキュメントによると、バージョン5系の間、バージョン5.6から6系、バージョン6系の間でローリングアップグレードが可能と記載されていますが、Elasticsearch Serviceでは以下のバージョン間のアップグレードがサポートされています。また、今回のアップデートと同タイミングでElasticsearch serviceでバージョン5.6とバージョン6.3がサポート1されました。

  • バージョン6.x -> バージョン6.3
  • バージョン5.6 -> バージョン6.3
  • バージョン5.x -> バージョン5.6

アップグレードでは、以下のステップで実行されます。

  1. アップグレードの適格性の確認
  2. スナップショットの作成
  3. アップグレード

アップグレードの前に適格性の確認を行うため、安全にアップグレードが可能です。

注意

以下のエントリーにElasticsearch 6での互換性の注意点がまとまっています。バージョン6へのアップグレード前によく確認しておきましょう。

Elasticsearch 6 を利用する前に把握しておいた方がよさそうなこと

やってみた

以下の環境を前提として実施しています。

  • リージョン: 東京
  • Elasticsearchのバージョン: 5.1
  • インスタンス数: 3

以下のように2回バージョンアップを行い、5.1から6.3まで移行してみます。

  1. バージョン5.1 -> バージョン5.6 のアップグレード
  2. バージョン5.6 -> バージョン6.3 のアップグレード

バージョン5.1 -> バージョン5.6 のアップグレード

事前にバージョン5.1のドメインを作成しておきます。

右上のドメインのアップグレードをクリックするとアップグレードについての画面が表示されます。アップグレード先のバージョン(元が5.1の場合は5.5)とオペレーションの選択をします。ここでは、一旦アップグレードの適格性の確認を選択して実行します。

アップグレード中に読み書きは可能ですが設定変更できない旨のメッセージが表示されます。

数秒アップグレード処理中のステータスになりますが、すぐに確認が完了します。

今回は特に問題がなかったので、実際にアップグレードを実施します。アップグレード履歴からアップグレードの状況が確認できます。

ここでドメインのバージョンを確認してみます。アップグレード処理の最初は、以下のようにバージョンが5.1.1となっています。

$ curl -s -XGET "https://vpc-from51-abcdefghijklmnopqrstuvwxyz.ap-northeast-1.es.amazonaws.com/_cluster/stats" | jq .nodes.versions -c
["5.1.1"]

処理が進むと、バージョンが5.1.15.6.8の両方になります。ローリングアップデートの最中でクラスタの中に複数のバージョンが混在しています。

$ curl -s -XGET "https://vpc-from51-abcdefghijklmnopqrstuvwxyz.ap-northeast-1.es.amazonaws.com/_cluster/stats" | jq .nodes.versions -c
["5.1.1","5.6.8"]

アップグレード処理が完了すると、バージョンが5.6.8だけになります。

$ curl -s -XGET "https://vpc-from51-abcdefghijklmnopqrstuvwxyz.ap-northeast-1.es.amazonaws.com/_cluster/stats" | jq .nodes.versions -c
["5.6.8"]

バージョン5.6 -> バージョン6.3 のアップグレード

次に5系から6系へアップグレードします。

また適格性の確認を行います。今後はアップグレード先のバージョンが6.3になっています。

今回も問題は発生しませんでした。

実際にアップグレードを実施します。

アップグレードの処理が進みます。

またここでアップグレード処理中のバージョンを確認してみます。アップグレード処理の最初は、以下のようにバージョンが5.6.8となっています。

$ curl -s -XGET "https://vpc-from51-abcdefghijklmnopqrstuvwxyz.ap-northeast-1.es.amazonaws.com/_cluster/stats" | jq .nodes.versions -c
["5.6.8"]

処理が進むと、バージョンが5.6.86.3.1の両方になります。ローリングアップデートの最中でクラスタの中に複数のバージョンが混在しています。

$ curl -s -XGET "https://vpc-from51-abcdefghijklmnopqrstuvwxyz.ap-northeast-1.es.amazonaws.com/_cluster/stats" | jq .nodes.versions -c
["6.3.1","5.6.8"]

アップグレード処理が完了すると、バージョンが6.3.1だけになります。

$ curl -s -XGET "https://vpc-from51-abcdefghijklmnopqrstuvwxyz.ap-northeast-1.es.amazonaws.com/_cluster/stats" | jq .nodes.versions -c
["6.3.1"]

データの投入

upgrade_indexという名前でインデックスを作成します。

$ curl -s -X PUT https://vpc-from51-abcdefghijklmnopqrstuvwxyz.ap-northeast-1.es.amazonaws.com/upgrade_index
{"acknowledged":true,"shards_acknowledged":true,"index":"upgrade_index"}

適当なデータを投入してみます。

$ curl -s -X PUT https://vpc-from51-abcdefghijklmnopqrstuvwxyz.ap-northeast-1.es.amazonaws.com/upgrade_index/datetime/$(date +%s)?pretty -H "Content-Type: application/json" -d '
> {
>   "data" : "TEST"
> }'
{
  "_index" : "upgrade_index",
  "_type" : "datetime",
  "_id" : "1534334174",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 2,
    "failed" : 0
  },
  "_seq_no" : 1,
  "_primary_term" : 1
}

普通にデータも検索できます。

$ $ curl -s -XGET https://vpc-from51-lufsdt22rcckr4twhmv3ixejvi.ap-northeast-1.es.amazonaws.com/upgrade2_index/_search | jq .
{
  "took": 37,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
      {
        "_index": "upgrade2_index",
        "_type": "datetime",
        "_id": "1534334436",
        "_score": 1,
        "_source": {
          "data": "TEST"
        }
      }
    ]
  }
}

さいごに

今まではアップグレードのためにスナップショットの取得とドメインの再作成が必要であったため、アップグレードの最中に読み書きが行えませんでした。そのためサービスをメンテナンスモードにしたりと簡単には運用中にアップグレードができませんでした。

今回インプレースかつダウンタイム無しでのアップグレードをサポートしたため、サービス運用中でも(当然負荷の少ない時間帯に行うべきですが)アップグレードが行えるようになりました。このアップデートによりさほど躊躇せずにアップグレードが出来るようになるのではないでしょうか。