スナップショットを使用して、Amazon OpenSearch Service から Alibaba Cloud Elasticsearch にインデックスを移行します。このガイドでは Elasticsearch 7.1.0 クラスターを使用します。
仕組み
このクラウド非依存のソリューションは、Elasticsearch のスナップショット機能を使用します。Alibaba Cloud の Migration Implementation ツールを使用して、AWS ES のインデックスまたは Tencent Cloud COS のスナップショットデータを Alibaba Cloud OSS に移行し、OSS リポジトリから復元します。Manual Backup and Restoration
スナップショットは、同一またはそれ以降のバージョンのクラスターにのみ復元できます。Snapshot compatibility
背景情報
この移行の参照アーキテクチャは次のとおりです。

概念
-
Elasticsearch:分散型の RESTful 検索および分析エンジンです。Elastic Stack の中核として、検索と分析のためのデータを一元的に保存します。
-
Kibana:Elasticsearch データを検索および分析するための可視化ツールです。
-
Amazon OpenSearch Service:Elasticsearch API とリアルタイム分析を提供する AWS のマネージドサービスです。
-
Alibaba Cloud Elasticsearch:オープンソース Elasticsearch をベースとしたマネージドサービスで、データ分析および検索シナリオ向けに設計されています。エンタープライズグレードのアクセス制御、セキュリティ監視とアラート、自動レポートを提供します。
-
スナップショットと復元:個々のインデックスまたはクラスター全体のスナップショットをリモートリポジトリ (共有ファイルシステム、Amazon S3、または HDFS) に作成し、互換性のある Elasticsearch バージョンに復元します。
-
バージョン 5.x で作成したインデックスのスナップショットは、バージョン 6.x に復元できます。
-
バージョン 2.x で作成したインデックスのスナップショットは、バージョン 5.x に復元できます。
-
バージョン 1.x で作成したインデックスのスナップショットは、バージョン 2.x に復元できます。
-
ソリューション概要
移行手順:
-
ベースラインインデックスを作成します。
-
スナップショットリポジトリを作成し、Amazon Simple Storage Service (Amazon S3) バケットに関連付けます。
-
移行するインデックスの最初の完全スナップショットを作成します。
このスナップショットは、前の手順で作成した Amazon S3 バケットに自動的に保存されます。
-
Alibaba Cloud で Object Storage Service (OSS) バケットを作成し、Alibaba Cloud Elasticsearch クラスターのスナップショットリポジトリとして登録します。
-
ossimport を使用して、Amazon S3 バケットから Alibaba Cloud OSS バケットにデータを転送します。
-
この完全スナップショットを Alibaba Cloud Elasticsearch クラスターに復元します。
-
-
増分スナップショットを定期的に処理します。
前述の手順を繰り返して、増分スナップショットを処理して復元します。
-
最終スナップショットを作成し、サービスカットオーバーを実施します。
-
インデックスデータを変更する可能性があるサービスを停止します。
-
ソースの Amazon OpenSearch Service ドメインの最終増分スナップショットを作成します。
-
最終増分スナップショットを OSS に移行し、その後 Alibaba Cloud Elasticsearch クラスターに復元します。
-
サービスを Alibaba Cloud Elasticsearch クラスターに切り替え、移行を検証します。
-
前提条件
次の項目を確認してください。
-
Elasticsearch 7.1.0 の Amazon OpenSearch Service ドメインがシンガポールリージョンに作成されていること。
-
バージョン 7.1.0 の Alibaba Cloud Elasticsearch クラスターが中国 (杭州) リージョンに作成されていること。
-
OSS バケットが作成されていること。
このガイドでは、中国 (杭州) リージョンのバケットを使用します。ストレージクラスは Standard、ACL は非公開です。それ以外のパラメーターはデフォルト設定を使用します。Create buckets。
-
移行するインデックスを用意してください。このトピックでは、
moviesというインデックスを例として使用します。
AWSでの手動スナップショットの前提条件
Amazon OpenSearch Service は、プライマリインデックスシャードの日次スナップショットを自動的に作成し、事前設定された S3 バケットに 14 日間、追加料金なしで保存します。これらのスナップショットはドメインを復元できますが、新しいドメインにデータを移行することはできません。移行するには、独自の S3 バケットに手動スナップショットを作成します。標準の S3 ストレージ料金が適用されます。
インデックスのスナップショットを手動で作成および復元するには、IAM と Amazon S3 が必要です。スナップショットを作成する前に、次の前提条件が満たされていることを確認してください。
|
前提条件 |
説明 |
|
Amazon S3 バケットを作成する |
Amazon OpenSearch Service ドメインの手動スナップショットを保存します。 |
|
IAM ロールを作成する |
Amazon OpenSearch Service に権限を付与します。信頼関係の |
|
IAM ポリシーを作成する |
IAM ロールが S3 バケットに対して実行できるアクションを指定します。このポリシーを IAM ロールにアタッチします。Resource ステートメントで S3 バケットの ARN を指定する必要があります。 |
-
Amazon S3 バケットの作成
手動スナップショットを保存するための S3 バケットを作成します。次の用途で使用するため、ARN を記録しておいてください。
-
IAM ロールにアタッチする IAM ポリシーの Resource ステートメント。
-
スナップショットリポジトリを登録するために使用する Python クライアント。
S3 バケット ARN の例:
arn:aws:s3:::eric-es-index-backups -
-
IAM ロールの作成
IAM ロールの信頼関係で、
es.amazonaws.comがServiceステートメントに指定されていることを確認してください。{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "es.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }IAM コンソールで信頼関係の詳細を確認します。
説明AWS サービス用のロールを作成する際、Amazon OpenSearch Service は Select role type ドロップダウンリストに表示されません。AWS EC2 を選択してロールを作成し、その後、信頼関係を編集して
ec2.amazonaws.comをes.amazonaws.comに変更してください。 -
IAM ポリシーの作成
IAM ポリシーを作成し、IAM ロールにアタッチします。次の例では、
eric-es-index-backupsバケットの ARN を指定しています。{ "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:ListBucket" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::eric-es-index-backups" ] }, { "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::eric-es-index-backups/*" ] } ] }-
ポリシーの内容をポリシーエディターにコピーします。

-
ポリシーを確認します。

-
IAM ポリシーを IAM ロールにアタッチします。

-
手順 1:手動スナップショットリポジトリの登録
手動スナップショットを作成する前に、Amazon OpenSearch Service にスナップショットリポジトリを登録します。IAM ロールの信頼関係で指定したユーザーまたはロールの認証情報を使用して、登録リクエストに署名します。Prerequisites for manual snapshots on AWS。
curl は AWS のリクエスト署名をサポートしていないため、スナップショットリポジトリの登録には使用できません。代わりに、サンプルの Python クライアント (register_snapshot_repository.py) を使用してください。
-
register_snapshot_repository.py ファイルをダウンロードします。
-
サンプルの Python クライアントファイルを変更します。
ハイライトされている値を構成に合わせて更新し、ファイルを snapshot.py として保存します。
サンプルの Python クライアントファイルのパラメーター:
パラメーター
説明
region
スナップショットリポジトリを作成する AWS リージョンです。
host
Amazon OpenSearch Service ドメインのエンドポイントです。
aws_access_key_id
IAM 認証情報のアクセスキー ID です。
aws_secret_access_key
IAM 認証情報のシークレットアクセスキーです。
path
スナップショットリポジトリへのパスです。
data
IAM ロール用に作成した S3 バケットの名前と ARN を含める必要があります。Prerequisites for manual snapshots on AWS。
重要-
スナップショットリポジトリで S3 管理キーによるサーバー側の暗号化を有効にするには、settings JSON に
"server_side_encryption": trueを追加します。 -
Amazon S3 バケットが ap-southeast-1 リージョンにある場合は、
"region": "ap-southeast-1"の代わりに"endpoint": "s3.ap-southeast-1.amazonaws.com"を使用します。
-
-
boto-2.48.0 をインストールします。
サンプルの Python クライアントには boto 2.x が必要です。
# wget https://pypi.python.org/packages/66/e7/fe1db6a5ed53831b53b8a6695a8f134a58833cadb5f2740802bc3730ac15/boto-2.48.0.tar.gz#md5=ce4589dd9c1d7f5d347363223ae1b970 # tar zxvf boto-2.48.0.tar.gz # cd boto-2.48.0 # sudo python setup.py install -
Python クライアントを実行してスナップショットリポジトリを登録します。
# python snapshot.py -
Amazon OpenSearch Service ドメインの Kibana コンソールで、[デベロッパーツール] > [コンソール] に移動して、次を実行します。
GET _snapshot
手順 2:初期スナップショットの作成と復元
-
Amazon OpenSearch Service でスナップショットを手動で作成します。
説明次のコマンドを Kibana コンソールで実行するか、Linux または macOS のコマンドラインから curl を使用して実行します。
-
eric-snapshot-repositoryリポジトリ内のmoviesインデックスに対して、snapshot_movies_1という名前のスナップショットを作成します。PUT _snapshot/eric-snapshot-repository/snapshot_movies_1 { "indices": "movies" } -
スナップショットのステータスを確認します。
GET _snapshot/eric-snapshot-repository/snapshot_movies_1
-
Amazon S3 コンソールでスナップショットファイルを確認します。

-
-
スナップショットデータを Amazon S3 から Alibaba Cloud OSS に転送します。
Migrate applications from Amazon S3 to OSS。
転送後、OSS コンソールでスナップショットデータを確認します。

-
スナップショットを Alibaba Cloud Elasticsearch クラスターに復元します。
-
スナップショットリポジトリを作成します。
重要Elasticsearch のスナップショット移行では、各 Elasticsearch クラスターが専用のスナップショットリポジトリまたはパスを使用していることを確認する必要があります。複数のクラスターが同じリポジトリを共有すると、データの復元に失敗したり、データが失われたりする可能性があります。
移行先の Alibaba Cloud Elasticsearch クラスターの Kibana コンソール (Kibana コンソールにログオンする) で、[開発ツール] > [コンソール] に移動し、同じ名前のスナップショットリポジトリを作成します。
PUT _snapshot/eric-snapshot-repository { "type": "oss", "settings": { "base_path": "my/snapshot/directory" "endpoint": "http://oss-cn-hangzhou-internal.aliyuncs.com", "access_key_id": "your AccessKeyID", "secret_access_key": "your AccessKeySecret ", "bucket": "eric-oss-aws-es-snapshot-s3", "compress": true } } -
snapshot_movies_1という名前のスナップショットのステータスを確認します。GET _snapshot/eric-snapshot-repository/snapshot_movies_1
説明ossimport による増分スナップショット移行の開始時刻と終了時刻を控えておいてください。
-
"start_time_in_millis": 1519786844591
-
"end_time_in_millis": 1519786846236
-
-
-
スナップショットを復元します。
POST _snapshot/eric-snapshot-repository/snapshot_movies_1/_restore { "indices": "movies" }moviesインデックスの可用性を確認します。GET movies/_recovery復元に成功すると、
moviesインデックスには 3 件のドキュメントが含まれ、Amazon OpenSearch Service ドメインと一致します。
手順 3:最終スナップショットの作成と復元
-
Amazon OpenSearch Service ドメインの
moviesインデックスにデータを挿入します。moviesインデックスにはすでに 3 件のドキュメントがあります。さらに 2 件挿入します。
GET movies/_countコマンドを使用して、インデックス内のドキュメント数を確認します。 -
別のスナップショットを手動で作成します。
別のスナップショットを作成します。詳細については、「Amazon OpenSearch Service でスナップショットを手動で作成する」をご参照ください。
PUT _snapshot/eric-snapshot-repository/snapshot_movies_2 { "indices": "movies" }スナップショットのステータスを確認します。
GET _snapshot/eric-snapshot-repository/snapshot_movies_2Amazon S3 バケットにリストされているファイルを確認します。

-
増分スナップショットデータを Amazon S3 から Alibaba Cloud OSS に転送します。
ossimport を使用して S3 から OSS にデータを移行します。新しいファイルのみを移行するには、local_job.cfg で
isSkipExistFileを true に設定します。isSkipExistFileが true の場合、sizeとLastModifiedTimeが一致するオブジェクトはスキップされます。false (デフォルト) の場合、既存のオブジェクトは上書きされます。このオプションはjobTypeがauditの場合は無効です。移行後、OSS で新しいファイルを確認します。

-
増分スナップショットを復元します。
手順 2:初期スナップショットの作成と復元 のスナップショット復元手順に従います。復元前に
moviesインデックスをクローズし、復元後にmoviesインデックスを再オープンします。-
moviesインデックスをクローズします。POST /movies/_close -
moviesインデックスのステータスを確認します。GET movies/_stats -
増分スナップショットを復元します。
POST _snapshot/eric-snapshot-repository/snapshot_movies_2/_restore { "indices": "movies" } -
moviesインデックスをオープンします。POST /movies/_open
復元後、
moviesインデックスには5件のドキュメントが含まれ、Amazon OpenSearch Service ドメインと一致します。
-
まとめ
スナップショットを使用して、Amazon OpenSearch Service から Alibaba Cloud Elasticsearch にインデックスデータを移行します。移行中の書き込みやリクエストを防ぐため、復元前に移行先クラスター上のインデックスをクローズする必要があります。
関連リソース:
よくある質問
なぜリポジトリの一意性が必要なのですか?
複数の Elasticsearch クラスターが同じスナップショットリポジトリを共有すると、次の問題が発生する可能性があります。
-
メタデータの競合:複数のクラスターが同じリポジトリ上で動作すると、メタデータファイルが上書きまたは破損し、スナップショットを正しく識別できなくなる可能性があります。
-
データの上書き:異なるクラスターのスナップショットが相互にデータファイルを上書きし、データ損失や破損が発生する可能性があります。
-
復元の失敗:Elasticsearch がどのデータがどのクラスターに属するかを判断できず、復元操作が失敗したり、誤ったデータが復元されたりする可能性があります。
OSS スナップショットの復元が失敗するのはなぜですか?
OSS 内のスナップショットオブジェクト名にスラッシュ (/) などの特殊文字が含まれている場合、このエラーが発生することがあります。
Alibaba Cloud Elasticsearch は、OSS スナップショットの復元時に特殊文字を含むオブジェクト名をサポートしていません。ossbrowser を使用して、スナップショットデータを標準的な名前のフォルダーに移動してください。