DUICUO

よく使われる3つのElasticsearchデータ移行ソリューション

自社構築のElasticsearchインスタンスをクラウドまたは別のElasticsearchクラスターに移行する予定の場合は、ビジネスニーズに基づいて適切な移行プランを選択できます。 如果业务可以停服或者可以暂停写操作以下の方法でデータを移行できます。

  • COSスナップショット、または​Cloud Object Storage​
  • ログスタッシュ
  • elasticsearch-dump

さまざまな移行方法の比較は次のとおりです。

移行方法

適用可能なシナリオ

COSスナップショット

​数据量大​(GB、TB、PB レベル)、 ​迁移速度要求较高​

ログスタッシュ

リアルタイム要件が高くないシナリオでの完全データまたは​增量数据​​迁移全量​、Elasticsearch クエリを使用した移行データの単純なフィルタリングを必要とするシナリオ、移行データの複雑なフィルタリングまたは処理を必要とするシナリオ、バージョン 5.x からバージョン 6.x または 7.x への移行など、バージョンの違いが大きいデータ移行シナリオ。

elasticsearch-dump

​数据量较小​シナリオ

I. COSスナップショット

COSスナップショットベースの移行方法は、Elasticsearch(ES) ​snapshot api​を使用します。基本的な原理は、ソースESクラスターからインデックススナップショットを作成し、それをターゲットESクラスターから復元することです。スナップショットを介してデータを移行する場合、ESバージョンの互換性に特に注意する必要があります。

ターゲット Elasticsearch クラスターのメジャー バージョン番号 (例: 5.6.4 の 5 はメジャー バージョン番号) は、ソース Elasticsearch クラスターのメジャー バージョン番号以上である必要があります。
バージョン 1.x クラスターで作成されたスナップショットは、バージョン 5.x では復元できません。

ソース Elasticsearch クラスターにリポジトリを作成します。

スナップショットを作成する前に、リポジトリを作成する必要があります。リポジトリには複数のスナップショットファイルを含めることができます。リポジトリにはいくつかの種類があります。

  • ​fs​ : 共有ファイルシステム。ファイルシステム内にスナップショットファイルを保存します。
  • ​url​​ ​: ファイルシステムのURLパスを指定します。サポートされるプロトコル: http、https、ftp、file、jar。
  • ​s3​ :AWS S3オブジェクトストレージ。スナップショットはS3に保存され、プラグインとしてサポートされています。このプラグインのインストールについては、 repository-s3 [1]を参照してください。
  • ​hdfs​ : スナップショットはhdfsに保存され、プラグインとしてサポートされています。このプラグインのインストールについては、 repository-hdfs [2]を参照してください。
  • ​cos​​ ​: スナップショットはTencent Cloud COSオブジェクトストレージに保存され、プラグインとしてサポートされています。このプラグインのインストールについては、 cos-repository [3]を参照してください。

自作ElasticsearchクラスターからTencent Cloud Elasticsearchクラスターに移行する場合、COS型リポジトリを直接使用できます。ただし、まず自作Elasticsearchクラスターにcos-repositoryプラグインをインストールし(プラグインを使用するにはインストール後にクラスターを再起動する必要があります)、自作Elasticsearchクラスター内のデータをCOSにバックアップし、Tencent Cloud Elasticsearchクラスターに復元することでデータ移行を完了できます。

自分で構築した Elasticsearch クラスターに cos-repository プラグインをインストールするのが面倒だが、repository-s3 または repository-hdfs プラグインをすでにインストールしている場合は、まずデータを S3 または HDFS にバックアップし、次にバックアップしたファイルを S3 または HDFS から Tencent Cloud COS にアップロードし、最後に Tencent Cloud クラスターに復元することができます。

COSスナップショットを使用してデータを移行する場合は、まずCOSリポジトリを作成する必要があります。リポジトリは次のコマンドで作成できます。

 _snapshot / my_cos_backup を配置します
{
「タイプ」 : 「cos」
"設定" {
「アプリID」 : 「xxxxxxx」
「アクセスキーID」 : 「xxxxxx」
"アクセスキーシークレット" : "xxxxxxx"
「バケット」 : 「xxxxxx」
「地域」 「ap-guangzhou」
圧縮」 true
"chunk_size" : "500mb"
"ベースパス" : "/"
}
}
  • app_id: Tencent Cloud アカウントの APPID。
  • access_key_id: Tencent Cloud API キーの SecretId。
  • access_key_secret: Tencent Cloud API キーの SecretKey。
  • bucket: COS バケット名、 appId サフィックスのないバケット名
  • リージョン: COS バケット リージョン。ES クラスターと同じリージョンである必要があります。
  • base_path: バックアップディレクトリ。

ソース Elasticsearch クラスターにスナップショットを作成します。

スナップショットAPIを呼び出して、インデックスデータをバックアップするためのスナップショットを作成します。スナップショットを作成する際、インデックスの一部のみをバックアップするか、すべてのインデックスをバックアップするかを指定できます。具体的なAPIパラメータについては、公式ドキュメントをご覧ください。

