투명한 쿼리 전달로 리소스 최적화 및 읽기 쿼리 격리

이 페이지에서는 PostgreSQL용 AlloyDB 인스턴스에서 투명한 쿼리 전달을 사용 설정, 구성, 모니터링하는 방법을 설명합니다. 투명한 쿼리 전달은 기본 노드가 읽기 전용 쿼리를 가로채고 읽기 후 쓰기 일관성을 유지하면서 사용률이 낮은 읽기 풀 인스턴스로 선택적으로 전달할 수 있는 지능형 리소스 최적화 기능입니다. 읽기 풀로 전달된 쿼리는 기본 노드 실행과 일치하는 결과를 생성합니다.

투명한 쿼리 전달

투명한 쿼리 전달은 다음 시나리오에 가장 적합합니다.

  • 하이브리드 워크로드 (HTAP): 트랜잭션을 처리하는 동일한 데이터베이스에서 읽기-쓰기 일관성을 사용하여 보고 또는 분석 쿼리를 실행하고 비용이 많이 드는 읽기가 쓰기 지연 시간에 영향을 미치지 않도록 하려고 합니다.
  • 모놀리식 애플리케이션: 별도의 리더 및 라이터 엔드포인트를 사용하도록 애플리케이션을 리팩터링하지 않고 읽기 풀 용량을 사용하면서도 엄격한 쓰기 읽기 일관성이 필요합니다.
  • 동적 부하 관리: 읽기 트래픽이 예측할 수 없이 급증하며 기본 노드가 읽기 후 쓰기 일관성으로 과부하 상태일 때 데이터베이스가 읽기 풀 노드로 작업을 자동으로 오프로드하기를 원합니다.

시작하기 전에

  • AlloyDB 클러스터가 PostgreSQL 17 또는 18과 호환되는지 확인합니다.

  • AlloyDB 클러스터에 활성 읽기 풀 인스턴스가 하나 이상 구성되어 있어야 합니다. 읽기 풀 인스턴스를 만들거나 확인하는 방법에 대한 자세한 내용은 클러스터에서 읽기 풀 인스턴스 만들기인스턴스 세부정보 보기를 참고하세요.

필요한 역할

  • alloydbsuperuser 데이터베이스 역할이 있거나 기본 postgres 사용자로 로그인했는지 확인합니다.

투명한 쿼리 전달 사용 설정

투명 쿼리 전달은 기본적으로 사용 중지되어 있습니다. 데이터베이스를 다시 시작하지 않고 세션 수준 또는 데이터베이스 수준에서 동적으로 사용 설정할 수 있습니다.

세션 수준에서 사용 설정

현재 세션에 대해 투명한 쿼리 전달을 사용 설정하려면 다음 SQL 명령어를 실행합니다.

SET alloydb.enable_query_forwarding = TRUE;

데이터베이스 수준에서 사용 설정

특정 데이터베이스에 대해 투명한 쿼리 전달을 사용 설정하려면 다음 SQL 명령어를 실행합니다.

ALTER DATABASE DATABASE_NAME SET alloydb.enable_query_forwarding = ON;

DATABASE_NAME을 데이터베이스 이름으로 바꿉니다.

자격 요건 쿼리

  • 투명한 쿼리 전달은 읽기 전용 SELECT 문에만 적용됩니다.
  • 쿼리는 SELECT ... FOR UPDATE에서 사용되는 것과 같은 행 수준 잠금을 가져오면 안 됩니다.
  • 투명한 쿼리 전달은 멀티 문 트랜잭션 내의 SELECT 문에 대한 지원이 제한적입니다.
  • 쿼리는 임시 테이블, 로깅되지 않은 테이블 또는 카탈로그 테이블을 참조할 수 없습니다.
  • 쿼리는 다음 함수 제약 조건을 준수해야 합니다.
    • 쿼리에 변동 함수나 사용자 정의 함수 (UDF)가 포함되어서는 안 됩니다.
    • 쿼리에 CURRENT_DATE, LOCALTIME, USER, CURRENT_SCHEMA과 같은 SQL 값 함수가 포함되어서는 안 됩니다.
    • 쿼리에 NEXTVAL() 표현식이 포함되어서는 안 됩니다.
    • 쿼리에 SQL 프로시저나 SQL 함수가 포함될 수 없습니다.
  • 모든 결과 열은 바이너리 전송 및 수신 함수를 구현하는 데이터 유형을 사용해야 합니다.
  • 오버헤드 비용이 쿼리의 총비용에 비해 최소인 경우에만 쿼리를 전달할 수 있습니다. 즉, 색인 검색을 사용하는 쿼리는 일반적으로 제외됩니다. 오버헤드가 쿼리 자체의 비용을 초과하는 경우가 많기 때문입니다.
  • AlloyDB 핫 스탠바이 노드로 전달하는 것은 지원되지 않습니다. AlloyDB 상시 대기 노드는 고가용성 (HA) 기본 인스턴스를 위한 전용 보조 노드입니다.

EXPLAIN으로 쿼리 자격 확인

다음 예에서 large_table은 행이 많은 데이터베이스의 테이블입니다. 현재 구성에서 특정 쿼리를 전달할 수 있는지 확인하려면 EXPLAIN 명령어를 실행합니다.

EXPLAIN SELECT count(*) FROM large_table t1, large_table t2;

쿼리가 적격한 경우 출력에는 표준 Postgres 실행 계획 뒤에 쿼리 전달 상태 문이 포함됩니다. 이 문장이 누락되면 쿼리가 쿼리 전달에 적합하지 않으며 기본에서 로컬로 실행됩니다.

Aggregate  (cost=25000.00..25000.01 rows=1 width=8)
  ->  Nested Loop  (cost=0.00..20000.00 rows=1000000 width=0)
        ... [Standard Postgres Plan Steps] ...
Query Forwarding: Eligible. (overhead=1250.02)

출력 응답에서 Eligible는 쿼리가 표준 읽기 전용 SQL 기준을 충족하며 비용 편익 분석에 따라 읽기 풀 인스턴스로 라우팅하는 것이 유리함을 나타냅니다. overhead 매개변수는 연결 설정 및 복제본의 스냅샷 복원을 위한 오버헤드를 포함하여 읽기 풀 인스턴스로 쿼리를 전달하는 데 계산된 계획자 비용을 나타냅니다.

쿼리 전달 측정항목 모니터링

투명한 쿼리 전달이 워크로드 전반에서 작동하는지 확인하려면 Cloud Monitoring에서 다음 측정항목을 추적하면 됩니다.

측정항목 설명 세부정보
alloydb.googleapis.com/internal/database/postgresql/workload/distributed/tqf_query_count 투명한 쿼리 전달에 의해 처리된 쿼리의 누적 수입니다. 표시 이름: TQF 쿼리 수
측정항목 종류: CUMULATIVE
값 유형: INT64
라벨:
status: 투명한 쿼리 전달이 사용 설정된 경우의 쿼리 처리 이 라벨은 다음 값 중 하나를 기록합니다.
  • completed: 읽기 풀 인스턴스에서 실행됩니다.
  • fallback: 기본에서 실행됩니다.
  • disqualified: 전달할 수 없습니다.

다음 단계