Aerospike から Bigtable への移行


このチュートリアルでは、Aerospike から Bigtable にデータを移行する方法について説明します。このチュートリアルでは、Aerospike と Bigtable の違いと、Bigtable で実行するためにワークロードを変換する方法について説明します。このチュートリアルは、Google Cloud で Aerospike に似たデータベース サービスを探している方を対象としています。また、データベース スキーマ、データ型、NoSQL の基本、リレーショナル データベース システムについての知識があることを前提としています。ここでは主に定義済みのタスクを使用して移行を行います。このチュートリアルを完了すると、実際の環境に合わせてコードと手順を変更できるようになります。

Bigtable は、ペタバイト規模のフルマネージド NoSQL データベース サービスで、大規模な分析ワークロードや運用ワークロードに使用できます。低レイテンシで、可用性と耐久性に優れたペタバイト規模のサービスのストレージ エンジンとして利用できます。Bigtable では、DataprocBigQuery などの Google Cloud データ分析サービスを使用してデータを分析できます。

Bigtable は、AeroSpike や Cassandra などの NoSQL データベースで実装されている広告テクノロジー(アドテック)、金融技術(フィンテック)、モノのインターネット(IoT)サービスに最適です。NoSQL マネージド サービスをお探しの場合は、Bigtable をご利用ください。

アーキテクチャ

次のリファレンス アーキテクチャの図は、Aerospike から Bigtable へのデータの移行に使用できる一般的なコンポーネントを示しています。

Aerospike から Bigtable へのデータ転送プロセスのコンポーネント。

上の図では、次の 2 つの方法で Aerospike を使用するオンプレミス環境から Google Cloud の Bigtable にデータを移行しています。最初の方法はバッチ処理によるデータの移行です。まず、Aerospike のバックアップ データを Cloud Storage バケットに移動します。バックアップ データが Cloud Storage に到着すると、Cloud Functions をトリガーし、Dataflow を使用して ETL(抽出、変換、読み込み)のバッチプロセスを開始します。Dataflow ジョブがバックアップ データを Bigtable 互換形式に変換し、Bigtable インスタンスにデータをインポートします。

2 つ目の方法はストリーミング処理によるデータの移行です。この方法では、Aerospike Connect により、Kafaka などのメッセージ キューを使用する 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 へのデータ移行の方法を示しています。

データの移行手順。

上の図では、次の方法でデータを移行しています。

  1. 現在の Aerospike データベースから書籍に関するデータをバックアップし、そのデータを Cloud Storage バケットに転送します。
  2. バックアップ データをバケットにアップロードすると、Cloud Functions の関数からの Cloud Storage の更新通知により、as2bt Dataflow ジョブが自動的にトリガーされます。
  3. as2bt Dataflow ジョブでデータの移行が完了したら、Bookshelf アプリが Bigtable クラスタから書籍データを読み込むように、データベースのバックエンドを Aerospike から Bigtable に変更します。

目標

  • Aerospike から Bigtable に移行するチュートリアル環境をデプロイする。
  • Aerospike を使用するサンプルアプリのバックアップ データセットを Cloud Storage に作成する。
  • Dataflow を使用してデータスキーマを転送し、Bigtable に移行する。
  • Bigtable をバックエンドとして使用するように、サンプルアプリの構成を変更する。
  • Bigtable を使用して Bookshelf アプリが正しく実行されていることを確認する。

料金

このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

Bigtable の料金は、ノード時間数、保存されているデータ量、ネットワーク帯域幅の使用量に基づいて計算されます。Bigtable クラスタと他のリソースの費用を見積もるには、料金計算ツールを使用します。料金計算ツールの設定例では、単一ノードではなく、3 つの Bigtable ノードを使用しています。前の例の見積もり費用の合計は、このチュートリアルの実際の合計費用を超えています。

このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。

始める前に

  1. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  2. Google Cloud プロジェクトで課金が有効になっていることを確認します

  3. Cloud Resource Manager API を有効にします。

    API を有効にする

    Terraform は、Cloud Resource Manager API を使用して、このチュートリアルで必要な API を有効にします。

  4. Google Cloud コンソールで、「Cloud Shell をアクティブにする」をクリックします。

    Cloud Shell をアクティブにする

環境の準備

Aerospike から Bigtable への移行環境を準備するには、Cloud Shell から直接次のツールを実行します。

  • Google Cloud CLI
  • gsutil コマンドライン ツール
  • Bigtable コマンドライン ツール、cbt
  • Terraform
  • Apache Maven

