PostgreSQL 데이터베이스에서 데이터 스트리밍

Datastream을 사용하여 PostgreSQL 데이터베이스의 이전 데이터와 지속적인 변경사항을 실시간 분석 및 데이터베이스 동기화를 위해 대상으로 복제할 수 있습니다.

Datastream에서 PostgreSQL 복제를 준비하려면 복제 동작, 지원되는 버전 및 데이터베이스 유형, 권장사항, 읽기 복제본 요구사항, 알려진 제한사항을 검토하세요.

동작

소스 PostgreSQL 데이터베이스는 논리적 디코딩 기능을 사용합니다. 논리적 디코딩은 데이터베이스에 커밋된 모든 변경사항을 노출하고 출력 플러그인을 사용하여 이러한 변경사항을 사용자 친화적인 형식으로 사용하고 처리할 수 있게 해줍니다. Datastream은 PostgreSQL 10 이상용 표준 PostgreSQL 논리적 디코딩 플러그인인 pgoutput 플러그인을 사용합니다.

  • 특정 PostgreSQL 소스의 모든 스키마 또는 특정 스키마와 스키마의 모든 테이블 또는 특정 테이블을 선택할 수 있습니다.
  • 모든 이전 데이터가 복제됩니다.
  • 지정된 데이터베이스 및 테이블의 삽입, 업데이트, 삭제와 같은 모든 데이터 조작 언어(DML) 변경사항이 복제됩니다.
  • 커밋된 변경사항만 복제됩니다.
  • 테이블에 복제본 ID를 정의하면 Datastream이 지정된 열을 기본 키로 취급합니다.
  • Datastream은 기본 인스턴스에 연결되면 주기적으로 하트비트 메시지를 소스 데이터베이스로 전송합니다. 따라서 논리적 디코딩 메시지 이벤트 (op:"m")가 WAL 파일에 직접 삽입됩니다. 이러한 메시지는 Datastream에서 소스 가용성을 보장하고 최신 상태를 계산하는 데 필요합니다. 읽기 복제본을 소스로 사용하는 경우 하트비트 메시지를 외부에서 구성해야 합니다. 자세한 내용은 읽기 복제본에서 복제를 참조하세요. 다른 복제 설정이 동일한 소스 데이터베이스에서 읽는 경우 이 점을 고려하는 것이 좋습니다.

버전

Datastream은 PostgreSQL 버전 10 이상을 지원합니다.

Datastream은 다음 유형의 PostgreSQL 데이터베이스를 지원합니다.

  • 자체 호스팅 PostgreSQL
  • PostgreSQL용 Cloud SQL
  • PostgreSQL용 AlloyDB
  • AlloyDB Omni
  • PostgreSQL용 Amazon RDS
  • Amazon Aurora PostgreSQL

무료 등급

Datastream을 사용하면 무료 등급을 사용하여 PostgreSQL용 AlloyDB에서 BigQuery로 스트리밍할 수 있으며, 매월 최대 100GiB의 변경 데이터 캡처 데이터가 무료로 제공됩니다. 자세한 내용은 Datastream 가격 책정을 참조하세요.

권장사항

이 섹션에서는 Datastream에 사용할 PostgreSQL 소스를 구성하는 데 권장되는 권장사항을 설명합니다.

여러 스트림을 사용하여 대기 행렬 막힘 방지

PostgreSQL 소스의 경우 Datastream은 전체 스트림에 단일 논리적 복제 슬롯을 사용합니다. 대규모 트랜잭션 또는 대용량 테이블 하나에 대한 여러 업데이트로 인해 동일한 스트림의 다른 모든 테이블에 대한 데이터 복제가 지연될 수 있습니다.

HOL 차단을 방지하려면 서로 다른 테이블 집합에 대해 별도의 스트림을 만듭니다. 예를 들어 대용량 테이블에 대해 하나의 스트림을 만들고 소용량 테이블에 대해 다른 스트림을 만들 수 있습니다. 이렇게 하면 이탈률이 높은 테이블이 격리되고 다른 테이블의 복제가 지연되는 것을 방지할 수 있습니다.