すべてのインデックスをバックアップする

ソース Elasticsearch クラスターからすべてのインデックスを​my_cos_backup​リポジトリにバックアップし、 ​snapshot_1​という名前を付けます。

 _snapshot / my_cos_backup / snapshot_1 を配置します

このコマンドはすぐに戻り、完了するまでバックグラウンドで非同期的に実行されます。スナップショット作成コマンドをブロックするには、 ​wait_for_completion​パラメータを追加してください。

 _snapshot / my_cos_backup / snapshot_1 を配置しますか?wait_for_completion = true 

コマンドの実行時間はインデックス サイズに関係します。

指定されたインデックスをバックアップする

スナップショットを作成するときに、バックアップするインデックスを指定できます。

 _snapshot / my_cos_backup / snapshot_2 を配置します
{
「インデックス」 : 「index_1,index_2」
}

パラメータ インデックスに複数のインデックスがある場合は、コンマ​,​区切る必要があり、スペースを含めることはできません。

スナップショットのステータスを表示する

スナップショットのバックアップが完了したかどうかを確認するには、以下のコマンドを使用します。返された結果の​state​フィールドが​SUCCESS​の場合、スナップショットのバックアップは成功したことを意味します。

 _snapshot / my_cos_backup / snapshot_1 を取得します。

ターゲット Elasticsearch クラスターにリポジトリを作成します。

ターゲット Elasticsearch クラスターにリポジトリを作成する方法は、ソース Elasticsearch クラスターにリポジトリを作成する方法とまったく同じです。

スナップショットからの復元

スナップショットにバックアップされたすべてのインデックスを Elasticsearch クラスターに復元します。

 POST _snapshot / my_cos_backup / snapshot_1 / _restore

snapshot_1 に5つのインデックスが含まれている場合、5つのインデックスすべてがElasticsearchクラスターに復元されます。追加オプションを使用してインデックスの名前を変更することもできます。このオプションを使用すると、パターンを使用してインデックス名を照合し、復元プロセスで新しい名前を指定できます。このオプションは、古いデータを復元して内容を検証したり、既存のデータを置き換えずに他の操作を実行したりする場合に役立ちます。スナップショットから1つのインデックスを復元し、新しい名前を指定するには、次のようにします。

 POST / _snapshot / my_cos_backup / snapshot_1 / _restore
{
「インデックス」 : 「index_1」
"rename_pattern" : "index_(.+)" ,
"rename_replacement" : "restored_index_$1"
}
  • インデックス: スナップショット内に存在する他のインデックスを無視して、index_1 のみを復元します。
  • rename_pattern: 復元され、指定されたパターンに一致するインデックスを検索します。
  • rename_replacement: 一致するインデックスの名前を代替パターンに変更します。

インデックス回復ステータスを確認する

​_recovery​ API を呼び出すことで、特定のインデックスのリカバリの進行状況を確認できます。

 index_1 / _recovery の取得

あるいは、以下のAPIを呼び出すことで、指定したインデックスのステータスを確認することもできます。返された結果の​status​​green​の場合、インデックスが完全に回復したことを意味します。

 GET _cluster / health / index_1

II.ログスタッシュ

Logstashは、Elasticsearchクラスター間でデータの読み取りと書き込みをサポートしているため、データ移行に使用できます。Logstashを移行に使用する前に、以下の点にご注意ください。

  • CVM を作成し、Tencent Cloud 上の ES クラスターと同じ VPC に Logstash をデプロイし、CVM がソース ES クラスターにアクセスできることを確認する必要があります。
  • Logstash をデプロイする場合は、16 個の CPU コアと 32 GB のメモリなど、比較的高い構成の CVM を選択するのが最適です。
  • Logstash のメジャーバージョン番号は、ターゲット Elasticsearch クラスターと同じである必要があります。例えば、ターゲット Elasticsearch クラスターのバージョンが 6.8.2 の場合、Logstash のバージョンも 6.8 である必要があります。
  • Elasticsearchのバージョンによってインデックスタイプに関する制約が異なるため、インデックスタイプには特に注意が必要です。Elasticsearchクラスターをメジャーバージョン間で移行する場合、インデックスタイプが原因でターゲットクラスターへの書き込みに失敗するなどの問題が発生する可能性があります。詳細については、「logstash-output-elasticsearch」プラグインの​document_type​パラメータに関するドキュメントを参照してください。

Logstash を使用したクラスター間のデータ移行によく使用される構成ファイルは次のとおりです。

入力{
エラスティックサーチ{
ホスト=> "1.1.1.1:9200"
インデックス=> "*"
ドキュメント情報=> true
サイズ=> 5000
スクロール=> "5m"
}
}

