확장

클러스터 확장은 클러스터 워크로드 또는 데이터 스토리지 요구사항의 변화에 따라 클러스터에 노드를 추가하거나 삭제하는 프로세스입니다. 클러스터의 CPU 사용량 같은 측정항목을 기반으로 Bigtable 클러스터의 크기를 조정하는 것이 유용할 수 있습니다. 예를 들어 클러스터에 과부하가 걸려 있고 해당 CPU 사용률이 높은 경우 CPU 사용량이 떨어질 때까지 클러스터에 노드를 추가할 수 있습니다. 사용량이 많지 않을 때 클러스터에서 노드를 제거함으로써 비용을 절약할 수도 있습니다.

확장 옵션

다음 방법으로 Bigtable 클러스터를 확장할 수 있습니다.

대부분의 경우 자동 확장을 원한다면 Bigtable의 기본 제공 자동 확장 기능을 사용해야 합니다. 이 기능을 사용 설정하면 Bigtable이 클러스터를 지속적으로 모니터링하고 설정에 따라 노드 수를 자동으로 조정합니다.

제한사항

Bigtable 클러스터에 자동 확장을 사용 설정하거나 프로그래매틱 확장을 설정하기 전에 다음 제한사항을 고려하세요.

노드 가용성

노드 할당량은 클러스터에 수동 노드 할당이나 자동 확장이 사용 설정되어 있는지 여부를 적용됩니다. 자세한 내용은 할당량 및 노드 가용성을 참조하세요.

노드가 재조정되는 동안 지연

클러스터에 노드를 추가한 후, 클러스터 성능이 눈에 띄게 향상될 때까지 부하 상태에서 최대 20분 기다려야 할 수 있습니다. 따라서 짧은 순간에 활동이 급상승하는 워크로드의 경우에는 CPU 로드를 기준으로 클러스터에 노드를 추가해도 성능이 향상되지 않습니다. Bigtable이 데이터를 재조정했을 때쯤이면 짧게 급상승했던 활동이 이미 끝난 후일 것이기 때문입니다.

이러한 지연을 계획하려면 클러스터 부하가 증가하기 전에 프로그래매틱 방식으로 또는 Google Cloud 콘솔을 통해 클러스터에 노드를 추가하면 됩니다. 이 접근 방식을 사용하면 Bigtable이 워크로드가 증가하기 전에 추가 노드에서 데이터를 재조정할 수 있습니다. 수동 노드 할당을 사용하는 클러스터에서 노드 수를 변경합니다. 자동 확장을 사용하는 클러스터에서 최소 노드 수를 변경합니다. 트래픽이 정상으로 돌아간 후 노드 설정을 다시 변경합니다.

너무 빠르게 축소하여 지연 시간 증가

축소하기 위해 클러스터의 노드 수를 줄일 때는 10분 동안 클러스터 크기를 10% 넘게 줄이지 마세요. 클러스터의 잔여 노드가 일시적으로 과부화되는 경우 너무 빠르게 축소하면 지연 시간 증가와 같은 성능 문제가 발생할 수 있습니다.

스키마 디자인 문제

테이블의 스키마 디자인에 문제가 있는 경우, Bigtable 클러스터에 노드를 추가해도 성능이 향상되지 않을 수 있습니다. 예를 들어 테이블의 한 행에 여러 개의 읽기 및 쓰기가 있는 경우, 모든 읽기 또는 쓰기는 클러스터에서 동일한 노드로 이동합니다. 따라서 노드를 추가해도 성능이 향상되지 않습니다. 반면에 읽기와 쓰기가 테이블에 있는 행에 고르게 분산된 경우에는 노드를 추가하면 일반적으로 성능이 향상됩니다.

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: 테이블에 대한 서버 요청 지연 시간의 분포입니다.

샘플 코드

프로그래매틱 방식의 확장 도구를 위한 시작점으로 다음 샘플 도구 중 하나를 사용할 수 있습니다.

샘플 도구는 CPU 로드가 지정된 값을 초과할 때 Bigtable 클러스터에 노드를 추가합니다. 마찬가지로 샘플 도구는 CPU 로드가 지정된 값보다 아래일 때 Bigtable 클러스터에서 노드를 제거합니다. 샘플 도구를 실행하려면 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 커스텀 대시 보드를 사용하여 시간 경과에 따른 성능 변화를 모니터링할 수 있습니다.

다음 단계