IM-BPM for Accel Platform セットアップガイド 第9版 2020-12-01

7.5. Elasticsearch の運用

7.5.1. 状態変化のタイミングとリスク

Elasticsearch の運用状態が変化するタイミングと、その時のリスクについて考察します。

7.5.1.1. 計画停止

手動やサービスによって、意図したタイミングで停止した場合を想定します。
また前提として、Elasticsearchを停止するタイミングではApplicationServerからの更新要求がないものとします。
  1. シャード再配置の無効化

    クラスタ構成にて運用されている場合、一定時間毎にシャードの再配置処理が実行されるため、停止前の準備としてこれを無効化します。
    cURLなどのツールを用いて、下記のRestAPI呼び出しを行います。
    # curl -XPUT http://localhost:9200/_cluster/settings -H 'Content-Type: application/json' -d'
    {
        "persistent": {
            "cluster.routing.allocation.enable": "none"
        }
    }'
    
    以下のような応答が返却されれば、シャードの再配置の無効化は完了です。
    {"acknowledged":true,"persistent":{"cluster":{"routing":{"allocation":{"enable":"none"}}}},"transient":{}}
    
  2. synced flush の実行

    クラスタ構成にて運用されている場合、再起動時のリカバリ処理を高速化するために、プライマリシャードとレプリカシャードの内容が同じであることの確認処理である、synced flush処理を行います。
    この処理はデフォルトでは5分間隔で自動的に実行される処理ですが、停止前に手動で起動するためにcURLなどのツールを用いて、下記のRestAPI呼び出しを行います。
    # curl -XGET http://localhost:9200/_flush/synced
    
    以下のような応答が返却されれば、synced flushは完了です。
    {"_shards":{"total":10,"successful":10,"failed":0},"im_bpm-default-2018":{"total":10,"successful":10,"failed":0}}
    
  3. ノードの停止作業

    クラスタに参加している全てのノードのElasticsearchを 「Ctrl」+「C」 コマンドなどで停止してください。

7.5.1.2. 異常停止

Elasticsearchが何らかの原因により、意図せず停止した場合を想定します。

コラム

以下のような状況が想定されます。

  • Elasticsearch内でサービスの継続が不可能な例外(OutOfMemoryError)が発生した場合
  • Elasticsearchのプロセスが強制停止された場合
  • Elasticsearch起動中にOSが停止した場合
  • flushが実行されていた場合
    異常停止前の最後のflushが実行されてから、新たなドキュメントが登録されていない場合
    flushが実行されているためデータ損失はなく、当然ながら対策を検討する必要はありません。
  • flushが実行されていない場合
    異常停止前の最後のflushが実行されてから、新たなドキュメントが登録されていた場合で、かつ、クラスタ構成の他のノードにレプリカシャードが存在しない場合(または、レプリカシャードは存在するが、同期される前であった場合)、または、クラスタ構成ではなく、単一のElasticsearchにて運用されていた場合、メモリ上に存在していたデータが失われます。

コラム

Elasticsearchの永続化のタイミングについて

Elasticsearchがメモリ上に保持しているデータをディスクなどの物理ドライブへ書きだす処理(flush)の実行タイミングには以下があります。
  • 一定時間毎に実行されるflush処理
  • トランザクションログのサイズが一定以上となった際に実行されるflush処理

また、cURLなどのツールを用いて、以下のようにRestAPIを呼び出すことで、手動でflush処理を起動することもできます。

# curl -XGET http://localhost:9200/_flush

7.5.2. バックアップ(スナップショットとリストア)

Elasticsearchでは、スナップショットを作成し、インデックスデータのバックアップを行うことができます。

7.5.2.1. リポジトリの登録

  1. スナップショット(インデックスのバックアップデータ)を格納するためのリポジトリの設定を行います。

    各ノード環境にてElasticsearchの設定が記載されている、<%ELASTICSEARCH_HOME%/config/elasticsearch.yml>ファイルをエディタで開き、下記の内容を追記します。(/mnt/repositoryは、適宜、ご使用の環境に合わせて指定してください)
    path.repo: ["/mnt/repository"]
    

    注意

    クラスタ構成の場合のリポジトリ

    Elasticsearchは、各ノードがそれぞれインデックスのデータを保持する分散システムのため、Elasticsearchをクラスタ構成にて運用されている場合、クラスタ構成に参加する全ノードから参照可能な共有ファイルストレージをリポジトリとして指定する必要があります。
  2. Elasticsearchへリポジトリの登録を行います。

    cURLなどのツールを用いて、下記のようにRestAPIの呼び出しを行います。
    # curl -XPUT http://localhost:9200/_snapshot/repository1 -H 'Content-type: application/json' -d '
    {
        "type": "fs",
        "settings":
        {
            "location": "/mnt/repository/repository1",
            "compress": true
        }
    }'
    
    以下のような応答が返却されれば、リポジトリの登録は完了です。
    {"acknowledged":true}
    

7.5.2.2. リポジトリの確認