권장사항: 쓰기(INSERT/UPDATE/DELETE) 비율이 유난히 높은 테이블을 식별하고 별도의 복제 슬롯이 있는 자체 전용 Datastream 스트림에 배치합니다.

장기 실행 트랜잭션 방지

장기 실행 트랜잭션으로 인해 WAL 로그가 누적될 수 있습니다. WAL은 순차적이므로 PostgreSQL은 긴 트랜잭션이 완료될 때까지 복제 슬롯에 필요한 이전 WAL 파일을 삭제할 수 없습니다. 이렇게 하면 WAL 디스크 사용량이 증가합니다.

또한 이로 인해 논리 디코딩이 느려질 수 있습니다. 이러한 속도 저하는 대규모 트랜잭션이 변경사항을 디스크에 기록하고, 커밋 시 느리고 I/O 집약적인 재조립이 필요하여 이후의 모든 트랜잭션 복제가 차단되기 때문에 발생합니다. 권장사항: 소스 데이터베이스에서 statement_timeout 및 idle_in_transaction_session_timeout 매개변수를 구성하여 장기 실행 트랜잭션을 방지합니다. 자세한 내용은 PostgreSQL 문서를 참조하세요.

게시를 만들 때 테이블 필터링 사용

몇 개의 테이블에서만 변경사항을 복제하는 경우 해당 테이블만 포함하는 PUBLICATION을 만들어야 합니다. 게시 범위가 특정 테이블로 지정되면 PostgreSQL은 복제 슬롯에서 해당 테이블의 변경사항만 효율적으로 유지합니다. 이렇게 하면 복제 슬롯의 크기가 줄어들고 논리적 디코딩 성능이 향상됩니다.

사전 예방적으로 복제 슬롯 관리

Datastream은 PostgreSQL 기본 인스턴스에서 논리적 복제 슬롯을 사용하므로 Datastream에서 WAL 파일이 처리되었음을 확인할 때까지 WAL 파일이 보관됩니다. 복제 슬롯을 삭제하지 않고 스트림이 실패하거나 일시중지되거나 삭제되면 PostgreSQL은 WAL 파일을 무기한 보관합니다. 이로 인해 데이터베이스 서버 디스크가 가득 차고 프로덕션 중단이 발생할 수 있습니다.

권장사항: 소스 PostgreSQL 서버에서 효율적인 알림을 설정하고 WAL 디스크 사용량을 모니터링합니다.

복제본 ID를 올바르게 구성

REPLICA IDENTITY 설정은 PostgreSQL에 UPDATE 및 DELETE 이벤트에 대해 WAL에 쓸 데이터를 알려주므로 Datastream에서 변경된 행을 식별할 수 있습니다.

BigQuery를 대상으로 사용하는 경우 REPLICA IDENTITY를 FULL로 설정하지 마세요. Datastream은 로깅된 열을 BigQuery MERGE 작업의 논리 키로 사용합니다. REPLICA IDENTITY가 FULL로 설정되어 있고 테이블에 열이 16개 넘게 있으면 MERGE 작업에서 기본 키에 대한 BigQuery 16열 한도를 초과하고 스트림이 중단됩니다.

권장사항 (선호도 순):

  1. 최적: 기본 키를 사용합니다. REPLICA IDENTITY DEFAULT의 기본 설정은 기존 기본 키를 자동으로 효율적으로 사용합니다.
  2. 양호: 기본 키가 없으면 UNIQUE NOT NULL 색인을 만들고 REPLICA IDENTITY USING INDEX INDEX_NAME를 설정합니다.
  3. 가장 권장되지 않음: 고유 식별자가 없는 테이블에서만 REPLICA IDENTITY FULL 설정을 사용합니다. BigQuery에 복제하는 경우 성능 영향, 16열 제한, 기본 키에 지원되는 데이터 유형에 대한 제한사항에 유의하세요.

읽기 복제본에서 복제

Datastream은 PostgreSQL 버전 16 이상의 PostgreSQL 읽기 복제본 인스턴스에서 복제를 지원합니다.