出力{
エラスティックサーチ{
ホスト=> [ "http://2.2.2.2:9200" ]
ユーザー=> "elastic"
パスワード=> "your_password"
インデックス=> "%{[@metadata][_index]}"
document_type => "%{[@metadata][_type]}"
ドキュメントID => "%{[@metadata][_id]}"
}
}

上記の設定ファイルは、ソースESクラスターのすべてのインデックスをターゲットクラスターに同期します。また、指定したインデックスのみを同期するように設定することもできます。logstashを使用した移行機能の詳細については、logstash-input-elasticsearchおよびlogstash-output-elasticsearch [4]を参照してください。

III. elasticsearch-dump

elasticsearch-dumpはオープンソースのESデータ移行ツールであり、 GitHub [5]で入手可能です。

  1. elasticsearch-dumpをインストールする

    elasticsearch-dump は Node.js を使用して開発されており、npm パッケージ マネージャーを使用して直接インストールできます。

     npmインストール elasticdump -g
  2. 主なパラメータの説明

     --input : ソースアドレス。Elasticsearch クラスターの URL、ファイル、または標準入力を指定できます。インデックスは、{protocol}://{host}:{port}/{index} の形式で指定できます。
    --input -index : ソースElasticsearchクラスターからのインデックス
    --output : 出力先アドレス。Elasticsearch クラスターの URL、ファイル、または標準出力を指定できます。インデックスは、{protocol}://{host}:{port}/{index} の形式で指定できます。
    --output -index : ターゲット Elasticsearch クラスターのインデックス。
    --type : 移行タイプ。デフォルトはデータで、データ移行のみを示します。オプションには、設定、アナライザー、データ、マッピング、エイリアスなどがあります。
  3. クラスターにセキュリティ認証機能がある場合は、以下の方法で再インデックスクラスターを認証できます。対応する `http` ディレクティブの後に `user:password@` を追加します。例: ​elasticsearch-dump --input=http://192.168.1.2:9200/my_index --output=http://user:[email protected]:9200/my_index --type=data​

  4. 単一のインデックスを移行する

    次の操作では、elasticdump コマンドを使用して、companydatabase インデックスをクラスター 172.16.0.39 からクラスター 172.16.0.20 に移行します。


    最初のコマンドは、まずインデックス設定を移行します。マッピングまたはデータを直接移行すると、シャード数やレプリカ数など、クラスター内の元のインデックス設定情報が失われます。もちろん、まずターゲットクラスターにインデックスを作成し、その後マッピングとデータを同期することもできます。

     elasticdump --input = http://172.16.0.39:9200/companydatabase --output = http://172.16.0.20:9200/companydatabase --type =設定
    elasticdump --input = http://172.16.0.39:9200/companydatabase --output = http://172.16.0.20:9200/companydatabase --type =マッピング
    elasticdump --input = http://172.16.0.39:9200/companydatabase --output = http://172.16.0.20:9200/companydatabase --type =データ
  5. すべてのインデックスを移行する

    次の操作では、elasticdump コマンドを使用して、すべてのインデックスをクラスター 172.16.0.39 からクラスター 172.16.0.20 に移行します。


    この操作では、シャード数やレプリカ数などのインデックス設定を移行できません。各インデックスを個別に移行するか、データを移行する前にターゲットクラスターにインデックスを作成する必要があります。

     elasticdump --input = http://172.16.0.39:9200 --output = http://172.16.0.20:9200

IV.要約

  1. Elasticsearch-dumpとLogstashはどちらも、クラスター間のデータ移行を実行する際に、移行タスクを実行するマシンが両方のクラスターに同時にアクセスできる必要があります。ネットワークが利用できない場合、移行は失敗するためです。一方、スナップショット移行は完全にオフラインで実行されるため、この制限はありません。したがって、ソースとターゲットのElasticsearchクラスターが同じネットワーク上にある場合、Elasticsearch-dumpとLogstashの移行方法はより適しています。クラウドベンダー間のアクセスが必要な移行では、Alibaba Cloud ElasticsearchクラスターからTencent Cloud Elasticsearchクラスターへの移行など、スナップショット移行を使用できます。クラスター間にネットワーク接続を確立することもできますが、コストは高くなります。
  2. elasticsearch-dumpツールは、MySQLデータベースのデータバックアップに使用されるmysqldumpツールに似ています。どちらも論理バックアップであり、インポート前にデータを1つずつエクスポートする必要があります。そのため、データ量が少ない移行シナリオに適しています。
  3. スナップショット方式は、大量のデータがあるシナリオでの移行に適しています。

参考文献

[1]リポジトリs3: https://www.elastic.co/guide/en/elasticsearch/plugins/current/repository-s3.html

[2]cosリポジトリ: https://www.elastic.co/guide/en/elasticsearch/plugins/current/repository-hdfs.html

[3]cosリポジトリ: https://github.com/tencentyun/elasticsearch-repository-cos

[4]リポジトリs3: https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.html

[5]elasticsearch-dump: https://github.com/taskrabbit/elasticsearch-dump