본문으로 건너뛰기
0
r/jeffnews HN 약 5분

OCI에서 PostgreSQL HA 구성할 때, 페일오버 테스트는 통과하는데 프로덕션에서 깨지는 이유

devops

요약

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

기사 전체 정리

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 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에 그대로 적용하면 조용히 깨지는 지점. 문제를 찾는 게 고치는 것보다 오래 걸린다는 게 핵심.

댓글

댓글

댓글을 불러오는 중...

devops

살면서 몰랐던 셸 트릭 모음 — 터미널에서 Backspace 꾹 누르기 이제 그만

대부분의 개발자가 ls, cd, grep 이후로 터미널 학습을 멈추는데, 셸에는 1989년부터 존재하던 생산성 트릭들이 가득함. POSIX 범용 단축키부터 Bash/Zsh 전용 기능까지, 하루 하나씩 익히면 터미널 생활이 완전히 달라짐.

devops

Wine 11, 드디어 커널 수준에서 Windows 동기화 재설계 — FPS 678% 상승 레전드

Wine 11이 출시됐는데 이거 그냥 버전업이 아님. **NTSYNC**라는 커널 레벨 동기화 드라이버가 탑재되면서 일부 게임 FPS가 최대 678% 폭등했고, **WoW64** 아키텍처도 완성돼서 32비트 앱 실행에 더 이상 삽질 안 해도 됨. Proton이랑 Steam Deck도 혜택 받는 구조라 Linux 게이밍 역사상 손꼽히는 업데이트임.

devops

NixOS 찬양글 - 이게 바로 OS가 나아가야 할 방향 아님?

NixOS 유저가 왜 NixOS에 진심인지 열변을 토하는 글임. 핵심은 NixOS 자체보다 **Nix 패키지 매니저**의 선언적·재현 가능한 철학에 있고, LLM 코딩 에이전트 시대에 특히 더 찰떡이라고 함. Docker보다 낫다는 주장도 ㄹㅇ 공감 포인트.

devops

10GbE DAC 케이블의 EEPROM을 조작해서 25Gbps를 뽑아낸 이야기

10GbE DAC 케이블의 SFP EEPROM에 저장된 속도 메타데이터를 I2C로 수정하여 25Gbps 링크를 성공시킨 홈랩 해킹기. 실측 9.4Gbps에서 22.8Gbps로 점프. 모든 케이블이 되는 건 아님.

devops

Cloudflare Workers 위에서 터미널 AI 코딩 에이전트를 통째로 돌리는 프로젝트

ghostty-web 터미널 UI + Durable Object + SQLite + Dynamic Worker Loader를 결합해 Cloudflare Workers에서 완전한 AI 코딩 에이전트 런타임을 구현한 Show HN 프로젝트. 세션별 파일시스템, 코드 실행 샌드박스, Worker 퍼블리싱, cron job까지 지원한다.