コンテンツに移動
デベロッパー

Cloud Bigtable + Cloud Memorystore: 組み合わせて高速化

2021年3月28日
https://storage.googleapis.com/gweb-cloudblog-publish/images/bigtable.max-2600x2600.png
Google Cloud Japan Team

※この投稿は米国時間 2021 年 3 月 13 日に、Google Cloud blog に投稿されたものの抄訳です。

要約: 頻繁にクエリされるデータに Memcached を使用して、アプリケーションのパフォーマンスを向上させます。たとえば次のように使用します。

読み込んでいます...

データベースは特定のスキーマ、クエリ、スループットを想定して設計されますが、一定期間にクエリの頻度が高まるデータがある場合は、キャッシュ レイヤを導入してデータベースの負荷を軽減することをおすすめします。

この投稿では、水平スケーリングが可能で高スループットの読み取りと書き込みに最適な Google Cloud Bigtable について説明します。パフォーマンスは、データベース全体である程度均一に行がクエリされるようにすることで最適化できます。クエリされる頻度が高い行にキャッシュを導入する場合、2 つの方法でアプリケーションを高速化します。ひとつは、ホットスポット化した行への負荷を軽減する方法、そしてもうひとつは、キャッシュとコンピューティングをリージョンごとにコロケーションすることでレスポンス時間を短縮する方法です。

Memcached は、任意のデータの小さなかたまりのための、インメモリ Key-Value ストアです。ここでは、Google Cloud エコシステムと緊密に統合されている、スケーラブルかつフルマネージド型の Memorystore for Memcached を使用します。

セットアップ

  1. 新規作成した、または既存の Google Cloud プロジェクトと、任意のデータベースを使用します。ここでは、Cloud Bigtable を使った例を示しますが、Spanner や Firestore を使用するのもよいでしょう。

  2. ほとんどの手順で gcloud コマンドを使用しますが、その大部分は Google Cloud Console でも実行できます。

  3. 次のコマンドを使って、Cloud Bigtable インスタンスと、1 行のテーブルを作成します。

cbt createinstance bt-cache "Bigtable with cache" bt-cache-c1 us-central1-b 1 SSD && \ 

cbt -instance=bt-cache createtable mobile-time-series "families=stats_summary" && \ 

cbt -instance=bt-cache set mobile-time-series phone#4c410523#20190501 stats_summary:os_build=PQ2A.190405.003 stats_summary:os_name=android && \ 

cbt -instance=bt-cache read mobile-time-series

コード

キャッシュの一般的なロジックは、次の手順で定義できます。

  1. クエリする行キーを選択します。

  2. 行キーがキャッシュ内にある場合 -->その値を返します。

  3. 行キーがキャッシュ内にない場合

    • Cloud Bigtable で行を検索します。

    • 有効期限を設定してキャッシュに値を追加します。

    • その値を返します。

Cloud Bigtable の場合、コードは次のようになります(完全なコードは GitHub にあります)。

読み込んでいます...

列の値に簡単にアクセスできるように、キャッシュキーを row_key:column_family:column_qualifier にしました。以下に使用可能なキャッシュの Key-Value ペアをいくつか紹介します。

  • 行キー: エンコードされた行

  • start_row_key-end_row_key: エンコードされた行の配列

  • SQL クエリ: 結果

  • 行プレフィックス: エンコードされた行の配列 

キャッシュを作成するときは、ユースケースに基づいて設定を決定してください。Bigtable の行キーのサイズ上限は 4 KB ですが、Memcached キーのサイズ上限は 250 バイトであるため、行キーが大きすぎる可能性があることに注意してください。

Memorystore for Memcached インスタンスを作成する

ここでは Memorystore for Memcached インスタンスを作成しますが、ローカルの Memcached インスタンスをインストールして実行し、テストしてみることもできます。この手順は、Memorystore Cloud Console で実行することもできます。

1. Memorystore for Memcached API を有効にします。

読み込んでいます...

2. デフォルトのネットワーク上に最小サイズの Memorystore for Memcached インスタンスを作成します。アプリケーションに適したリージョンを使用します。

読み込んでいます...

3. Memcached インスタンスの詳細を取得し、discoveryEndpoint IP アドレスを取得します(インスタンスの作成が完了するまで数分かかる場合があります)。

読み込んでいます...

ネットワーク内にマシンを設定する

作成した Memcached インスタンスと同じネットワーク上でコードを実行するための場所を作成する必要があります。Cloud Functions などのサーバーレス オプションを選択することもできますが、Compute VM のほうが構成の手間を軽減できます。

  1. Cloud Bigtable データの API スコープを有効にして、デフォルトのネットワーク上にコンピューティング インスタンスを作成します。Memcached インスタンスと同じリージョンにあるゾーンを指定する必要があることに注意してください。

読み込んでいます...

2. 新しい VM に SSH で接続します。

必要に応じて Telnet 経由で Memcached に接続する

このプロセスについては Memorystore for Memcached のドキュメントに詳細が記載されていますが、次のコマンドを実行するだけでキャッシュ内の値を設定 / 取得することができます。

読み込んでいます...

読み込んでいます...

コードを実行する

これで、マシン上でコードを実行する準備が整いました。

  1. リポジトリのクローンを直接 VM 上に作成して、そこから実行できます。コードをカスタマイズする場合は、以前投稿したCompute Engine へのコードの rsync に関するこちらの記事をご覧になるか、gcloud scp コマンドを使ってローカルマシンから VM にコードをコピーしてください。

読み込んでいます...

2. Maven をインストールします。

読み込んでいます...

3. 構成の環境変数を設定します。

読み込んでいます...

4. プログラムを 1 回実行してデータベースから値を取得した後、プログラムを再度実行すると、キャッシュから値がフェッチされていることがわかります。

読み込んでいます...

クリーンアップ

このブログ投稿の例に沿って実践した場合は、次のコマンドを使って VM、Cloud Bigtable インスタンス、Memcached インスタンスを削除し、リソースに対する課金が発生しないようにしてください。

読み込んでいます...

次のステップ

ここまでの説明で、データベースの前にキャッシュ レイヤを配置する基本的なコンセプトと、既存のアプリケーションへの統合方法をご理解いただけたでしょうか。ぜひ Cloud BigtableCloud Memorystore を使って今回紹介したプロセスを Google Cloud Console で試してみてください。

-Google Cloud Developer Relations エンジニア Billy Jacobson

投稿先