0
OCI에서 PostgreSQL HA 구성할 때, 페일오버 테스트는 통과하는데 프로덕션에서 깨지는 이유
devops
요약
기사 전체 정리
OCI에서 PostgreSQL HA 구성할 때, 페일오버 테스트는 통과하는데 프로덕션에서 깨지는 이유
시나리오: 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한테 아무 의미가 없음옛 노드가 완전히 죽었으면 앱에서 타임아웃이 뜸. 더 나쁜 경우: 옛 노드가 레플리카로 강등되어 살아 있으면, 앱이 정상 연결은 되지만 모든 쓰기에서 에러 발생. 클러스터 상태만 보면 전부 초록불인데 앱 관점에서는 장애임
주의
> 이 문제가 위험한 이유는 테스트에서 안 잡힌다는 것. patronictl list만 확인하면 정상으로 보이고, 앱 연결까지 확인하는 테스트를 하지 않으면 프로덕션에서야 발견됨.
해법 1: HAProxy + 헬스체크 (VIP를 아예 안 쓰기)
- HAProxy를 앱과 PostgreSQL 사이에 놓고, Patroni REST API로 헬스체크:
GET /primary→ 현재 프라이머리에서만 HTTP 200GET /replica→ 레플리카에서만 HTTP 200
- 페일오버 시 HAProxy의 다음 헬스체크 사이클에서 자동 감지. VIP 이동도 OCI API 호출도 필요 없음
- 읽기/쓰기 분리도 공짜로 얻을 수 있음 (프라이머리/레플리카용 리스너 분리)
- 주의점: HAProxy 자체가 SPOF가 되므로 Keepalived나 OCI NLB로 이중화 필수. 헬스체크
inter 3s,fall 3설정이면 약 9초 만에 장애 노드 제거
해법 2: Patroni 콜백 + OCI API (VIP 유지)
- 앱 커넥션 스트링이 이미 VIP에 하드코딩되어 있거나, 네트워크 보안 모델상 프록시를 못 쓰는 경우
- Patroni가 새 프라이머리 승격 시 콜백 스크립트를 실행해서:
- OCI 컨트롤 플레인:
oci network vnic assign-private-ip --unassign-if-already-assigned로 VIP를 새 VNIC에 재할당 - OS 레벨:
ip addr add로 인터페이스에 IP 추가 + gratuitous ARP 전송
- OCI 컨트롤 플레인:
- 두 단계 모두 해야 함. 하나라도 빠지면 다시 무음 장애
- 필수 사전 작업: 모든 노드에 OCI CLI 설치, 인스턴스 프린시펄 인증 설정 (동적 그룹 + IAM 정책), 각 노드 VNIC OCID 확보, arping 유틸리티 설치
교훈
- OS 레벨 IP만으로는 부족함. OCI API 호출 없이
ip addr add만 하면, 같은 호스트에서는 되지만 다른 호스트에서 트래픽이 안 옴 - OCI API 권한은 첫 페일오버 드릴 전에 반드시 수동 테스트할 것
- 콜백 스크립트는 타임스탬프, 액션, 롤, VNIC ID, API 응답 전부 로깅할 것 — 새벽 2시에 고마울 것임
- OCI API가 느리거나 일시 불가할 때를 대비해 지수 백오프 리트라이 로직 추가 권장
댓글
댓글
댓글을 불러오는 중...