Part VII. 장애 시나리오 실측
이 Part에서는 1.4의 pg-auto-failover-lab에서 직접 장애를 일으켜 기록한 결과를 다룹니다. primary, secondary, monitor를 하나씩 종료합니다. 네트워크를 끊고 두 노드를 연달아 잃는 상황도 시험합니다. 마지막으로 failover 대기 시간을 줄였을 때 달라지는 점을 측정합니다. 모든 수치의 원본 로그는 저장소의 docs/pg-auto-failover-lab-measurements.md에 있습니다.
측정 환경
- Apple Silicon macOS, Docker 28.3.3, Compose v5.0.1, Docker VM 2 vCPU 12 GB
postgres:17이미지(PostgreSQL 17.11) + PGDGpg-auto-failover-cli2.2-4.pgdg13+1- monitor 1대, node1과 node2(선택 사항으로 node3), 측정용 app 컨테이너. 고정 IP 172.28.0.0/24
- 모든 GUC는 기본값. 변경한 경우에만 본문에 적었습니다.
- 로그 시각은 컨테이너 기준 UTC입니다.
측정 도구
| 스크립트 | 하는 일 |
|---|---|
scripts/writer.sh | multi-host URI(target_session_attrs=read-write, connect_timeout=2)로 0.2초마다 INSERT 1건. 시각, 성공 여부, 소요 ms, 접속한 서버 기록 |
scripts/dualcheck.sh | 0.5초마다 node1, node2에 각각 직접 접속해 synchronous_commit = local INSERT 시도 |
scripts/wait-state.sh | 노드의 reported state와 assigned state가 모두 지정한 값이 될 때까지 걸린 시간 |
scripts/partition.sh | 노드 안에 blackhole route를 추가해 특정 상대 IP만 차단 |
이 Part에서 "쓰기 공백"은 writer.sh 기록에 연속으로 나타난 두 성공 INSERT의 시작 시각 간격 중 가장 긴 값입니다. 장애 시각은 docker kill이나 차단 직전에 monitor 컨테이너에서 기록한 시각입니다.
docker compose exec -T app bash /lab/scripts/writer.sh 80 > writer.log &
docker compose exec -T monitor date -u +"kill at %T.%3N UTC"
docker kill pgaf-lab-node2-1
./scripts/wait-state.sh node1 wait_primary 120
경고
여기 나온 초 단위 값은 기본 설정의 작동 순서를 보여 주는 자료입니다. SLA에 그대로 적용하면 안 됩니다. keeper의 1초 주기 보고와 5초 health check 주기가 오차에 영향을 줍니다. writer의 0.2초 재시도 간격과 Docker 네트워크 이벤트도 각각 몇 초의 오차를 만듭니다. 운영 환경에서는 같은 방식으로 직접 측정해야 합니다.
결과 요약
| 시나리오 | 쓰기 공백 | 새 primary 쓰기 가능 | 문서 |
|---|---|---|---|
| primary kill, 2노드 | 51.2초 (run1 50.3초) | kill 후 51.3초 | 7.1 |
| primary kill, 3노드 | 54.1초 | kill 후 54.2초 | 7.1 |
| secondary kill, 2노드 | INSERT 1건 19.9초 대기 | 해당 없음 | 7.2 |
| monitor 중지 | 0초 (40초 동안 실패 0건) | 해당 없음 | 7.3 |
| monitor 중지 중 primary kill | monitor 복구 전까지 승격 없음 | monitor 재시작 후 46.3초 | 7.3 |
| primary 네트워크 완전 고립 | 54.9초 | 분리 후 54.6초 | 7.4 |
| primary 비대칭 분리, 기본 GUC | 동시 쓰기 0 | 분리 후 54.3초 | 7.4 |
| 2노드 연쇄 장애 | secondary 자동 승격 없음 | 옛 primary 재기동 후 | 7.5 |
| primary kill, GUC 10s/15s | 26.4초 | kill 후 26.2초 | 7.6 |
| 비대칭 분리, GUC 10s/15s | 두 노드 동시 쓰기 11.4초 | 분리 후 38.8초 | 7.6 |
문서
- 7.1 primary 장애: 50초의 구성, stop_replication의 쓰기 차단, 3노드 report_lsn
- 7.2 secondary 장애: 동기 커밋 대기와 wait_primary 전환
- 7.3 monitor 장애: 데이터 경로와 control plane의 분리
- 7.4 네트워크 분리: 고립된 primary의 자기 강등
- 7.5 연쇄 장애와 2노드 한계: wait_primary 이후 승격 거부
- 7.6 failover 시간 조정: 대기를 줄이면 생기는 동시 쓰기 구간