プログラムによる Cloud Bigtable のスケーリング

クラスタの CPU 使用率などの指標に基づいて、Cloud Bigtable クラスタをプログラムによってスケールすると便利な場合があります。たとえば、クラスタの負荷が大きく CPU 使用率が極めて高い場合に、CPU 使用率が下がるまでクラスタにノードを追加できます。また、クラスタの使用率が高くないときにノードを削除すれば、コストを節約できます。

このページでは、プログラムによって Cloud Bigtable クラスタをスケールする方法について説明し、開始点として使用できるコードサンプルを示します。また、プログラムによるスケーリングを設定する前に認識しておく必要がある制限事項についても説明します。

プログラムによって Cloud Bigtable をスケールする方法

Cloud Bigtable では、Stackdriver Monitoring API を使用してさまざまな指標が公開されています。クラスタに関するこれらの指標をプログラムによってモニタリングし、いずれかの Cloud Bigtable クライアント ライブラリまたは gcloud コマンドライン ツールを使用して、現在の指標に基づいてノードを追加または削除できます。クラスタのサイズを変更した後は、GCP Console、Stackdriver Monitoring カスタム ダッシュボード、またはプログラムによってパフォーマンスをモニタリングできます。

Monitoring API の指標

Monitoring API には、クラスタの現在の状態をモニタリングするために使用できるさまざまな指標が用意されています。プログラムによるスケーリングに最も役立つ指標には、次のようなものがあります。

  • bigtable.googleapis.com/cluster/cpu_load: クラスタの CPU 負荷。
  • bigtable.googleapis.com/cluster/node_count: クラスタのノード数。
  • bigtable.googleapis.com/cluster/storage_utilization: 合計ストレージ容量のうち使用されている量。
  • bigtable.googleapis.com/server/latencies: サーバーのテーブル リクエストのレイテンシ分布。

サンプルコード

プログラムによる独自のスケーリング ツールの開始点として、以下のいずれかのサンプルツールを使用できます。

これらのサンプルツールは、Cloud Bigtable クラスタの CPU 負荷が指定した値を超えたときに、クラスタにノードを追加します。同様に、Cloud Bigtable クラスタの CPU 負荷が指定した値を下回ったときは、クラスタからノードを削除します。サンプルツールを実行するには、GitHub にある各サンプルを手順に沿って操作してください。

これらのサンプルツールは、以下のコードを使用してクラスタの CPU 負荷に関する情報を収集します。

Java

Timestamp now = timeXMinutesAgo(0);
Timestamp fiveMinutesAgo = timeXMinutesAgo(5);
TimeInterval interval =
    TimeInterval.newBuilder().setStartTime(fiveMinutesAgo).setEndTime(now).build();
String filter = "metric.type=\"" + CPU_METRIC + "\"";
ListTimeSeriesPagedResponse response =
    metricServiceClient.listTimeSeries(projectName, filter, interval, TimeSeriesView.FULL);
return response.getPage().getValues().iterator().next().getPointsList().get(0);

Python

client = monitoring_v3.MetricServiceClient()
cpu_query = query.Query(client,
                        project=PROJECT,
                        metric_type='bigtable.googleapis.com/'
                                    'cluster/cpu_load',
                        minutes=5)
time_series = list(cpu_query)
recent_time_series = time_series[0]
return recent_time_series.points[0].value.double_value

CPU 負荷に応じて、サンプルツールは Cloud Bigtable クライアント ライブラリを使用してクラスタサイズを変更します。

Java

double latestValue = getLatestValue().getValue().getDoubleValue();
if (latestValue < CPU_PERCENT_TO_DOWNSCALE) {
  int clusterSize = clusterUtility.getClusterNodeCount(clusterId, zoneId);
  if (clusterSize > MIN_NODE_COUNT) {
    clusterUtility.setClusterSize(clusterId, zoneId,
      Math.max(clusterSize - SIZE_CHANGE_STEP, MIN_NODE_COUNT));
  }
} else if (latestValue > CPU_PERCENT_TO_UPSCALE) {
  int clusterSize = clusterUtility.getClusterNodeCount(clusterId, zoneId);
  if (clusterSize <= MAX_NODE_COUNT) {
    clusterUtility.setClusterSize(clusterId, zoneId,
      Math.min(clusterSize + SIZE_CHANGE_STEP, MAX_NODE_COUNT));
  }
}

Python

bigtable_client = bigtable.Client(admin=True)
instance = bigtable_client.instance(bigtable_instance)
instance.reload()

cluster = instance.cluster(bigtable_cluster)
cluster.reload()

current_node_count = cluster.serve_nodes

if scale_up:
    if current_node_count < max_node_count:
        new_node_count = min(
            current_node_count + size_change_step, max_node_count)
        cluster.serve_nodes = new_node_count
        cluster.update()
        print('Scaled up from {} to {} nodes.'.format(
            current_node_count, new_node_count))
else:
    if current_node_count > min_node_count:
        new_node_count = max(
            current_node_count - size_change_step, min_node_count)
        cluster.serve_nodes = new_node_count
        cluster.update()
        print('Scaled down from {} to {} nodes.'.format(
            current_node_count, new_node_count))

クラスタのサイズを変更した後は、GCP Console または Stackdriver Monitoring カスタム ダッシュボードを使用して、パフォーマンスの時系列的な変化をモニタリングできます。

制限事項

Cloud Bigtable クラスタのプログラムによるスケーリングを設定する前に、必ず以下の制限事項を考慮してください。

パフォーマンス改善の遅延

クラスタにノードを追加した後、クラスタのパフォーマンスが大幅に向上するまでに、負荷のかかった状態が最大 20 分間続く可能性があります。そのため、短期的にアクティビティが増大するワークロードでは、CPU 負荷が上昇した後でクラスタにノードを追加しても、Cloud Bigtable がデータをリバランスし終わるまでにアクティビティの急増が終了してしまうので、パフォーマンスは向上しません。

この問題を解決するため、クラスタへの負荷が増加する前に、プログラムまたは Google Cloud Platform Console を使用してクラスタにノードを追加できます。この方法により、Cloud Bigtable が追加のノード間でデータをリバランスするための時間が得られます。

スキーマ設計に関する問題

テーブルのスキーマ設計に問題がある場合は、Cloud Bigtable クラスタにノードを追加してもパフォーマンスが向上しないことがあります。たとえば、テーブル内の 1 つの行に対して多数の読み取りまたは書き込みを行うと、すべての読み取りまたは書き込みがクラスタの同じノードで行われるため、ノードを追加してもパフォーマンスは向上しません。一方、読み取りや書き込みがテーブル内の複数の行に均等に分散している場合は、ノードの追加によって一般にパフォーマンスが向上します。

Cloud Bigtable の効果的なスケーリングが可能なスキーマを設計する方法について詳しくは、スキーマの設計をご覧ください。

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Cloud Bigtable ドキュメント