슬롯 자동 스케일링

자동 스케일링 설정

BigQuery의 자동 스케일링, 예약 시스템, 그리고 특정 쿼리별 적용 방법에 대한 종합 가이드입니다.


목차

  1. 자동 스케일링 방법
  2. BigQuery Editions
  3. Reservation 및 Assignment
  4. 특정 쿼리에 Assignment 적용

자동 스케일링 방법

1. Flex Slots 사용

Flex Slots는 가장 유연한 자동 스케일링 옵션입니다:

-- 예약 생성 시 자동 스케일링 설정
CREATE RESERVATION my_reservation
OPTIONS(
  slot_capacity = 100,
  autoscale_max_slots = 500
);

2. Google Cloud Console에서 설정

  1. BigQuery → 용량 관리 → 예약으로 이동
  2. “예약 만들기” 클릭
  3. 자동 스케일링 옵션 활성화:
    • 기준 슬롯: 최소 보장 슬롯 수
    • 최대 슬롯: 자동 스케일링 최대값

3. gcloud CLI로 설정

# 자동 스케일링이 활성화된 예약 생성
gcloud beta bigquery reservations create \
  --location=US \
  --reservation=my-reservation \
  --slots=100 \
  --max-slots=500 \
  --autoscale-max-slots=500

4. Terraform으로 구성

resource "google_bigquery_reservation" "reservation" {
  name     = "my-reservation"
  location = "US"
  
  slot_capacity = 100
  
  autoscale {
    max_slots = 500
  }
}

5. 모니터링 및 최적화

자동 스케일링 효과를 모니터링하려면:

-- 슬롯 사용량 모니터링
SELECT
  project_id,
  job_id,
  total_slot_ms,
  creation_time
FROM
  `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE
  creation_time >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR)
ORDER BY
  total_slot_ms DESC;

주요 고려사항

비용 관리

  • 최대 슬롯 제한 설정으로 비용 통제
  • 사용량 기반 과금 모니터링

성능 최적화

  • 피크 시간대 분석
  • 적절한 기준/최대 슬롯 비율 설정

워크로드 패턴

  • 예측 가능한 패턴: 스케줄 기반 조정
  • 예측 불가능한 패턴: 자동 스케일링 활용

BigQuery Editions

BigQuery Editions는 Google이 2023년에 도입한 새로운 가격 책정 및 기능 모델입니다. 기존의 온디맨드/Flat-rate 모델을 대체하는 더 유연한 옵션을 제공합니다.

1. Edition 종류

Standard Edition

  • 가장 기본적인 에디션
  • 일반적인 분석 워크로드에 적합
  • 자동 스케일링 지원
  • 비용 효율적

Enterprise Edition

  • 고급 기능 포함
  • 더 높은 성능과 보안 기능
  • 멀티 리전 재해 복구
  • 예약된 슬롯 할인 제공

Enterprise Plus Edition

  • 최고 수준의 기능과 성능
  • 미션 크리티컬 워크로드용
  • 최대 가용성 보장
  • CMEK, VPC-SC 등 고급 보안

2. 주요 특징

자동 스케일링 (Autoscaling)

-- 자동 스케일링 예약 생성 예시
CREATE RESERVATION my_autoscale_reservation
OPTIONS(
  edition = 'ENTERPRISE',
  autoscale_max_slots = 1000
);

유연한 슬롯 관리

  • 기본 슬롯과 자동 스케일링 슬롯 분리
  • 워크로드에 따른 동적 조정
  • 비용 예측 가능성 향상

3. Edition별 기능 비교

기능 Standard Enterprise Enterprise Plus
자동 스케일링 ✓ ✓ ✓
압축 슬롯 ✗ ✓ ✓
멀티 리전 재해 복구 ✗ ✓ ✓
3년 약정 할인 ✗ ✓ ✓
CMEK ✗ ✗ ✓
VPC Service Controls ✗ ✗ ✓

4. 가격 책정 방식

용량 기반 가격

# 예약 생성 시 edition 지정
gcloud bigquery reservations create \
  --project=my-project \
  --location=US \
  --reservation=my-reservation \
  --edition=ENTERPRISE \
  --slots=500

약정 할인

  • 1년 약정: ~20% 할인
  • 3년 약정: ~40% 할인 (Enterprise 이상)

5. 마이그레이션 전략

기존 Flat-rate에서 전환:

-- 기존 슬롯 사용량 분석
SELECT
  project_id,
  AVG(total_slot_ms) / 1000 as avg_slot_seconds,
  MAX(total_slot_ms) / 1000 as max_slot_seconds
FROM
  `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE
  creation_time >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  project_id;

6. Edition 선택 기준