これらのツールは Cloud Shell ですでに利用できる状態になっています。再度インストールする必要はありません。

プロジェクトを構成する

  1. Cloud Shell で、Cloud Shell が自動的に構成するプロジェクト ID を調べます。現在アクティブなプロジェクトを反映するようにコマンド プロンプトが更新されます。プロジェクトは USERNAME@cloudshell:~ (PROJECT_ID)$ の形式で表示されます。

    プロジェクト ID が正しく構成されていない場合は、手動で構成できます。

    gcloud config set project <var>PROJECT_ID</var>
    

    PROJECT_ID は、実際の Google Cloud プロジェクト ID に置き換えます。

  2. us-east1 をリージョンとして、us-east1-b をゾーンとして構成します。

    gcloud config set compute/region us-east1
    gcloud config set compute/zone us-east1-b
    

    リージョンとゾーンの詳細については、地域とリージョンをご覧ください。

チュートリアル環境をデプロイする

  1. Cloud Shell で、コード リポジトリのクローンを作成します。

     git clone https://github.com/fakeskimo/as2bt.git/
    
  2. Cloud Shell で、Terraform の作業ディレクトリを初期化します。

    cd "$HOME"/as2bt/bookshelf/terraform
    terraform init
    
  3. デプロイに使用する 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)"
    
  4. 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"
        }
    }
    
  5. (省略可)Terraform によってデプロイされる依存関係のあるリソースを可視化するには、グラフを表示します。

    terraform graph | dot -Tsvg > graph.svg
    
  6. チュートリアル環境をプロビジョニングします。

    terraform apply
    

チュートリアル環境と Bookshelf アプリの確認

環境をプロビジョニングした後、データ移行ジョブを開始する前に、すべてのリソースがデプロイされて構成されていることを確認する必要があります。このセクションでは、プロビジョニング プロセスの検証方法を説明し、環境内で構成されているコンポーネントを確認します。

チュートリアル環境を確認する

  1. 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
    
  2. bookshelf-bigtable Bigtable インスタンスを検証します。

    gcloud bigtable instances list
    

    出力は次のようになります。

    NAME                DISPLAY_NAME        STATE
    bookshelf-bigtable  bookshelf-bigtable  READY
    

    この Bigtable インスタンスは、後のステップで移行のターゲットとして使用します。

  3. bookshelf Cloud Storage バケットが Dataflow パイプライン ジョブにあることを確認します。

    gsutil ls -b gs://bookshelf-*
    

    Cloud Storage バケット名は、グローバルに一意であることが必要なため、バケット名はランダムな接尾辞を使用して作成されます。出力は次のようになります。

    gs://bookshelf-616f60d65a3abe62/
    

