スケーリング

クラスタのスケーリングとは、クラスタのワークロードまたはデータ ストレージのニーズの変化に応じて、クラスタにノードの追加または削除を行うプロセスです。クラスタの CPU 使用率などの指標に基づいて Bigtable クラスタのスケーリングを行うと便利な場合があります。たとえば、クラスタの負荷が大きく、CPU 使用率が極めて高い場合は、CPU 使用率が下がるまでクラスタにノードを追加できます。また、クラスタの使用率が高くない場合は、ノードを削除してコストを抑えることができます。

スケーリング オプション

Bigtable クラスタは次の方法でスケーリングできます。

自動スケーリングを行う場合は通常、Bigtable の組み込み自動スケーリング機能を使用します。この機能を有効にすると、Bigtable はクラスタを継続的にモニタリングし、設定に基づいてノード数を自動的に調整します。

制限事項

Bigtable クラスタで自動スケーリングを有効にする前、またはプログラムによるスケーリングを設定する前に、次の制限事項を考慮してください。

ノードの可用性

クラスタで手動ノード割り当てが有効か、自動スケーリングが有効かにかかわらず、ノードの割り当てが適用されます。詳細については、割り当てとノードの可用性をご覧ください。

ノードの再調整中に発生する遅延

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

この遅延に対応するには、クラスタの負荷が増加する前に、プログラムまたは Google Cloud Console を使用してクラスタにノードを追加します。これにより、ワークロードが増加する前に、Bigtable が追加ノード間でデータの再調整を完了できるようになります。ノードの手動割り当てを使用しているクラスタでは、ノード数を変更します。自動スケーリングを使用しているクラスタでは、ノードの最小数を変更します。トラフィックが正常な状態に戻ったら、ノードの設定を元に戻します。

スケールダウンが速すぎることによるレイテンシの増加

クラスタ内のノード数を減らしてスケールダウンする場合、10 分間に 10% を超えるクラスタサイズの縮小は行わないようにしてください。スケールダウンが速すぎると、クラスタ内の残りのノードが一時的に過負荷になる場合にレイテンシが増加するなど、パフォーマンス上の問題が発生する可能性があります。

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

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

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

プログラムで Bigtable をスケーリングする方法

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

Bigtable では、Cloud Monitoring API を介してさまざまな指標が公開されています。クラスタに関するこれらの指標をプログラムでモニタリングし、Bigtable クライアント ライブラリか Google Cloud CLI のいずれかを使用して、現在の指標に基づいてノードを追加または削除できます。クラスタのサイズを変更した後は、Google Cloud コンソールからそのパフォーマンスをモニタリングできます。また、Cloud 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: サーバーのテーブル リクエストのレイテンシ分布。

サンプルコード

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

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

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

Java

Bigtable 用のクライアント ライブラリをインストールして使用する方法については、Bigtable クライアント ライブラリをご覧ください。

Bigtable で認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

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

Bigtable 用のクライアント ライブラリをインストールして使用する方法については、Bigtable クライアント ライブラリをご覧ください。

Bigtable で認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

client = monitoring_v3.MetricServiceClient()
cpu_query = query.Query(
    client,
    project=PROJECT,
    metric_type="bigtable.googleapis.com/" "cluster/cpu_load",
    minutes=5,
)
cpu_query = cpu_query.select_resources(
    instance=bigtable_instance, cluster=bigtable_cluster
)
cpu = next(cpu_query.iter())
return cpu.points[0].value.double_value

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

Java

Bigtable 用のクライアント ライブラリをインストールして使用する方法については、Bigtable クライアント ライブラリをご覧ください。

Bigtable で認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

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 用のクライアント ライブラリをインストールして使用する方法については、Bigtable クライアント ライブラリをご覧ください。

Bigtable で認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

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

if instance.type_ == enums.Instance.Type.DEVELOPMENT:
    raise ValueError("Development instances cannot be scaled.")

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
        operation = cluster.update()
        response = operation.result(480)
        logger.info(
            "Scaled up from {} to {} nodes for {}.".format(
                current_node_count, new_node_count, response.name
            )
        )
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
        operation = cluster.update()
        response = operation.result(480)
        logger.info(
            "Scaled down from {} to {} nodes for {}.".format(
                current_node_count, new_node_count, response.name
            )
        )

クラスタのサイズを変更した後は、Google Cloud コンソールまたは Cloud Monitoring カスタム ダッシュボードを使用して、時間の経過でパフォーマンスがどう変化するかをモニタリングできます。

次のステップ