- AWS Aurora RDS에서 발생한 경쟁 상태 버그를 실험적으로 확인하고 AWS로부터 원인 확인을 받은 사례
- Hightouch는 이벤트 처리 시스템 확장 중 Aurora의 failover(장애 조치) 과정에서 쓰기 인스턴스 전환이 실패하는 현상을 발견
- 로그 분석 결과, 두 인스턴스가 동시에 쓰기 작업을 수행해 스토리지 계층 충돌과 프로세스 종료가 발생한 것으로 확인
- AWS는 내부 신호 처리 문제로 인해 이전 writer의 강등이 완료되지 않은 상태에서 새 writer가 승격된 것이 원인이라 공식 확인
- 이 사례는 대규모 분산 시스템에서의 동시성 제어 중요성과, 장애 조치 시 쓰기 중단 절차의 필요성을 강조
배경
- 2025년 10월 20일, AWS
us-east-1리전에 DNS 관리 시스템의 경쟁 상태 버그로 인한 장애 발생 - Hightouch는 이로 인해 이벤트 처리 백로그가 급증해 시스템 한계에 도달
- 처리량 확보를 위해 10월 23일 Aurora RDS 인스턴스 업그레이드를 진행했으며, 이 과정에서 새로운 경쟁 상태 버그를 발견
Hightouch 이벤트 시스템 구조
- 이벤트 수집 및 전송을 담당하는 시스템은 Kubernetes, Kafka, Postgres(Aurora) 로 구성
- Postgres는 배치 메타데이터 큐로 사용되며, 초당 50만 건 이벤트를 1초 내 처리
- Aurora PostgreSQL은 쓰기 전용(primary) 인스턴스와 읽기 전용(replica) 인스턴스, 그리고 공유 스토리지 계층으로 구성
업그레이드 계획
- 읽기 인스턴스 추가 → 기존 리더 업그레이드 및 failover 우선순위 부여 → failover 실행 → 기존 writer 업그레이드 → 임시 리더 제거
- 이 절차는 AWS 문서에 명시된 방식이며, 스테이징 환경에서 부하 테스트를 통해 검증된 절차였음
업그레이드 시도와 문제 발생
- 10월 23일 16:39 EDT, failover 실행 후 기존 writer가 다시 primary로 복귀하는 현상 발생
- 두 차례 시도 모두 동일한 결과로, 쓰기 불가 오류(DatabaseError: cannot execute UPDATE in a read-only transaction) 가 일부 서비스에서 발생
- 로그 분석 결과, 두 인스턴스가 동시에 쓰기 작업을 수행하다 스토리지 충돌로 종료된 로그 확인
경쟁 상태의 원인
- Aurora의 failover 과정 중 3단계(기존 writer 강등)와 4단계(새 writer 승격) 사이에 경쟁 상태 발생
- 이로 인해 두 인스턴스가 동시에 쓰기 권한을 가지며 충돌
- 쓰기 트래픽을 제거한 상태에서 재시도하자 failover가 정상 완료되어 경쟁 상태 가설이 입증됨
AWS의 확인 및 대응
- AWS는 내부 검토 후, writer 강등 신호 처리 오류가 원인이며 Hightouch의 설정이나 트래픽 패턴과 무관하다고 확인
- 수정이 로드맵에 포함되어 있으며, 임시 대응책으로 failover 중 쓰기 중단을 권장
최종 조치
- Hightouch는 클러스터 업그레이드를 완료하고,
- 의도적 failover 전 쓰기 중단 절차 추가
- writer 역할 변경 감시 모니터링 강화
- 운영 매뉴얼(playbook) 업데이트를 수행
주요 교훈
- 마이그레이션 중 예기치 않은 상태 전환에 대비한 복구 준비 필요
- 관측성(observability) 확보가 문제 탐지의 핵심
- 분산 시스템 구성요소 간 영향 최소화 설계의 중요성
- 테스트 환경과 실제 운영 환경의 차이를 인식해야 함
원문에 추가 정보 없음