Bookshelf アプリに書籍を追加する

  1. Cloud Shell で、bookshelf-aerospike インスタンスの外部 IP アドレスを取得します。

    gcloud compute instances list --filter="name:bookshelf-aerospike" \
        --format="value(networkInterfaces[0].accessConfigs.natIP)"
    

    次のステップで必要になるため、IP アドレスをメモしておきます。

  2. Bookshelf アプリを開くには、ウェブブラウザで http://IP_ADDRESS:8080 に移動します。

    IP_ADDRESS は、前の手順でコピーした外部 IP アドレスに置き換えます。

  3. 新しい書籍を作成するには、 [Add book] をクリックします。

  4. [Add boo] ウィンドウで、次のフィールドに入力して [Save] をクリックします。

    • [Title] フィールドに「Aerospike-example」と入力します。
    • [Author] フィールドに「Aerospike-example」と入力します。
    • [Date Published] フィールドに今日の日付を入力します。
    • [Description] フィールドに「Aerospike-example」と入力します。

    この書籍は、Bookshelf アプリが書籍のストレージとして Aerospike を使用していることを確認するために使用します。

  5. Bookshelf アプリの URL で書籍 ID をメモします。たとえば、URL が 34.74.80.160:8080/books/10000 の場合、書籍 ID は 10000 です。

    URL 内の書籍 ID。

  6. Cloud Shell で、SSH を使用して bookshelf-aerospike インスタンスに接続します。

    gcloud compute ssh bookshelf-aerospike
    
  7. 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 へのバックアップ データの転送

  1. Cloud Shell で、bookshelf-aerospike インスタンス セッションから Aerospike バックアップ ファイルを作成します。

    aql -c "select * from bookshelf.books" --timeout=-1 --outputmode=json \`
        | tail -n +2 | jq -c '.[0] | .[]' \
        | gsutil cp - $(gsutil ls -b gs://bookshelf-*)bookshelf-backup.json
    

    このコマンドはデータを処理し、次のプロセスでバックアップ ファイルを作成します。

    • Aerospike から書籍情報を選択し、JSON prettyprint 形式で出力します。
    • 出力から最初の 2 つの見出しを削除し、jq コマンドラインの JSON プロセッサを使用して、データを改行区切りの JSON(ndjson)形式に変換します。
    • gsutil コマンドライン ツールを使用して、Cloud Storage バケットにデータをアップロードします。
  2. Aerospike バックアップ ファイルがアップロードされ、Cloud Storage バケットに存在することを確認します。

    gsutil ls gs://bookshelf-*/bookshelf-*\
        gs://bookshelf-616f60d65a3abe62/bookshelf-backup.json
    
  3. (省略可)Cloud Storage バケットでバックアップ ファイルの内容を確認します。

    gsutil 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"}
    
  4. SSH セッションを終了して、Cloud Shell に戻ります。

    exit
    

Dataflow を使用して Bigtable にバックアップ データを移行する

これで、Cloud Storage から Bigtable インスタンスにバックアップ データを移行できるようになりました。このセクションでは、Bigtable スキーマと互換性のあるデータを、Dataflow パイプラインを使用して移行する方法について説明します。

Dataflow 移行ジョブを構成する

  1. Cloud Shell で、コードサンプル リポジトリの dataflow ディレクトリに移動します。

    cd "$HOME"/as2bt/dataflow/
    
  2. Dataflow ジョブの環境変数を構成します。

    export BOOKSHELF_BACKUP_FILE="$(gsutil ls
    gs://bookshelf*/bookshelf-backup.json)"
    export BOOKSHELF_DATAFLOW_ZONE="$(gcloud config get-value compute/zone)"
    
  3. 環境変数が正しく構成されていることを確認します。

    env | grep BOOKSHELF
    

    環境変数が正しく構成されている場合、出力は次のようになります。

    BOOKSHELF_BACKUP_FILE=gs://bookshelf-616f60d65a3abe62/bookshelf-backup.json
    BOOKSHELF_DATAFLOW_ZONE=us-east1-b
    

Dataflow ジョブを実行する

  1. Cloud Shell で、Cloud Storage から Bigtable インスタンスにデータを移行します。

    ./run_oncloud_json.sh
    
  2. バックアップ データの移行ジョブをモニタリングするには、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 アプリの構成を変更する

  1. Cloud Shell で、SSH を使用して bookshelf-aerospike アプリに接続します。

    gcloud compute ssh bookshelf-aerospike
    
  2. 現在の DATA_BACKEND の構成が aerospike であることを確認します。

    grep DATA_BACKEND /opt/app/bookshelf/config.py
    

    次のような出力が表示されます。

    DATA_BACKEND = 'aerospike'
    
  3. DATA_BACKEND の構成を aerospike から bigtable に変更します。

    sudo sed -i "s/DATA_BACKEND =.*/DATA_BACKEND = 'bigtable'/g" /opt/app/bookshelf/config.py
    
  4. DATA_BACKEND の構成が bigtable に変更されたことを確認します。

    grep DATA_BACKEND /opt/app/bookshelf/config.py
    

    次のような出力が表示されます。

    DATA_BACKEND = 'bigtable'
    
  5. 新しい bigtable のバックエンド構成を使用する Bookshelf アプリを再起動します。

    sudo supervisorctl restart bookshelf
    
  6. Bookshelf アプリが再起動され、正常に実行されていることを確認します。

    sudo supervisorctl status bookshelf
    

    出力は次のようになります。

    bookshelf  RUNNING   pid 18318, uptime 0:01:00
    

Bookshelf アプリが Bigtable バックエンドを使用していることを確認する

  1. ブラウザで、http://IP_ADDRESS:8080 にアクセスします。
  2. Bigtable-example という名前で新しい書籍を追加します。

  3. Bookshelf アプリから Bigtable インスタンスに Bigtable-example 書籍が作成されたことを確認するには、ブラウザのアドレスバーから書籍 ID をコピーします。

  4. 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 バックエンドに接続するように本棚の構成を変更しました。

クリーンアップ

課金を停止する最も簡単な方法は、チュートリアル用に作成した Google Cloud プロジェクトを削除することです。また、リソースを個別に削除することもできます。

プロジェクトの削除

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

次のステップ