postgreSQL의 wal_level은 기본으로 replica로 설정되어 있지만, CDC를 활용하여 다른 데이베이스에 저장하려하면 postgreSQL의 wal_level을 logical로 바꿔야만 동작합니다.
왜 그냥 하면 안되지? 하는 마음에 wal_level에 대해서 정리해보았습니다.
1. WAL (Write-Ahead Logging)과 wal_level
- PostgreSQL의 WAL은 데이터베이스 변경 사항을 로그에 기록하여 데이터 복구와 복제를 지원합니다.
- wal_level은 WAL 데이터를 어떤 수준으로 기록할지를 제어하며, PostgreSQL은 다음 세 가지를 제공합니다.
- minimal: WAL 로그를 최소 수준으로 기록. 데이터 복구를 위한 최소한의 정보만 포함.
- replica: WAL 로그에 데이터 복제를 지원하기 위한 정보를 추가.
- logical: WAL 로그에 데이터의 논리적 변경 내용을 기록하여 CDC나 논리적 복제를 지원.
참고
minimal은 WAL 로그에 복구를 위한 데이터가 제한적으로 기록되어 데이터 손실 가능성 있음!!
2. wal_level = replica ( 물리적 복제를 지원 )
replica 수준은 데이터베이스 복구와 복제 기능을 지원하기 위해 충분한 정보를 WAL 로그에 기록.
기본적으로 고가용성(HA) 및 백업/복구를 요구하며, 물리적 복제는 이러한 시나리오를 지원하는 핵심 기능
- 물리적 복제:
- 주로 PostgreSQL의 Primary-Replica 설정에서 사용됩니다.
- Primary 서버의 데이터를 그대로 Replica 서버에 복제하여 고가용성을 제공.
- WAL 로그의 정보를 바이트 단위로 그대로 복제하므로 성능이 뛰어나고, 데이터 구조나 스키마를 변경하지 않습니다.
- 데이터 복구:
- WAL 로그는 장애 발생 시 데이터베이스를 복구하는 데 필수적입니다.
- replica 수준은 데이터 복구를 위한 충분한 변경 내용을 포함합니다.
- Hot Standby
- 복제본에서 읽기 전용 쿼리를 실행할 수 있으며 데이터 복제의 성능을 높이기 위해 사용됨.
3. wal_level = logical
wal_level을 logical로 설정하면 WAL 로그에 테이블의 변경 사항을 논리적(데이터 기반)으로 기록합니다. 이 방식은 CDC 시스템에서 필요로 하는 데이터를 제공.
- 논리적 복제 슬롯(Logical Replication Slot)을 통해 테이블 단위로 변경 사항을 추출 가능.
- 데이터 변경을 행(row) 단위로 캡처하여 외부 시스템으로 스트리밍 가능.
- 변경 데이터는 INSERT, UPDATE, DELETE 같은 DML 이벤트를 명시적으로 나타냅니다.
- 추가적인 리소스 필요:
- 논리적 WAL 로그는 추가 정보를 기록하므로 WAL 로그 크기가 증가 및 I/O 부하가 커짐
- 소비자(CDC)가 데이터를 읽을 때까지 WAL 로그를 삭제하지 않는다!!
마지막 부분이 중요한데, 기존의 relica의 wal 에서는 트랜잭션 단위로 기록을 했다면, logical에서는 cdc에서 해당 논리적버퍼를 읽을때까지 wal 데이터 기록이 그대로 남아 있게 된다. (가져 갈때까지 지우지 않음)
물론 logical은 CDC나 스트리밍을 위한 것이고, replica는 하나의 데이터베이스를 복제한다고 (자기복제) 생각하면 된다.
참고
https://www.postgresql.org/docs/current/runtime-config-wal.html
'Database > DB' 카테고리의 다른 글
timesacle db + fastapi (0) | 2024.12.03 |
---|---|
디비 개선 작업 + cluster (2) | 2024.09.09 |
postgresql 한글 order by의 기준 (0) | 2023.03.08 |
postgresql SQL Error [42P10]: ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification (0) | 2022.11.10 |
파티셔닝 실습 - postgresql (0) | 2021.06.22 |