synchronous_commit
| 버전 | 기본값 | context | 타입 |
|---|---|---|---|
| 14 | the opposite | user | enum |
| 15 | the opposite | user | enum |
| 16 | the opposite | user | enum |
| 17 | the opposite | user | enum |
| 18 | the opposite | user | enum |
| 19 | the opposite | user | enum |
서버가 클라이언트에 commit 성공을 알리기 전에 WAL 처리가 어디까지 완료돼야 하는지를 정한다.
유효한 값은 remote_apply, on(기본값), remote_write, local, off다. synchronous_standby_names가 비어 있으면 의미 있는 설정은 on과 off뿐이며, 나머지 값들은 모두 on과 같은 로컬 동기화 수준을 제공한다. off가 아닌 모든 모드는 로컬에서 WAL이 디스크에 flush될 때까지 기다린다.
off로 두면 대기가 전혀 없으므로 클라이언트가 성공 응답을 받은 시점과 트랜잭션이 crash에 안전해지는 시점 사이에 지연이 생길 수 있다(최대 wal_writer_delay의 3배). 서버가 crash하면 commit됐다고 보고된 최근 트랜잭션 일부가 사라질 수 있지만, fsync를 끄는 것과 달리 데이터 불일치 위험은 없다 — 해당 트랜잭션들이 깔끔하게 취소된 것과 같은 상태가 된다. 따라서 트랜잭션 내구성의 확실한 보장보다 성능이 중요한 워크로드에서 유용한 대안이 된다.
synchronous_standby_names가 비어 있지 않으면 이 파라미터는 synchronous replication에서 standby의 확인 수준도 함께 제어한다. remote_apply는 standby가 commit 레코드를 적용해 쿼리에서 보이게 될 때까지(replay를 기다리므로 commit 지연이 가장 크다), on은 standby가 durable storage에 flush할 때까지, remote_write는 standby의 파일시스템에 write할 때까지 기다린다. local은 replication 확인 없이 로컬 flush만 기다린다.
이 파라미터는 언제든 바꿀 수 있고 각 트랜잭션에는 commit 시점의 값이 적용된다. 그래서 기본은 동기 commit으로 두고 특정 트랜잭션만 SET LOCAL synchronous_commit TO OFF로 비동기 처리하는 혼용이 가능하며, 실제로도 유용한 패턴이다.
off를 적용하면 fsync를 건드리지 않고도 commit 대기 시간을 크게 줄일 수 있다. 전역 off는 장애 시 몇 초 분량의 commit 유실을 허용할 수 있는지 명확히 정한 뒤에만 고려한다.출처: PostgreSQL 18 문서