읽기 복제본에서 복제하려면 기본 인스턴스에서 다음 설정 단계를 수행해야 합니다.

  1. 기본 인스턴스에 게시 만들기: Datastream이 읽기 복제본에 연결되는 동안 복제할 데이터를 정의하는 게시를 기본 인스턴스에 만들어야 합니다.
  2. WAL 하트비트 구성: Datastream은 체크포인트 메커니즘을 위해 주기적인 WAL 하트비트 메시지를 사용합니다. 기본 인스턴스에 연결할 때 Datastream은 이러한 하트비트 생성을 처리합니다. 하지만 읽기 복제본의 경우 이러한 하트비트를 외부에서 생성해야 합니다.

정기 하트비트를 설정하는 한 가지 방법은 pg_cron 확장 프로그램을 사용하여 PostgreSQL에서 크론 작업을 만드는 것입니다.

SELECT cron.schedule_in_database(
    'datastream-heartbeat',             -- Job name
    '* * * * *',                        -- Every minute
   $$SELECT pg_logical_emit_message(true, 'datastream', 'cdc heartbeat')$$,
    'DATABASE_NAME',              -- Change this to your database name
    'USERNAME',                   -- Username to run as
    true                                -- Enabled
);

다음을 바꿉니다.

  • DATABASE_NAME: 하트비트를 생성할 데이터베이스의 이름입니다.
  • USERNAME: 태스크를 실행할 사용자 이름입니다. 일반적으로 postgres입니다.

알려진 제한사항

