このチュートリアルでは、Aerospike から Bigtable にデータを移行する方法について説明します。このチュートリアルでは、Aerospike と Bigtable の違いと、Bigtable で実行するためにワークロードを変換する方法について説明します。このチュートリアルは、 Google Cloud で Aerospike に似たデータベース サービスを探している方を対象としています。また、データベース スキーマ、データ型、NoSQL の基本、リレーショナル データベース システムについての知識があることを前提としています。ここでは主に定義済みのタスクを使用して移行を行います。このチュートリアルを完了すると、実際の環境に合わせてコードと手順を変更できるようになります。
Bigtable は、ペタバイト規模のフルマネージド NoSQL データベース サービスで、大規模な分析ワークロードや運用ワークロードに使用できます。低レイテンシで、可用性と耐久性に優れたペタバイト規模のサービスのストレージ エンジンとして利用できます。Bigtable では、Dataproc や BigQuery などの Google Cloud データ分析サービスを使用してデータを分析できます。
Bigtable は、AeroSpike や Cassandra などの NoSQL データベースで実装されている広告テクノロジー(広告技術)、金融技術(フィンテック)、モノのインターネット(IoT)サービスに最適です。NoSQL マネージド サービスをお探しの場合は、Bigtable をご利用ください。
アーキテクチャ
次のリファレンス アーキテクチャの図は、Aerospike から Bigtable へのデータの移行に使用できる一般的なコンポーネントを示しています。
上の図では、次の 2 つの方法で Aerospike を使用するオンプレミス環境から Google Cloud の Bigtable にデータを移行しています。最初の方法はバッチ処理によるデータの移行です。まず、Aerospike のバックアップ データを Cloud Storage バケットに移動します。バックアップ データが Cloud Storage に到着すると、Cloud Run functions をトリガーし、Dataflow を使用して ETL(抽出、変換、読み込み)のバッチプロセスを開始します。Dataflow ジョブがバックアップ データを Bigtable 互換形式に変換し、Bigtable インスタンスにデータをインポートします。
2 つ目の方法はストリーミング処理によるデータの移行です。この方法では、Aerospike Connect により、Kafka などのメッセージ キューを使用する Aerospike に接続し、 Google Cloud上の Pub/Sub にリアルタイムでメッセージを転送します。Pub/Sub トピックに到着したメッセージは、Dataflow ストリーミング ジョブによってリアルタイムで処理され、データの変換と Bigtable インスタンスへのインポートが行われます。
バッチ処理では、大量のデータを効率的に移行できます。ただし、多くの場合、新しいデータベースへのサービスの移行と更新を行うときに、カットオーバーによるダウンタイムを十分に確保しなければなりません。カットオーバーによるダウンタイムを最小限に抑えるために、最初のバッチ処理の後にストリーミング処理でデータを徐々に移行し、カットオーバーが正常に終了するまでバックアップ データの整合性を維持することも可能です。このドキュメントでは、カットオーバー プロセスを含め、サンプル アプリケーションをバッチ処理で Aerospike から移行します。
Aerospike と Bigtable の比較
データの移行を始める前に、Aerospike と Bigtable のデータモデルの違いを理解しておきましょう。
Bigtable データモデルは、行と列ファミリーによって並べ替えられた多次元の分散型 Key-Value マップです。これに対し、Aerospike データモデルは、すべてのレコードがキーによって一意に識別される行指向データベースです。モデルの違いは、エンティティの属性をグループ化する方法にあります。Bigtable は関連付けられた属性を列ファミリーにグループ化しますが、Aerospike はセット内の属性をグループ化します。Aerospike は、Bigtable よりも多くのデータ型をサポートしています。たとえば、Aerospike では整数、文字列、リスト、マップがサポートされています。Bigtable では、ほとんどの場合、すべてのデータを RAW バイト文字列として扱います。
Aerospike のスキーマは柔軟性に優れており、同じビンの動的な値は異なる型を持つことができます。Aerospike または Bigtable を使用するアプリは、同様の柔軟性を備え、データの管理を行います。アプリはデータベース エンジンに依存せず、データ型と整合性の制約を処理します。
Bookshelf の移行
Bookshelf アプリは、書籍に関する情報を保存し、現在データベースに保存されているすべての書籍の一覧を表示するウェブアプリです。このアプリは書籍識別子(ID)で書籍情報を検索します。この ID はアプリまたはデータベースによって自動的に生成されます。ユーザーが書籍の画像を選択すると、アプリのバックエンドで書籍の詳細情報がデータベースから読み込まれます。
このチュートリアルでは、Aerospike を使用している Bookshelf アプリのデータを Bigtable にデータを移行します。移行後は、Bigtable から書籍にアクセスします。
次の図は、Aerospike から Bigtable へのデータ移行の方法を示しています。
上の図では、次の方法でデータを移行しています。
- 現在の Aerospike データベースから書籍に関するデータをバックアップし、そのデータを Cloud Storage バケットに転送します。
- バックアップ データをバケットにアップロードすると、Cloud Run function の関数からの Cloud Storage の更新通知により、
as2bt
Dataflow ジョブが自動的にトリガーされます。 as2bt
Dataflow ジョブでデータの移行が完了したら、Bookshelf アプリが Bigtable クラスタから書籍データを読み込むように、データベースのバックエンドを Aerospike から Bigtable に変更します。
環境の準備
Aerospike から Bigtable への移行環境を準備するには、Cloud Shell から直接次のツールを実行します。
- Google Cloud CLI
- Bigtable コマンドライン ツール、
cbt
- Terraform
- Apache Maven
これらのツールは Cloud Shell ですでに利用できる状態になっています。再度インストールする必要はありません。
プロジェクトを構成する
Cloud Shell で、Cloud Shell が自動的に構成するプロジェクト ID を調べます。現在アクティブなプロジェクトを反映するようにコマンド プロンプトが更新されます。プロジェクトは
USERNAME@cloudshell:~ (PROJECT_ID)$
の形式で表示されます。プロジェクト ID が正しく構成されていない場合は、手動で構成できます。
gcloud config set project <var>PROJECT_ID</var>
PROJECT_ID
は、実際の Google Cloud プロジェクト ID に置き換えます。us-east1
をリージョンとして、us-east1-b
をゾーンとして構成します。gcloud config set compute/region us-east1 gcloud config set compute/zone us-east1-b
リージョンとゾーンの詳細については、地域とリージョンをご覧ください。
チュートリアル環境をデプロイする
Cloud Shell で、コード リポジトリのクローンを作成します。
git clone https://github.com/fakeskimo/as2bt.git/
Cloud Shell で、Terraform の作業ディレクトリを初期化します。
cd "$HOME"/as2bt/bookshelf/terraform terraform init
デプロイに使用する Terraform 環境変数を構成します。
export TF_VAR_gce_vm_zone="$(gcloud config get-value compute/zone)" export TF_VAR_gcs_bucket_location="$(gcloud config get-value compute/region)"
Terraform の実行プランを確認します。
terraform plan
出力は次のようになります。
Terraform will perform the following actions: # google_bigtable_instance.bookshelf_bigtable will be created + resource "google_bigtable_instance" "bookshelf_bigtable" { + display_name = (known after apply) + id = (known after apply) + instance_type = "DEVELOPMENT" + name = "bookshelf-bigtable" + project = (known after apply) + cluster { + cluster_id = "bookshelf-bigtable-cluster" + storage_type = "SSD" + zone = "us-east1-b" } }
(省略可)Terraform によってデプロイされる依存関係のあるリソースを可視化するには、グラフを表示します。
terraform graph | dot -Tsvg > graph.svg
チュートリアル環境をプロビジョニングします。
terraform apply
チュートリアル環境と Bookshelf アプリの確認
環境をプロビジョニングした後、データ移行ジョブを開始する前に、すべてのリソースがデプロイされて構成されていることを確認する必要があります。このセクションでは、プロビジョニング プロセスの検証方法を説明し、環境内で構成されているコンポーネントを確認します。
チュートリアル環境を確認する
Cloud Shell で、
bookshelf-aerospike
Compute Engine インスタンスを確認します。gcloud compute instances list
出力に、インスタンスが
us-east1-b
ゾーンにデプロイされていることが示されます。NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS bookshelf-aerospike us-east1-b n1-standard-2 10.142.0.4 34.74.72.3 RUNNING
bookshelf-bigtable
Bigtable インスタンスを検証します。gcloud bigtable instances list
出力は次のようになります。
NAME DISPLAY_NAME STATE bookshelf-bigtable bookshelf-bigtable READY
この Bigtable インスタンスは、後のステップで移行のターゲットとして使用します。
bookshelf
Cloud Storage バケットが Dataflow パイプライン ジョブにあることを確認します。gcloud storage ls gs://bookshelf-* --buckets
Cloud Storage バケット名は、グローバルに一意であることが必要なため、バケット名はランダムな接尾辞を使用して作成されます。出力は次のようになります。
gs://bookshelf-616f60d65a3abe62/
Bookshelf アプリに書籍を追加する
Cloud Shell で、
bookshelf-aerospike
インスタンスの外部 IP アドレスを取得します。gcloud compute instances list --filter="name:bookshelf-aerospike" \ --format="value(networkInterfaces[0].accessConfigs.natIP)"
次のステップで必要になるため、IP アドレスをメモしておきます。
Bookshelf アプリを開くには、ウェブブラウザで
http://IP_ADDRESS:8080
に移動します。IP_ADDRESS
は、前の手順でコピーした外部 IP アドレスに置き換えます。新しい書籍を作成するには、
[Add book] をクリックします。[Add boo] ウィンドウで、次のフィールドに入力して [Save] をクリックします。
- [Title] フィールドに「
Aerospike-example
」と入力します。 - [Author] フィールドに「
Aerospike-example
」と入力します。 - [Date Published] フィールドに今日の日付を入力します。
- [Description] フィールドに「
Aerospike-example
」と入力します。
この書籍は、Bookshelf アプリが書籍のストレージとして Aerospike を使用していることを確認するために使用します。
- [Title] フィールドに「
Bookshelf アプリの URL で書籍 ID をメモします。たとえば、URL が
34.74.80.160:8080/books/10000
の場合、書籍 ID は10000
です。Cloud Shell で、SSH を使用して
bookshelf-aerospike
インスタンスに接続します。gcloud compute ssh bookshelf-aerospike
bookshelf-aerospike
インスタンス セッションで、先ほどメモした書籍 ID を使用して新しい書籍が作成されたことを確認します。aql -c 'select * from bookshelf.books where id = "BOOK_ID"'
出力は次のようになります。
+----------------------+----------------------+---------------+----------------------+----------+---------+ | title | author | publishedDate | description | imageUrl | id | +----------------------+----------------------+---------------+----------------------+----------+---------+ | " Aerospike-example" | " Aerospike-example" | "2000-01-01" | " Aerospike-example" | "" | "10000" | +----------------------+----------------------+---------------+----------------------+----------+---------+ 1 row in set (0.001 secs)
書籍 ID がリストにない場合は、新しい書籍を追加する手順を繰り返してください。
Aerospike から Cloud Storage へのバックアップ データの転送
Cloud Shell で、
bookshelf-aerospike
インスタンス セッションから Aerospike バックアップ ファイルを作成します。aql -c "select * from bookshelf.books" --timeout=-1 --outputmode=json \` | tail -n +2 | jq -c '.[0] | .[]' \ | gcloud storage cp - $(gcloud storage ls gs://bookshelf-* --buckets)bookshelf-backup.json
このコマンドはデータを処理し、次のプロセスでバックアップ ファイルを作成します。
Aerospike バックアップ ファイルがアップロードされ、Cloud Storage バケットに存在することを確認します。
gcloud storage ls gs://bookshelf-*/bookshelf-*\ gs://bookshelf-616f60d65a3abe62/bookshelf-backup.json
(省略可)Cloud Storage バケットでバックアップ ファイルの内容を確認します。
gcloud storage cat -r 0-1024 gs://bookshelf-*/bookshelf-backup.json | head -n 2
出力は次のようになります。
{"title":"book_2507","author":"write_2507","publishedDate":"1970-01-01","imageUrl":"https://storage.googleapis.com/aerospike2bt-bookshelf/The_Home_Edit-2019-06-24-044906.jpg","description":"test_2507","createdBy":"write_2507","createdById":"2507_anonymous","id":"2507"} {"title":"book_3867","author":"write_3867","publishedDate":"1970-01-01","imageUrl":"https://storage.googleapis.com/aerospike2bt-bookshelf/The_Home_Edit-2019-06-24-044906.jpg","description":"test_3867","createdBy":"write_3867","createdById":"3867_anonymous","id":"3867"}
SSH セッションを終了して、Cloud Shell に戻ります。
exit
Dataflow を使用して Bigtable にバックアップ データを移行する
これで、Cloud Storage から Bigtable インスタンスにバックアップ データを移行できるようになりました。このセクションでは、Bigtable スキーマと互換性のあるデータを、Dataflow パイプラインを使用して移行する方法について説明します。
Dataflow 移行ジョブを構成する
Cloud Shell で、コードサンプル リポジトリの
dataflow
ディレクトリに移動します。cd "$HOME"/as2bt/dataflow/
Dataflow ジョブの環境変数を構成します。
export BOOKSHELF_BACKUP_FILE="$(gcloud storage ls gs://bookshelf*/bookshelf-backup.json)" export BOOKSHELF_DATAFLOW_ZONE="$(gcloud config get-value compute/zone)"
環境変数が正しく構成されていることを確認します。
env | grep BOOKSHELF
環境変数が正しく構成されている場合、出力は次のようになります。
BOOKSHELF_BACKUP_FILE=gs://bookshelf-616f60d65a3abe62/bookshelf-backup.json BOOKSHELF_DATAFLOW_ZONE=us-east1-b
Dataflow ジョブを実行する
Cloud Shell で、Cloud Storage から Bigtable インスタンスにデータを移行します。
./run_oncloud_json.sh
バックアップ データの移行ジョブをモニタリングするには、Google Cloud コンソールで [ジョブ] ページに移動します。
ジョブが正常に完了するまで待ちます。ジョブが正常に完了すると、Cloud Shell の出力は次のようになります。
Dataflow SDK version: 2.13.0 Submitted job: 2019-12-16_23_24_06-2124083021829446026 [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 08:20 min [INFO] Finished at: 2019-12-17T16:28:08+09:00 [INFO] ------------------------------------------------------------------------
移行ジョブの結果を確認する
Cloud Shell で、バックアップ データが Bigtable に正しく転送されていることを確認します。
cbt -instance bookshelf-bigtable lookup books 00001
出力は次のようになります。
---------------------------------------- 00001 info:author @ 2019/12/17-16:26:04.434000 "Aerospike-example" info:description @ 2019/12/17-16:26:04.434000 "Aerospike-example" info:id @ 2019/12/17-16:26:04.434000 "00001" info:imageUrl @ 2019/12/17-16:26:04.434000 "" info:publishedDate @ 2019/12/17-16:26:04.434000 "2019-10-01" info:title @ 2019/12/17-16:26:04.434000 "Aerospike-example"
Bookshelf データベースを Aerospike から Bigtable に変更する
Aerospike から Bigtable にデータを移行したら、Bigtable を使用するように Bookshelf アプリの構成を変更します。この構成を行うと、新しい書籍は Bigtable インスタンスに保存されます。
Bookshelf アプリの構成を変更する
Cloud Shell で、SSH を使用して
bookshelf-aerospike
アプリに接続します。gcloud compute ssh bookshelf-aerospike
現在の
DATA_BACKEND
の構成がaerospike
であることを確認します。grep DATA_BACKEND /opt/app/bookshelf/config.py
次のような出力が表示されます。
DATA_BACKEND = 'aerospike'
DATA_BACKEND
の構成をaerospike
からbigtable
に変更します。sudo sed -i "s/DATA_BACKEND =.*/DATA_BACKEND = 'bigtable'/g" /opt/app/bookshelf/config.py
DATA_BACKEND
の構成がbigtable
に変更されたことを確認します。grep DATA_BACKEND /opt/app/bookshelf/config.py
次のような出力が表示されます。
DATA_BACKEND = 'bigtable'
新しい
bigtable
のバックエンド構成を使用する Bookshelf アプリを再起動します。sudo supervisorctl restart bookshelf
Bookshelf アプリが再起動され、正常に実行されていることを確認します。
sudo supervisorctl status bookshelf
出力は次のようになります。
bookshelf RUNNING pid 18318, uptime 0:01:00
Bookshelf アプリが Bigtable バックエンドを使用していることを確認する
- ブラウザで、
http://IP_ADDRESS:8080
にアクセスします。 Bigtable-example
という名前で新しい書籍を追加します。Bookshelf アプリから Bigtable インスタンスに
Bigtable-example
書籍が作成されたことを確認するには、ブラウザのアドレスバーから書籍 ID をコピーします。Cloud Shell で、Bigtable インスタンスから
Bigtable-example
書籍データを検索します。cbt -instance bookshelf-bigtable lookup books 7406950188
出力は次のようになります。
---------------------------------------- 7406950188 info:author @ 2019/12/17-17:28:25.592000 "Bigtable-example" info:description @ 2019/12/17-17:28:25.592000 "Bigtable-example" info:id @ 2019/12/17-17:28:25.592000 "7406950188" info:image_url @ 2019/12/17-17:28:25.592000 "" info:published_date @ 2019/12/17-17:28:25.592000 "2019-10-01" info:title @ 2019/12/17-17:28:25.592000 "Bigtable-example"
Aerospike から Bigtable へのデータ移行が正常に完了し、Bigtable バックエンドに接続するように本棚の構成を変更しました。