登録したリポジトリの確認を行います。
cURLなどのツールを用いて、下記のようにRestAPIの呼び出しを行います。
# curl -XGET http://localhost:9200/_snapshot/repository1?pretty
以下のような応答が返却されれば、リポジトリの登録は完了です。
{
  "repository1" : {
    "type" : "fs",
    "settings" : {
      "compress" : "true",
      "location" : "/mnt/repository/repository1"
    }
  }
}

7.5.2.3. スナップショットの取得

スナップショットの取得を行います。
cURLなどのツールを用いて、下記のようにRestAPIの呼び出しを行います。
# curl -XPUT 'http://10.0.2.6:9200/_snapshot/repository1/snapshot1?wait_for_completion=true&pretty' -H 'content-type: application/json' -d '
{ "indices" : "im_bpm-default-2018" }'

コラム

インデックス名の指定について

スナップショットの取得の際には、下記のようにインデックスを複数指定することもできます。

* カンマ区切り({ “indices” : “im_bpm-default-2018,im_bpm-default-2019” })
* ワイルドカード({ “indices” : “im_bpm-default-*” })
以下のような応答が返却されれば、スナップショットの取得は完了です。
{
  "snapshot" : {
    "snapshot" : "snapshot1",
    "uuid" : "sPgSPpEHRRe-uU7ahj_E5w",
    "version_id" : 6050099,
    "version" : "6.5.0",
    "indices" : [
      "im_bpm-default-2018"
    ],
    "include_global_state" : true,
    "state" : "SUCCESS",
    "start_time" : "2019-01-16T01:46:10.295Z",
    "start_time_in_millis" : 1547603170295,
    "end_time" : "2019-01-16T01:46:10.944Z",
    "end_time_in_millis" : 1547603170944,
    "duration_in_millis" : 649,
    "failures" : [ ],
    "shards" : {
      "total" : 5,
      "failed" : 0,
      "successful" : 5
    }
  }
}

7.5.2.4. スナップショットの確認

作成済みのスナップショットの確認を行います。
cURLなどのツールを用いて、下記のようにRestAPIの呼び出しを行います。
# curl -XGET http://localhost:9200/_snapshot/repository1/snapshot1?pretty
以下のようにスナップショットの情報が返却されます。
{
  "snapshots" : [
    {
      "snapshot" : "snapshot1",
      "uuid" : "S_b7AAAdQvC3xe71DTXWtw",
      "version_id" : 6050099,
      "version" : "6.5.0",
      "indices" : [
        "im_bpm-default-2018"
      ],
      "include_global_state" : true,
      "state" : "SUCCESS",
      "start_time" : "2019-01-16T03:00:54.591Z",
      "start_time_in_millis" : 1547607654591,
      "end_time" : "2019-01-16T03:00:55.217Z",
      "end_time_in_millis" : 1547607655217,
      "duration_in_millis" : 626,
      "failures" : [ ],
      "shards" : {
        "total" : 5,
        "failed" : 0,
        "successful" : 5
      }
    }
  ]
}

7.5.2.5. スナップショットの削除

作成済みのスナップショットの削除を行います。
cURLなどのツールを用いて、下記のようにRestAPIの呼び出しを行います。
# curl -XDELETE http://localhost:9200/_snapshot/repository1/snapshot1?pretty
以下のような応答が返却されれば、スナップショットの削除は完了です。
{"acknowledged":true}

注意

インデックスの削除の際と同様、実行確認などは行われません。
スナップショットの削除を行う場合は、十分な検討を行ってください。

7.5.2.6. スナップショットのリストア

スナップショットからインデックスをリストア(復元)します。
cURLなどのツールを用いて、下記のようにRestAPIの呼び出しを行います。
# curl -XPOST http://localhost:9200/_snapshot/repository1/snapshot1/_restore -H 'content-type: application/json' -d '
{ "indices": "im_bpm-default-2018" }'
以下のような応答が返却されれば、スナップショットの削除は完了です。
{"accepted":true}

注意

リストアの際のインデックス名称について

スナップショットからインデックスのリストアを行う際、既に同名のインデックスが存在する場合、リストア処理が失敗します。
リストアを行う際は、既存の同名のインデックスを削除してから行うか、次節で説明するスナップショットから別名のインデックスとしてインデックスをリストアする方法を検討してください。

7.5.2.7. スナップショットから別名のインデックスとしてインデックスをリストア

スナップショット内のインデックスを別名のインデックスとしてリストアします。
cURLなどのツールを用いて、下記のようにRestAPIの呼び出しを行います。
# curl -XPOST http://localhost:9200/_snapshot/repository1/snapshot1/_restore -H 'content-type: application/json' -d '
{
    "indices": "im_bpm-default-2018",
    "rename_pattern": "im_bpm-default-([0-9]{4})",
    "rename_replacement": "restored_im_bpm-default-$1"
}'
以下のような応答が返却されれば、スナップショットの削除は完了です。
{"accepted":true}

コラム

インデックス名の変更について

スナップショット内のインデックス名を変更する際に、正規表現を用いて、変更パターンを指定できます。
上記例では、インデックス名の末尾4桁の数字をキャプチャ(()で囲んだ箇所を暗黙変数$xの値として確保する)して、変更後のインデックス名称に使用しています。
rename_patternに変更前のインデックス名にマッチする正規表現を、rename_replacement"に変更後に付与したいインデックス名を指定してください。