---
title: "OCI에서 PostgreSQL HA 구성할 때, 페일오버 테스트는 통과하는데 프로덕션에서 깨지는 이유"
published: 2026-03-24T23:53:01.000Z
canonical: https://jeff.news/article/981
---
# OCI에서 PostgreSQL HA 구성할 때, 페일오버 테스트는 통과하는데 프로덕션에서 깨지는 이유

OCI에서 PostgreSQL HA 클러스터의 VIP가 페일오버 시 자동으로 이동하지 않는 문제를 다룬다. AWS/Azure와 달리 OCI는 VIP가 VNIC에 명시적으로 바인딩되어 있어 OCI API 호출이 필요하며, 이를 해결하는 두 가지 프로덕션 검증된 방법(HAProxy vs OCI API 콜백)을 제시한다.

- 시나리오: Patroni 클러스터가 새 프라이머리를 승격시킴. `patronictl list`는 정상. **그런데 앱은 여전히 죽은 옛 노드에 트래픽을 보내고 있음**. OCI의 VIP(Virtual IP) 문제임

- AWS에서는 secondary private IP가 서브넷 내 인스턴스 간에 자유롭게 이동함. Azure도 NIC IP 설정만 업데이트하면 됨. 근데 **OCI는 다름**. VIP(secondary private IP)가 특정 인스턴스의 VNIC에 명시적으로 바인딩되어 있어서, 자동으로 따라오지 않음

## 왜 이게 무서운가

- 페일오버 일어나면 새 노드가 OS 레벨에서 `ip addr add`로 VIP를 올림. 같은 호스트에서 ping하면 됨. **하지만 OCI 네트워킹 패브릭은 여전히 옛 VNIC으로 패킷을 라우팅함**. OS에서 IP가 올라와 있다는 건 OCI한테 아무 의미가 없음

- 옛 노드가 완전히 죽었으면 앱에서 타임아웃이 뜸. 더 나쁜 경우: 옛 노드가 레플리카로 강등되어 살아 있으면, 앱이 **정상 연결은 되지만 모든 쓰기에서 에러** 발생. 클러스터 상태만 보면 전부 초록불인데 앱 관점에서는 장애임

> [!WARNING]
> 이 문제가 위험한 이유는 테스트에서 안 잡힌다는 것. `patronictl list`만 확인하면 정상으로 보이고, 앱 연결까지 확인하는 테스트를 하지 않으면 프로덕션에서야 발견됨.

## 해법 1: HAProxy + 헬스체크 (VIP를 아예 안 쓰기)

- HAProxy를 앱과 PostgreSQL 사이에 놓고, Patroni REST API로 헬스체크:
  - `GET /primary` → 현재 프라이머리에서만 HTTP 200
  - `GET /replica` → 레플리카에서만 HTTP 200
- 페일오버 시 HAProxy의 다음 헬스체크 사이클에서 자동 감지. VIP 이동도 OCI API 호출도 필요 없음
- 읽기/쓰기 분리도 공짜로 얻을 수 있음 (프라이머리/레플리카용 리스너 분리)
- **주의점**: HAProxy 자체가 SPOF가 되므로 Keepalived나 OCI NLB로 이중화 필수. 헬스체크 `inter 3s`, `fall 3` 설정이면 약 9초 만에 장애 노드 제거

## 해법 2: Patroni 콜백 + OCI API (VIP 유지)

- 앱 커넥션 스트링이 이미 VIP에 하드코딩되어 있거나, 네트워크 보안 모델상 프록시를 못 쓰는 경우
- Patroni가 새 프라이머리 승격 시 콜백 스크립트를 실행해서:
  1. **OCI 컨트롤 플레인**: `oci network vnic assign-private-ip --unassign-if-already-assigned`로 VIP를 새 VNIC에 재할당
  2. **OS 레벨**: `ip addr add`로 인터페이스에 IP 추가 + gratuitous ARP 전송
- 두 단계 모두 해야 함. 하나라도 빠지면 다시 무음 장애
- **필수 사전 작업**: 모든 노드에 OCI CLI 설치, 인스턴스 프린시펄 인증 설정 (동적 그룹 + IAM 정책), 각 노드 VNIC OCID 확보, arping 유틸리티 설치

## 교훈

- OS 레벨 IP만으로는 부족함. OCI API 호출 없이 `ip addr add`만 하면, 같은 호스트에서는 되지만 다른 호스트에서 트래픽이 안 옴
- OCI API 권한은 첫 페일오버 드릴 전에 반드시 수동 테스트할 것
- 콜백 스크립트는 타임스탬프, 액션, 롤, VNIC ID, API 응답 전부 로깅할 것 — 새벽 2시에 고마울 것임
- OCI API가 느리거나 일시 불가할 때를 대비해 지수 백오프 리트라이 로직 추가 권장

## 핵심 포인트

- OCI에서는 VIP가 VNIC에 명시적 바인딩되어 자동 이동 안 됨
- OS 레벨 ip addr add만으로는 부족 — OCI 컨트롤 플레인 API 호출 필수
- 해법 1: HAProxy + Patroni REST API 헬스체크로 VIP 우회
- 해법 2: Patroni 콜백에서 OCI CLI로 VIP 재할당
- 클러스터 상태가 정상으로 보여도 앱 연결까지 테스트해야 함

## 인사이트

AWS/Azure 기반 HA 가이드를 OCI에 그대로 적용하면 조용히 깨지는 지점. 문제를 찾는 게 고치는 것보다 오래 걸린다는 게 핵심.
