본문으로 건너뛰기

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) + PGDG pg-auto-failover-cli 2.2-4.pgdg13+1
  • monitor 1대, node1과 node2(선택 사항으로 node3), 측정용 app 컨테이너. 고정 IP 172.28.0.0/24
  • 모든 GUC는 기본값. 변경한 경우에만 본문에 적었습니다.
  • 로그 시각은 컨테이너 기준 UTC입니다.

측정 도구​

스크립트하는 일
scripts/writer.shmulti-host URI(target_session_attrs=read-write, connect_timeout=2)로 0.2초마다 INSERT 1건. 시각, 성공 여부, 소요 ms, 접속한 서버 기록
scripts/dualcheck.sh0.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 killmonitor 복구 전까지 승격 없음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/15s26.4초kill 후 26.2초7.6
비대칭 분리, GUC 10s/15s두 노드 동시 쓰기 11.4초분리 후 38.8초7.6

문서​