PostgreSQL 데이터베이스를 소스로 사용하여 Datastream을 사용할 때 알려진 제한 사항은 다음과 같습니다.

  • 스트림이 테이블 10,000개로 제한됩니다.
  • PostgreSQL은 UTF-8 문자열 열에서 NULL 바이트 (0x00)를 엄격하게 거부합니다. Datastream은 NULL 바이트를 삭제하지 않습니다. 소스 문자열에 0x00 null 바이트가 포함된 경우 삽입 배치가 실패하고 복제가 중지됩니다. 복제하기 전에 소스 데이터베이스에서 CHAR(0) 문자를 삭제하거나 바꾸는 것이 좋습니다.
  • 가장 최근 위치에서 시작하도록 PostgreSQL 스트림을 구성할 수 없습니다.
  • 행 개수가 5억 개를 초과하는 테이블은 다음 조건이 충족되지 않는 한 백필할 수 없습니다.
    1. 테이블에 고유한 B-tree 색인이 있습니다.
    2. 색인에 DOUBLE, FLOAT, MONEY, REAL, JSON, JSONB, BYTEA, TXID, XML 유형, 복합 데이터 유형 또는 기하학적 데이터 유형의 열이 포함되어 있지 않습니다.
    3. 색인의 열 중에 null이 허용되는 열이 없습니다.
    4. 색인의 모든 열이 오름차순으로 정렬되거나 색인의 모든 열이 내림차순으로 정렬됩니다.
    5. 색인의 모든 열이 스트림에 포함됩니다.
  • 기본 키가 없는 테이블에는 복제본 ID가 있어야 합니다. 그렇지 않으면 INSERT 이벤트만 대상으로 복제됩니다.
  • 기본 키가 있는 테이블은 복제본 ID를 FULL 또는 NOTHING로 설정할 수 없습니다. DEFAULT로 설정해야 합니다.
  • 소스 스키마에 대한 모든 변경사항이 올바르게 검색되지 않아서 데이터 손상이 발생할 수 있습니다. 다음 스키마 변경으로 인해 데이터가 손상되거나 이벤트 다운스트림을 처리하지 못할 수 있습니다.
    • 열 삭제
    • 테이블 중간에 열 추가
    • 열의 데이터 유형 변경:
    • 열 재정렬
    • 테이블 삭제(새 데이터를 추가한 후 같은 테이블을 다시 만드는 경우에 해당)
  • Datastream은 BOX, CIRCLE, LINE, LSEG, PATH, POINT, POLYGON와 같은 geometric 데이터 유형의 열을 지원하지 않습니다. 이러한 열은 NULL로 복제됩니다.
  • Datastream은 range 데이터 유형의 열을 지원하지 않습니다.
  • Datastream은 지원되지 않는 데이터 유형의 배열 (예: 공간 유형), LTREE 배열, 사용자 정의 데이터 유형의 배열 (ENUM 포함)이나 DATE, TIMESTAMP 또는 TIMESTAMP WITH TIME ZONE (TIMESTAMPTZ) 배열을 지원하지 않습니다. Datastream은 복제 중에 이러한 열을 무시합니다.
  • 2026년 2월 17일 이전에 생성된 스트림의 경우: Datastream은 테이블의 복제본 ID에 포함된 열에 TOAST 값을 포함하는 행에 대해 UPDATE 이벤트 복제를 지원하지 않습니다. 이러한 이벤트는 삭제됩니다. 이 날짜 이후에 생성된 스트림에는 이 예외가 적용되지 않습니다.
  • Datastream은 2,950개를 초과하는 중첩된 객체와 JSON 또는 JSONB 값을 포함하는 행의 복제를 지원하지 않습니다. 이러한 JSON 또는 JSONB 값을 포함하는 이벤트는 대상 데이터베이스에 복제되지 않습니다.
  • Datastream은 NUMERIC (precision, scale) 열에 NaN 값이 포함된 행의 복제를 지원하지 않습니다. 이러한 열의 값은 NULL 값으로 바뀝니다.
  • Datastream은 hstore 데이터 유형의 열 복제를 지원하지 않습니다. 이러한 열의 값은 NULL 값으로 바뀝니다.
  • Datastream은 SQL_ASCII로 인코딩된 소스 데이터베이스에서 비ASCII 레코드 복제를 지원하지 않습니다. 이러한 레코드는 삭제됩니다.
  • Datastream은 행 수준 보안(RLS) 정책이 정의된 테이블의 복제를 지원하지 않습니다. 이 제한사항을 우회하는 방법에 관한 자세한 내용은 PostgreSQL 소스 동작 및 제한사항을 참조하세요.
  • TOAST (Oversized-Attribute Storage Technique)를 사용하는 가변 길이 데이터 유형의 열을 스트리밍하는 경우: UPDATE 작업 중에 변경되지 않은 TOAST 값이 WAL 로그에서 삭제되면 Datastream은 누락된 값을 복구하기 위해 소스 데이터베이스에서 활성 조회를 수행합니다. 따라서 빠른 연속 업데이트 또는 삽입 후 빠른 삭제가 포함된 시나리오에서는 중간 변경사항이 캡처되지 않을 수 있습니다. DELETE 작업은 이 활성 조회 작업을 트리거하지 않습니다. TOAST를 사용하는 가변 길이 열에 대한 이 제한은 모든 중간 변경사항이 캡처될 것으로 예상되는 추가 전용 쓰기 모드를 사용할 때 특히 관련이 있습니다.
  • Datastream은 생성 열에 대한 변경사항을 캡처하지 않습니다.
  • 데이터베이스에서 PostgreSQL 메이저 버전 업그레이드가 수행되면 Datastream이 작동을 중지하거나 새 이벤트를 캡처하지 못할 수 있습니다. 업그레이드 전에 복제 슬롯을 삭제한 후 데이터베이스를 업그레이드하고 복제 슬롯을 다시 만드는 것이 좋습니다. 스트림이 실패하면 새 복제 슬롯 이름을 지정하여 스트림을 복구하고 데이터 일관성이 필요한 경우 백필을 수행합니다.
  • Datastream은 자동 스트림 설정 흐름을 사용할 때 PostgreSQL 시스템 테이블 복제를 지원하지 않습니다. 자동화된 흐름을 사용하여 만든 스트림을 수정하고 시스템 테이블을 추가하면 Datastream은 이러한 테이블을 자동으로 무시하고 데이터나 변경사항을 복제하지 않습니다.

다음 단계