Standard Edition

  • 예측 가능한 워크로드
  • 비용 최적화가 주요 목표
  • 기본 보안 요구사항

Enterprise Edition

  • 변동성 있는 워크로드
  • 성능 최적화 필요
  • 재해 복구 요구사항

Enterprise Plus Edition

  • 규제 준수 요구사항
  • 최고 수준 보안 필요
  • 미션 크리티컬 애플리케이션

7. 모니터링 및 최적화

-- Edition별 슬롯 사용량 모니터링
SELECT
  reservation_name,
  project_id,
  job_id,
  total_slot_ms,
  total_bytes_billed
FROM
  `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE
  reservation_name IS NOT NULL
  AND creation_time >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)
ORDER BY
  total_slot_ms DESC;

Reservation 및 Assignment

중요: CREATE RESERVATION만으로는 모든 쿼리가 자동으로 적용받지 않습니다. 예약을 생성한 후 반드시 Assignment(할당)를 해야 합니다.

1. Reservation 생성 → Assignment 필요

-- 1단계: Reservation 생성
CREATE RESERVATION my_reservation
OPTIONS(
  edition = 'ENTERPRISE',
  slot_capacity = 500
);

-- 2단계: Assignment 생성 (이 단계가 필수!)
CREATE ASSIGNMENT my_assignment
OPTIONS(
  reservation_name = 'my_reservation',
  assignee = 'projects/my-project-id'  -- 프로젝트 할당
);

2. Assignment 레벨 옵션

프로젝트 레벨 할당

-- 전체 프로젝트에 예약 할당
CREATE ASSIGNMENT project_assignment
OPTIONS(
  reservation_name = 'my_reservation',
  assignee = 'projects/my-project-id'
);

폴더 레벨 할당

-- 조직 내 폴더 전체에 할당
CREATE ASSIGNMENT folder_assignment
OPTIONS(
  reservation_name = 'my_reservation',
  assignee = 'folders/123456789'
);

조직 레벨 할당

-- 조직 전체에 할당
CREATE ASSIGNMENT org_assignment
OPTIONS(
  reservation_name = 'my_reservation',
  assignee = 'organizations/my-org-id'
);

3. Assignment 우선순위

더 구체적인 할당이 우선순위를 가집니다:

프로젝트 할당 > 폴더 할당 > 조직 할당

4. Assignment 없이 실행되는 쿼리

Assignment가 없으면:

  • On-demand 과금으로 자동 전환
  • Reservation의 슬롯을 사용하지 않음
  • 예약의 이점을 받지 못함

5. Assignment 확인 방법

-- 현재 Assignment 확인
SELECT *
FROM `region-us`.INFORMATION_SCHEMA.ASSIGNMENTS
WHERE reservation_name = 'my_reservation';

6. 실시간 적용 확인

-- 쿼리가 어떤 reservation을 사용했는지 확인
SELECT
  job_id,
  project_id,
  reservation_id,
  total_slot_ms,
  creation_time
FROM
  `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE
  creation_time >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR)
  AND reservation_id IS NOT NULL;

7. gcloud를 사용한 전체 프로세스

# 1. Reservation 생성
gcloud bigquery reservations create \
  --location=US \
  --reservation=prod-reservation \
  --edition=ENTERPRISE \
  --slots=1000

# 2. Assignment 생성 (이 단계를 빼먹으면 안됨!)
gcloud bigquery reservations assignments create \
  --location=US \
  --reservation=prod-reservation \
  --assignee_type=PROJECT \
  --assignee_id=my-project-id

8. 주의사항

Assignment 누락 시

  • Reservation 비용은 발생하지만 사용하지 못함
  • 쿼리는 on-demand로 실행되어 추가 비용 발생

Multiple Assignments

  • 하나의 예약에 여러 프로젝트 할당 가능
  • 슬롯은 할당된 프로젝트들이 공유

즉시 적용

  • Assignment 생성 즉시 새로운 쿼리부터 적용
  • 실행 중인 쿼리는 영향받지 않음

특정 쿼리에 Assignment 적용

BigQuery에서 특정 쿼리에만 reservation을 적용하는 방법을 소개합니다.

1. Job-level Reservation 지정

가장 직접적인 방법은 쿼리 실행 시 reservation을 명시하는 것입니다:

# Python 클라이언트 예시
from google.cloud import bigquery

client = bigquery.Client()

# Job 설정에서 reservation 지정
job_config = bigquery.QueryJobConfig(
    use_legacy_sql=False,
    # 특정 reservation 지정
    reservation_usage=bigquery.ReservationUsage(
        name="projects/my-project/locations/US/reservations/my-reservation"
    )
)

