존(Zone) 장애에도 멈추지 않는 검색 클러스터 설계
분산 시스템에서 가용 영역(Availability Zone) 장애는 언제든 발생할 수 있는 현실적인 위협이다. 특히 검색 클러스터는 쿼리 응답과 데이터 수집(Ingestion)이 동시에 이뤄지는 구조이기 때문에, 한 존이 내려가면 단순한 성능 저하를 넘어 서비스 전체가 멈추는 사태로 이어질 수 있다. Uber는 OpenSearch 클러스터를 존 장애에 대응할 수 있도록 설계한 방식을 공개했으며, 이는 대규모 검색 인프라를 운영하는 팀에게 실질적인 참고 사례가 된다.
OpenSearch 샤드 할당 전략의 핵심
OpenSearch는 기본적으로 샤드(Shard) 단위로 데이터를 분산 저장한다. 고가용성을 위해서는 프라이머리 샤드와 레플리카 샤드가 서로 다른 존에 배치되어야 하며, OpenSearch의 내장 샤드 할당 인식(Shard Allocation Awareness) 기능이 이를 지원한다.
# OpenSearch 클러스터 설정 예시
cluster.routing.allocation.awareness.attributes: zone
cluster.routing.allocation.awareness.force.zone.values: zone-a,zone-b,zone-c
위 설정을 통해 OpenSearch는 동일한 샤드의 프라이머리와 레플리카가 같은 존에 놓이지 않도록 강제한다. 특정 존이 장애가 발생하더라도 다른 존의 레플리카 샤드가 쿼리를 처리할 수 있어 서비스 연속성이 보장된다. 단, 이 설정만으로는 인프라 레벨의 격리가 완전히 보장되지 않기 때문에 Uber는 한 단계 더 나아갔다.
Odin 기반 격리 그룹(Isolation Group) 시스템
Uber는 자체 컨테이너 오케스트레이션 플랫폼인 Odin 위에서 동작하는 격리 그룹(Isolation Group) 시스템을 OpenSearch와 연계했다. 격리 그룹은 특정 존에 속한 노드들을 논리적으로 묶어 관리하는 단위로, 존 장애 시 해당 그룹 내 노드들이 클러스터에서 자동으로 분리되고 나머지 존의 노드들이 역할을 이어받는 구조다.
이 방식의 핵심은 샤드 배치 전략과 인프라 격리를 연계한다는 점이다. OpenSearch 레벨에서 샤드를 존 인식으로 분산하고, Odin 레벨에서 물리적 노드 격리를 보장함으로써 두 레이어가 상호 보완적으로 동작한다. 특히 Ingestion 파이프라인도 존 단위로 격리된 엔드포인트를 통해 라우팅되기 때문에, 쿼리뿐만 아니라 데이터 수집 기능까지 존 장애 상황에서 유지할 수 있다.
[존 A] Primary Shard 0, Replica Shard 1 ← Ingestion 라우팅 포함
[존 B] Primary Shard 1, Replica Shard 2
[존 C] Primary Shard 2, Replica Shard 0
존 A가 장애 나더라도 존 B·C만으로 전체 샤드 세트가 구성되어 있어 읽기·쓰기 모두 지속 가능하다.
실무 설계에서 얻을 수 있는 교훈
Uber의 사례는 단순히 OpenSearch 설정 튜닝을 넘어, 검색 클러스터 고가용성 설계의 레이어 분리 관점에서 중요한 시사점을 제공한다.
- 애플리케이션 레이어: 쿼리와 Ingestion 요청을 존 인식 라우팅으로 분산
- 스토리지 레이어: 샤드 할당 인식 설정으로 데이터 복제 위치를 강제
- 인프라 레이어: 오케스트레이션 플랫폼 수준에서 존 단위 격리 그룹 관리
4년차 이상 백엔드 개발자라면 이 구조를 자사 환경에 적용할 때 Kubernetes의 topologySpreadConstraints나 노드 어피니티(Node Affinity) 규칙을 통해 유사한 격리 효과를 달성할 수 있다. 핵심은 "샤드가 어디에 있는가"와 "노드가 어느 존에 속하는가"를 동시에 제어하는 것이다.
정리
- OpenSearch의 샤드 할당 인식 기능으로 프라이머리·레플리카가 다른 존에 배치되도록 강제해야 존 장애 시 서비스 연속성이 보장된다.
- 인프라 오케스트레이션 레벨의 격리 그룹을 함께 구성해야 쿼리와 Ingestion 모두 존 장애에 안전하게 대응할 수 있다.
- 검색 클러스터 고가용성은 단일 레이어 설정이 아닌, 애플리케이션·스토리지·인프라 레이어를 연계한 다층 설계로 달성해야 한다.