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

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

투명한 쿼리 전달

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

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

시작하기 전에

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

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

필요한 역할

투명한 쿼리 전달 사용 설정

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

세션 수준에서 사용 설정

현재 세션에서 투명 쿼리 전달을 사용 설정하려면 다음 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: 전달할 수 없습니다.

다음 단계