query = """
SELECT * FROM `my-dataset.my-table`
WHERE date = CURRENT_DATE()
"""

# 이 쿼리만 지정된 reservation 사용
query_job = client.query(query, job_config=job_config)

2. CLI에서 Reservation 지정

# bq 명령어로 특정 reservation 사용
bq query \
  --use_legacy_sql=false \
  --reservation_id="projects/my-project/locations/US/reservations/my-reservation" \
  "SELECT * FROM my-dataset.my-table"

3. SQL 스크립트에서 SET 문 사용

-- BigQuery 콘솔이나 스크립트에서
SET @@query_reservation = 'projects/my-project/locations/US/reservations/my-reservation';

-- 이후 실행되는 쿼리들이 해당 reservation 사용
SELECT * FROM `my-dataset.my-table`;
SELECT * FROM `my-dataset.another-table`;

-- None으로 설정하면 기본 assignment 사용
SET @@query_reservation = NULL;

4. 별도 프로젝트 전략

-- 특정 워크로드용 프로젝트 생성
-- analytics-project: 일반 쿼리용 (on-demand)
-- etl-project: ETL 작업용 (reservation 할당)

-- ETL 프로젝트에만 reservation assignment
CREATE ASSIGNMENT etl_assignment
OPTIONS(
  reservation_name = 'etl_reservation',
  assignee = 'projects/etl-project'
);

5. 쿼리 라벨과 모니터링

# 쿼리 라벨로 분류하여 추적
job_config = bigquery.QueryJobConfig(
    labels={
        "workload_type": "etl",
        "priority": "high",
        "team": "data-engineering"
    },
    reservation_usage=bigquery.ReservationUsage(
        name="projects/my-project/locations/US/reservations/etl-reservation"
    )
)

# 라벨별 슬롯 사용량 모니터링
monitoring_query = """
SELECT
  labels.workload_type,
  COUNT(*) as query_count,
  SUM(total_slot_ms) / 1000 as total_slot_seconds,
  reservation_id
FROM
  `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE
  creation_time >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)
GROUP BY
  labels.workload_type,
  reservation_id
"""

6. Workload Management 활용

-- 워크로드별로 다른 reservation 사용
-- 1. 실시간 대시보드용 reservation
CREATE RESERVATION dashboard_reservation
OPTIONS(
  edition = 'STANDARD',
  slot_capacity = 100
);

-- 2. 배치 처리용 reservation
CREATE RESERVATION batch_reservation
OPTIONS(
  edition = 'ENTERPRISE',
  slot_capacity = 500,
  autoscale_max_slots = 2000
);

-- 3. 애드혹 분석용 (on-demand 사용)
-- Assignment 없이 유지

7. 실용적인 구현 예시

class BigQueryReservationManager:
    def __init__(self, project_id):
        self.client = bigquery.Client(project=project_id)
        self.reservations = {
            'etl': 'projects/{}/locations/US/reservations/etl-reservation',
            'analytics': 'projects/{}/locations/US/reservations/analytics-reservation',
            'ml_training': 'projects/{}/locations/US/reservations/ml-reservation'
        }
    
    def run_query_with_reservation(self, query, workload_type='default'):
        job_config = bigquery.QueryJobConfig()
        
        # 워크로드 타입에 따라 reservation 선택
        if workload_type in self.reservations:
            reservation_name = self.reservations[workload_type].format(self.client.project)
            job_config.reservation_usage = bigquery.ReservationUsage(
                name=reservation_name
            )
        
        # 라벨 추가
        job_config.labels = {
            'workload_type': workload_type,
            'timestamp': str(int(time.time()))
        }
        
        return self.client.query(query, job_config=job_config)

# 사용 예시
manager = BigQueryReservationManager('my-project')

# ETL 작업은 ETL reservation 사용
etl_job = manager.run_query_with_reservation(
    "INSERT INTO cleaned_data SELECT ...",
    workload_type='etl'
)

# 분석 쿼리는 analytics reservation 사용
analytics_job = manager.run_query_with_reservation(
    "SELECT * FROM analytics_view",
    workload_type='analytics'
)

8. Best Practices

워크로드 분류

  • ETL vs 애드혹 분석 vs 실시간 대시보드
  • 각 워크로드별 적절한 reservation 크기 설정

비용 최적화

  • 예측 가능한 워크로드: reservation
  • 간헐적 워크로드: on-demand

모니터링

-- Reservation별 사용률 확인
SELECT
  reservation_id,
  COUNT(*) as job_count,
  AVG(total_slot_ms / elapsed_ms) as avg_slots_used
FROM
  `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE
  creation_time >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR)
GROUP BY
  reservation_id;

최종 업데이트: 2025년 1월