13년 잠복한 cascading replication 버그: segment 경계에서 멈추는 standby, Kubernetes가 찾아냈다

PostgreSQL 9.3부터 잠복해 있던 cascading replication 버그를 CloudNativePG 팀이 찾아 고쳤습니다. cascading standby가 archive recovery로 폴백했다가 streaming 재접속을 시도할 때, 요청 위치가 WAL segment 경계에 정확히 걸리면 upstream이 거부하고 재시도 없이 멈추는 문제입니다. 메커니즘과 오류 메시지, 그리고 13년 만에 잡힌 이유를 정리합니다.

2026년 8월 5일

record with incorrect prev-link, standby가 archive를 무한 restore하며 멈춘 이유

두 번째 failover 직후 secondary가 같은 WAL 세그먼트를 archive에서 계속 restore하면서 record with incorrect prev-link 로그만 2초 간격으로 반복했다. 이 메시지가 xlogreader의 어디에서 나오는지, timeline 분기와 recycled 세그먼트가 어떻게 얽히는지, pg_auto_failover 환경에서 실제로 어떻게 걷어냈는지 기록한다.

2026년 7월 24일

PostgreSQL 19, logical replication이 드디어 sequence를 따라간다

PostgreSQL 19부터 logical replication이 sequence 값을 subscriber로 동기화한다. failover 직후 첫 INSERT가 duplicate key로 터지던 오래된 함정이 ALL SEQUENCES 절과 REFRESH SEQUENCES 명령으로 정리됐다. 다만 연속 동기화가 아니라 시점 동기화라서, cutover runbook에 들어갈 자리가 정해져 있다.

2026년 6월 26일

PostgreSQL 19의 wal_level, 고정값에서 동적 floor 값으로

PostgreSQL 19부터 wal_level이 고정 설정이 아니라 floor 값으로 동작한다. logical replication slot이 생기면 effective level이 자동으로 올라가고, 마지막 slot이 사라지면 다시 내려간다. cascading standby와 archived WAL의 비대칭 함정 포함.

2026년 5월 13일