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

쓰기 후 읽기 일관성을 희생하거나 애플리케이션 연결 엔드포인트를 수정하지 않고 기본 인스턴스에서 읽기 트래픽을 오프로드하려면 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: 전달할 수 없습니다.

다음 단계