복제 문제 해결

AlloyDB는 컴퓨팅과 스토리지를 분리하는 아키텍처를 갖추고 있어 각각 독립적으로 확장할 수 있습니다. 기본 인스턴스와 읽기 풀 인스턴스는 동일한 기본 스토리지를 공유하지만 복제는 읽기 복제본 전반에서 데이터 일관성과 최신성을 유지하는 데 여전히 중요한 프로세스입니다. AlloyDB 클러스터에서 쓰기는 기본 인스턴스에서 실행된 후 공유 스토리지의 미리 쓰기 로그 (WAL)에 기록됩니다. 그런 다음 이러한 변경사항은 읽기 풀 인스턴스의 인메모리 캐시에 복제됩니다. 이 복제 프로세스의 두 가지 주요 단계를 이해하는 것은 문제를 해결하는 데 중요합니다.

  • WAL 플러시: 데이터베이스 변경사항이 포함된 미리 쓰기 로그 (WAL)가 기본 인스턴스에서 복제본으로 전송됩니다. 그런 다음 복제본은 WAL을 디스크에 즉시 유지합니다. 이러한 단계 중 하나가 지연되면 복제 지연이 발생합니다. 하지만 이 용어는 모호할 수 있습니다. 더 정확하게 말하면 복제 지연은 다음 두 가지 구성요소로 나눌 수 있습니다.

  • 플러시 또는 네트워크 지연: WAL 플러시 단계의 지연입니다. WAL이 기본 인스턴스에서 전송되어 복제본에 유지되는 데 걸리는 시간입니다.

  • 재생 지연: WAL 적용 단계의 지연입니다. 복제본이 WAL의 변경사항을 적용하는 데 걸리는 시간입니다.

플러시 지연과 재생 지연 중 무엇을 더 우려해야 하는지는 사용 사례에 따라 다릅니다.

  • 데이터 손실(예: 교차 리전 복제본)이 우려되는 경우 플러시 지연에 유의해야 합니다. WAL이 아직 복제본에 유지되지 않았는데 기본이 비정상 종료되면 복제본의 관점에서 변경사항이 손실됩니다.
  • 읽기 복제본의 데이터 업데이트에 대해 우려하는 경우 재생 지연에 주의해야 합니다. 재생 지연 시간이 길다는 것은 읽기 복제본의 데이터가 오래되었다는 의미입니다.

복제 지연 확인

Google Cloud 콘솔에서 읽기 풀 인스턴스의 복제 지연을 모니터링할 수 있습니다. 자세한 내용은 인스턴스 모니터링을 참고하세요. 또한 측정항목 기준점 알림 정책 만들기를 사용하여 읽기 풀 복제 지연 시간을 모니터링하고 지정된 기준에 도달할 때 알림을 받을 수 있습니다.

복제 지연의 일반적인 원인

다음은 복제 지연의 일반적인 원인과 해결 방법입니다.

리소스 경합

CPU 및 메모리와 같은 시스템 리소스 경합으로 인해 복제가 느려질 수도 있습니다.

  • CPU 및 메모리 압력: 읽기 풀 인스턴스의 과도한 읽기 워크로드가 CPU 및 메모리 리소스를 놓고 복제 프로세스와 경쟁할 수 있습니다. Google Cloud 콘솔에서 인스턴스의 CPU 및 메모리 사용량을 확인할 수 있습니다. 리소스 사용률이 높으면 읽기 풀 인스턴스를 수직 확장하거나 수평 확장해야 할 수 있습니다.
  • 읽기 풀 노드 크기: 기본 인스턴스가 읽기 풀 노드보다 훨씬 큰 경우 읽기 노드가 처리할 수 있는 것보다 빠르게 복제 로그가 생성될 수 있습니다. 이러한 경우 복제본에 더 많은 리소스를 제공하기 위해 더 큰 읽기 노드를 사용하는 것이 좋습니다.

복제 충돌

읽기 쿼리는 복제 프로세스가 기다리는 리소스를 보유하므로 복제 프로세스를 차단할 수 있습니다. 예를 들어 읽기 쿼리에 복제 프로세스에서 업데이트해야 하는 데이터베이스 객체에 대한 잠금이 있는 경우 잠금이 해제될 때까지 복제가 차단됩니다. 이를 버퍼 핀 충돌이라고 합니다.

로그 탐색기의 postgres.log 파일에서 canceling statement due to conflict with recovery 메시지를 찾아 이러한 충돌을 식별할 수 있습니다.

복제 충돌을 완화하려면 다음을 수행하세요.

  • max_standby_streaming_delay 줄이기: 이 파라미터는 복제 프로세스가 차단하는 쿼리를 취소하기 전에 대기하는 시간을 결정합니다. 기본값은 30초입니다. 이 값을 줄이면 복제 지연을 줄일 수 있지만 더 많은 읽기 쿼리가 취소될 수도 있습니다. 이 매개변수를 조정하여 애플리케이션에 가장 적합한 균형을 찾을 수 있습니다.

  • 장기 실행 쿼리 방지: 읽기 풀에서 장기 실행 쿼리를 실행하면 복제 충돌이 발생할 가능성이 높아집니다. 복제 지연 시간이 중요하지 않은 다른 읽기 풀로 장기 실행 쿼리를 이동하는 것이 좋습니다.

  • alloydb.promote_cancel_to_terminate 사용 설정: 기본적으로 사용 설정된 이 플래그를 사용하면 AlloyDB가 취소 요청에 응답하지 않는 쿼리 백엔드를 강제로 종료할 수 있습니다. 이렇게 하면 응답하지 않는 백엔드가 장기간 복제를 차단하는 것을 방지할 수 있습니다.

