PostgreSQL용 Openflow 커넥터: PostgreSQL 17+ failover 슬롯 지원
PostgreSQL용 Openflow 커넥터: PostgreSQL 17+ failover 슬롯 지원
이 문서에서는 PostgreSQL 17 이상에서 커넥터의 논리 복제 슬롯이 failover 시에도 어떻게 생존하는지 설명합니다.
출처: Snowflake 문서
본문
중요: runtime-extensions 2026.7.16.14 이상이 필요합니다. PostgreSQL 17 이상에만 적용됩니다.
PostgreSQL 17 이상에서 커넥터는 failover=true로 논리 복제 슬롯을 만듭니다. 슬롯은 PostgreSQL이 스탠바이에 동기화하며 다음을 견딥니다.
- 기본 장애 조치: 복제가 새 기본에서 재개됩니다.
- pg_upgrade를 통한 메이저 버전 업그레이드(예: 17 → 18). 단, 업그레이드 시점에 슬롯이 따라잡혀 있고 충돌하지 않으며 무효화되지 않은 경우.
failover 보호를 받으려면 커넥터가 기본을 가리켜야 합니다. PostgreSQL은 스탠바이에 대해 생성된 슬롯에서 failover=true를 허용하지 않습니다. JDBC URL이 읽기 복제본으로 해석되면 해당 노드의 슬롯에는 failover 보호가 없습니다.
버전은 자동 감지됩니다. 새 커넥터 속성이 필요하지 않습니다.
제한 사항
- PostgreSQL 16 및 이전 버전은 변경되지 않습니다. 이는 PostgreSQL 17 이전에는 존재하지 않는 네이티브 PostgreSQL 기능이므로 해당 버전에서는 failover 보호를 사용할 수 없습니다.
- 커넥터만 업그레이드한다고 기존 슬롯에 failover가 소급 적용되지는 않습니다. 커넥터는 슬롯 생성 시점에만 failover=true를 설정합니다. 기존 배포에서 failover 보호를 얻으려면 'Retrofit failover protection on an existing deployment'를 참조하세요.
- 전달은 failover에 걸쳐 최소 한 번(at-least-once)입니다. 커넥터는 재연결 시 중복을 제거합니다.
- 커넥터는 이 문서에 설명된 PostgreSQL 구성을 검증하지 않습니다. 그것이 없으면 failover=true는 비활성이며 슬롯은 failover를 견디지 못합니다.
필수 PostgreSQL 구성
다음 구성은 사용자가 설정해야 합니다. 커넥터는 이를 설정할 수 없습니다.
- 기본의 writer 엔드포인트를 가리키도록 JDBC URL을 지정해, 커넥터가 failover 후 새 기본에 재연결되게 하세요. 커넥터가 기본에 연결되었는지 확인하려면 연결된 데이터베이스에 대해 다음을 실행하세요. 결과는 false여야 합니다(false = 기본, true = 스탠바이):
SELECT pg_is_in_recovery();
- 기본에서 failover 후보 스탠바이의 물리적 복제 슬롯 이름을 나열하도록 synchronized_standby_slots를 설정하세요. 이것이 없으면 failover 슬롯이 스탠바이가 WAL을 받는 것보다 빠르게 진행될 수 있습니다:
synchronized_standby_slots = '<physical_slot_name>'
- 각 failover 후보 스탠바이에서 다음을 설정하세요.
- wal_level = logical(이미 기본에 필수): 승격 시 적용되도록 스탠바이에도 설정.
- sync_replication_slots = on
- hot_standby_feedback = on
- primary_conninfo에는 dbname=
가 포함되어야 함(PostgreSQL 17 요구 사항). - primary_slot_name은 기본의 synchronized_standby_slots에 나열된 물리적 슬롯을 참조해야 함.
기존 배포에 failover 보호 소급 적용
기존 배포에서 failover 보호를 얻으려면 재스냅샷 포함과 미포함의 두 경로가 있습니다. 선택한 경로의 절차를 따르세요.
재스냅샷 없이 failover 보호 소급 적용
경고: 새 커넥터를 시작하기 전에 기존 커넥터의 모든 기존 FlowFile을 처리하세요. 기존 커넥터는 큐에 FlowFile이 없고 모든 프로세서가 중지되어야 합니다. 기존 커넥터를 중지하고 새 커넥터를 시작하는 사이의 모든 쓰기는 Snowflake로 전달되지 않습니다. 슬롯이 삭제되면 PostgreSQL은 이전 WAL을 재생할 수 없습니다. 쓰기 없는 기간(write-free window)을 보장할 수 없다면 대신 재스냅샷 방식으로 failover 보호를 소급 적용하세요.
중요: 커넥터가 증분 모드일 때 새 테이블을 추가하지 마세요. 새 테이블은 스냅샷되지 않습니다.
- 계속하기 전에 커넥터가 완전히 따라잡혔는지 확인하세요. confirmed_flush_lsn이 pg_current_wal_lsn()과 일치해야 합니다:
SELECT slot_name, confirmed_flush_lsn, pg_current_wal_lsn() FROM pg_replication_slots;
- PostgreSQL 소스 데이터베이스에 대해 다음을 실행해 소스 테이블의 쓰기를 일시 중지하세요.
와 <app_role>을 값으로 바꾸세요:
REVOKE INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA <schema> FROM <app_role>;
- 커넥터의 모든 큐가 비워질 때까지 기다리세요.
- 커넥터를 중지하고 모든 Controller Services를 비활성화하세요.
- 복제 슬롯을 삭제하세요. 슬롯 이름은 CaptureChangePostgreSQL 프로세서 상태의 replication.slot.name 또는 pg_replication_slots에 있습니다:
SELECT pg_drop_replication_slot('<slot_name>');
- 파라미터 컨텍스트에서 Ingestion Type을 incremental로 설정하세요. 이렇게 하려면 Ingestion Parameters → Ingestion Type으로 이동해 값을 incremental로 편집하세요.
- 새 커넥터를 설치하세요. 상단 메뉴에서 Import from registry를 드래그 다운하고, Flow에서 postgresql을 선택하고, Keep existing Parameter contexts를 선택해 기존 커넥터와 같은 파라미터 컨텍스트를 재사용한 뒤 Import를 클릭하세요.
- 모든 Processors와 Controller Services를 포함해 커넥터를 완전히 시작하세요.
- PostgreSQL 소스 데이터베이스에 대해 다음을 실행해 새 슬롯이 failover=true로 생성되었는지 확인하세요:
SELECT slot_name, failover FROM pg_replication_slots;
- 쓰기를 재개하세요:
GRANT INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA <schema> TO <app_role>;
- 선택 사항으로, 실수로 재개하는 것을 막기 위해 기존 커넥터를 삭제하세요.
참고: 모든 기존 테이블이 증분 복제(Incremental Replication)로 전환되면 Ingestion Type을
incremental에서full로 변경하세요. 확인하려면 Snowsight에서 Ingestion → Openflow → Connector Observability로 이동해 커넥터를 선택하고 Replication Phase 열에서 모든 테이블이 Incremental Replication을 표시하는지 확인하세요.
재스냅샷으로 failover 보호 소급 적용
참고: 슬롯 삭제와 재스냅샷 완료 사이에 소스에서 발생한 개별 변경 이벤트는 CDC 이벤트로 전달되지 않습니다. 이들은 스냅샷의 최종 행 값에 흡수됩니다.
- 커넥터에서 Included Table Names와 Included Table Regex 파라미터를 비워 복제에서 모든 테이블을 제거하세요.
- 커넥터의 모든 큐가 비워질 때까지 기다리세요.
- 모든 Processors와 Controller Services를 포함해 커넥터를 중지하세요.
- 복제 슬롯을 삭제하세요. 슬롯 이름은 CaptureChangePostgreSQL 프로세서 상태의 replication.slot.name 또는 pg_replication_slots에 있습니다:
SELECT pg_drop_replication_slot('<slot_name>');
- 새 커넥터를 설치하세요. 상단 메뉴에서 Import from registry를 드래그 다운하고, Flow에서 postgresql을 선택하고, Keep existing Parameter contexts를 선택한 뒤 Import를 클릭하세요.
- 테이블을 Included Table Names에 다시 추가하세요.
- 모든 Processors와 Controller Services를 포함해 새 커넥터를 완전히 시작하세요. 커넥터는 failover=true인 새 복제 슬롯을 만들고 테이블을 새로 스냅샷합니다.
새 슬롯에 failover=true가 있는지 확인하세요:
SELECT slot_name, failover FROM pg_replication_slots;
pg_upgrade 실행 시 추가 단계
이 단계는 메이저 버전 업그레이드 중에만 필요합니다. 일반 설정의 일부가 아닙니다.
pg_upgrade를 시작하기 전에 커넥터가 따라잡혀 있고 슬롯이 충돌하지 않거나 무효화되지 않았는지 확인하세요:
SELECT slot_name, conflicting, invalidation_reason FROM pg_replication_slots;