임시 읽기 쿼리 제한

또한 AlloyDB에서는 google_storage.log_replay_throttle_read_transactions 플래그를 사용하여 읽기 노드에서 읽기 쿼리의 지연 시간 기반 제한을 사용 설정할지 여부를 제어할 수 있습니다. 매개변수가 기본값인 on로 설정된 경우 복제 지연 시간이 1초를 초과하면 새 쿼리가 시작되지 않도록 일시중지되고 최대 1분 동안 새 버퍼가 읽혀 읽기 쿼리가 제한됩니다. 이 기능은 읽기 지연 시간이 늘어날 수 있다는 단점이 있지만, 더 많은 리소스를 재생에 제공하여 더 빠르게 따라잡을 수 있도록 하여 복제 지연 시간을 개선합니다. 애플리케이션이 복제 지연에 민감하지 않은 경우 google_storage.log_replay_throttle_read_transactionsoff로 설정하여 읽기 쿼리 지연 시간 개선을 우선시할 수 있습니다.

다음 방법을 사용하여 쿼리 제한의 영향을 모니터링할 수 있습니다.

  • 로그: 로그 탐색기의 postgres.log 파일에서 Delayed.*due to replica lag 메시지를 검색하여 복제본 지연으로 인해 쿼리가 지연되는 시점을 파악합니다.

  • Cloud Monitoring: alloydb.googleapis.com/instance/postgresql/wait_count 측정항목을 사용하여 제한된 쿼리 수를 확인합니다. 이렇게 하려면 wait_event_name로 측정항목을 필터링하고 HighLagThrottle를 찾습니다. 쿼리가 제한된 총 시간을 확인하려면 동일한 필터로 alloydb.googleapis.com/instance/postgresql/wait_time 측정항목을 사용하면 됩니다. 자세한 내용은 시스템 통계 측정항목 참조를 참고하세요.

  • 쿼리 통계: 쿼리 통계 대시보드의 활성 쿼리 보기에는 복제 지연으로 인해 쿼리가 제한될 때 대기 이벤트 열에 HighLagThrottle 대기 이벤트가 표시됩니다. 자세한 내용은 활성 쿼리 모니터링을 참고하세요.

과도한 워크로드

기본 인스턴스의 쓰기 워크로드가 갑자기 증가하면 많은 복제 로그가 생성되어 읽기 풀 인스턴스가 과부하되고 복제 지연이 발생할 수 있습니다. Google Cloud 콘솔에서 기본 인스턴스의 쓰기 트래픽을 모니터링할 수 있습니다.

고액 거래

많은 수의 행에 영향을 미치는 COMMIT 또는 ABORT 레코드와 같은 대규모 트랜잭션은 읽기 풀 인스턴스로 복제하는 데 시간이 오래 걸릴 수 있습니다. PostgreSQL 14에서 독점 잠금 목록이 긴 트랜잭션이 장기간 실행되면 읽기 복제본의 메모리 사용량이 증가하여 결국 읽기 풀 인스턴스가 비정상 종료될 수 있습니다.

이 문제를 완화하려면 기본 인스턴스에서 장기 실행 트랜잭션을 종료하면 됩니다.

복제를 방해하는 문제 해결하기

복제 지연이 발생하려면 작동하는 읽기 풀이 있어야 합니다. 다음 문제로 인해 읽기 풀 생성이 방지되거나 읽기 복제본이 비정상 종료되어 복제가 완전히 발생하지 않을 수 있습니다.

읽기 풀 생성 문제

읽기 풀을 만들지 못하면 Cloud Logging의 AlloyDB 로그에 Failed to create read pool 메시지가 표시될 수 있습니다. 클러스터가 최대 스토리지 한도에 도달하여 기본 인스턴스에서 공간을 더 할당할 수 없는 경우 이러한 문제가 발생할 수 있습니다. AlloyDB는 스토리지를 자동으로 확장하지만 스토리지를 소비하는 항목을 조사하고 불필요한 데이터를 삭제하거나 지원팀에 문의하여 스토리지 할당량 증가를 요청해야 할 수도 있습니다.

읽기 풀 인스턴스 비정상 종료

PostgreSQL 14에서 독점 잠금 목록이 긴 기본 인스턴스의 장기 실행 트랜잭션으로 인해 읽기 복제본의 메모리 사용량이 증가할 수 있으며, 결국 읽기 풀 인스턴스가 비정상 종료될 수 있습니다.

이 문제를 완화하려면 기본 인스턴스에서 장기 실행 트랜잭션을 종료하면 됩니다.

인스턴스 크기 조절이 복제 지연에 미치는 영향

AlloyDB의 스토리지 아키텍처는 인스턴스 크기 조절이 읽기 풀 플러시 지연에 영향을 미치지 않도록 합니다. 하지만 리플레이에는 적용되지 않습니다. 복제본의 재생 기능은 부하에 따라 달라집니다. 인스턴스 구성을 업데이트하는 경우(예: 크기 조절) 워크로드에 따라 작업이 완료될 때 복제본의 캐시가 완전히 워밍되지 않을 수 있습니다. 즉, 아직 캐시되지 않은 레코드를 재생하거나 처리하는 속도가 느립니다. 이 경우 일시적으로 리플레이 지연 시간이 증가할 수 있습니다.