load-balancing

4 개의 포스트

You’ve Got (Too Much) Mail: Behind the Scenes of the 3/25/26 Voice Outage (새 탭에서 열림)

2024년 3월 25일, Discord는 일상적인 인프라 설정 변경 중 발생한 실수로 인해 세션 관리 서버의 17%가 동시에 종료되는 대규모 장애를 겪었습니다. 이 사건은 실시간 서비스의 핵심인 세션 시스템의 붕괴가 어떻게 하위 시스템으로 전이되어 음성 및 영상 통화 라우팅 기능을 마비시키는지 보여주는 전형적인 연쇄 장애(Cascading Failure) 사례였습니다. Discord 엔지니어링 팀은 이번 장애를 통해 분산 시스템에서 갑작스러운 부하가 유발하는 병목 현상을 정밀 분석하고, 시스템의 복원력을 높이기 위한 인프라 개선의 계기로 삼았습니다. ### 설정 오류로 인한 세션 관리 서버의 대량 종료 * **장애 발생:** PDT 기준 3월 25일 12:13부터 약 3시간 동안 서비스 성능 저하가 지속되었으며, 사용자들은 통화 연결 시 "Awaiting Endpoint" 메시지와 함께 연결 실패를 경험했습니다. * **근본 원인:** 인프라 설정 업데이트 과정에서 발생한 구성 오류로 인해, Discord 실시간 인프라의 핵심인 세션 관리 서버 중 17%가 일시에 셧다운되었습니다. * **세션의 중요성:** Discord의 세션은 모든 연결된 장치와 서버 간의 상태를 유지하는 '심장 박동'과 같으며, 앱 내에서 사용자가 보고 듣는 거의 모든 활동을 조율하는 필수 구성 요소입니다. ### 하위 시스템으로 전이된 연쇄 장애의 메커니즘 * **병목 현상의 전이:** 대규모 세션 손실은 단순한 서버 중단에 그치지 않고, 하위 시스템인 음성/영상 통화 라우팅 서비스로 막대한 부하를 전달했습니다. * **라우팅 서비스 마비:** 전 세계 사용자들을 적절한 통화 서버로 연결해주는 서비스가 갑작스러운 재연결 요청과 상태 복구 부하를 견디지 못하고 과부하 상태에 빠졌습니다. * **분산 시스템의 취약성:** 분산 환경에서 발생하는 급격한 부하(Sudden load)는 기존의 알려진 병목 지점뿐만 아니라 예상치 못한 새로운 지점의 결함을 찾아내며 시스템 전반을 타격합니다. ### 장애 분석을 통한 시스템 복원력 강화 * **심층 분석:** 사고 이후 팀은 시스템이 연쇄적인 부하 상황에서 왜 제대로 대응하지 못했는지 분석하고, 분산 시스템의 한계를 시험하는 계기로 활용했습니다. * **인프라 레벨업:** 겉보기에 사소한 설정 변경이 여러 단계 떨어진 서비스에까지 영향을 미칠 수 있음을 인지하고, 이를 방어하기 위한 인프라 고도화 작업을 진행 중입니다. * **경험의 자산화:** 장애 상황에서의 실제 데이터를 바탕으로 병목 현상을 해결함으로써, 향후 유사한 대규모 부하 발생 시에도 시스템이 견딜 수 있는 내성을 확보했습니다. 분산 시스템을 운영하는 엔지니어라면 사소한 설정 변경이 가져올 수 있는 연쇄 효과를 항상 경계해야 합니다. 갑작스러운 대량 부하 상황에서도 핵심 기능이 유지될 수 있도록 시스템 간의 격리를 강화하고, 장애 발생 시 부하를 제어할 수 있는 서킷 브레이커나 속도 제한(Rate Limiting) 같은 방어 기제를 인프라 전반에 걸쳐 점검하는 것이 중요합니다.

무작위 작업 도착 (새 탭에서 열림)

구글 리서치(Google Research)의 Ravi Kumar와 Manish Purohit는 대규모 클러스터 관리 시스템에서 필수적인 부하 분산(Load balancing) 문제를 최신 온라인 알고리즘 이론으로 분석했습니다. 연구팀은 작업이 무작위 순서로 도착하는 환경을 가정하고, 결정적(deterministic) 온라인 알고리즘이 가질 수 있는 성능의 이론적 한계를 새롭게 정립했습니다. 이 연구는 기존의 최악 조건 분석을 넘어 현실적인 무작위 작업 흐름에서 알고리즘이 달성할 수 있는 최선의 성능이 $\sqrt{\log n}$ 수준임을 입증하며 이론적 간극을 메웠습니다. ### 트리 균형 게임을 통한 부하 분산 모델링 * **모델의 정의**: 부하 분산 문제를 기하학적인 '트리 균형 게임'으로 치환하여 설명합니다. 트리 내의 노드는 서버(머신)를, 노드를 연결하는 간선(edge)은 처리해야 할 작업(job)을 의미합니다. * **목표와 규칙**: 간선이 하나씩 제시될 때마다 알고리즘은 이를 두 끝점 중 하나로 방향을 정해야(orient) 합니다. 최종 목표는 특정 노드로 향하는 간선의 수(내차수, indegree)의 최댓값을 최소화하는 것입니다. * **경쟁 분석(Competitive Analysis)**: 미래의 모든 정보를 알고 있는 오프라인 최적 알고리즘의 결과와 온라인 알고리즘의 결과를 비교하여 알고리즘의 효율성을 측정합니다. ### 결정적 알고리즘의 전통적 한계 * **최악의 시나리오**: 1990년대부터 알려진 바에 따르면, 적대적인 공격자(adversary)가 작업 순서를 정할 경우 어떤 결정적 알고리즘도 최대 부하를 $\log n$($n$은 노드 수) 미만으로 유지할 수 없습니다. * **정보의 비대칭성**: 공격자는 알고리즘이 어떤 선택을 해도 부하가 높아질 수밖에 없는 순서로 간선을 배치하며, 이는 시스템 성능의 하한선을 결정하는 근거가 됩니다. * **그리디 알고리즘의 한계**: 단순히 부하가 적은 쪽으로 작업을 배정하는 탐욕적(Greedy) 방식은 작업 도착 순서에 따라 성능이 크게 좌우되는 취약점을 가집니다. ### 무작위 도착 순서에서의 새로운 이론적 하한선 * **무작위 순서 모델**: 모든 작업의 순열이 동일한 확률로 발생하는 환경을 가정합니다. 이는 실제 데이터 센터의 워크로드와 더 유사한 모델입니다. * **성능 격차의 발견**: 이전 연구에서는 무작위 순서일 때 그리디 알고리즘이 $\log n$보다 약간 나은 성능을 보인다는 점을 밝혔으나, 다른 정교한 알고리즘이 얼마나 더 잘할 수 있는지는 미지로 남아있었습니다. * **재귀적 구조를 통한 증명**: 본 연구는 재귀적으로 구성된 새로운 사례를 통해, 무작위 순서에서도 결정적 알고리즘이 $\sqrt{\log n}$보다 나은 경쟁비를 보장할 수 없음을 증명했습니다. 이는 기존 예측보다 하한선을 지수적으로 높인 결과입니다. 이 연구는 구글의 보그(Borg)와 같은 대규모 클러스터 관리 시스템에서 자원 할당 효율성을 높이기 위한 이론적 토대를 제공합니다. 작업이 무작위로 유입되는 실제 환경에서도 알고리즘이 극복할 수 없는 수학적 한계가 존재함을 이해함으로써, 더욱 견고하고 현실적인 스케줄링 전략을 설계하는 지침으로 활용될 수 있습니다.

Achieving relentless Kafka reliability at scale with the Streaming Platform (새 탭에서 열림)

데이터독(Datadog)은 매일 수백 조 건의 이벤트를 처리하기 위해 수천 개의 토픽과 수백 개의 아파치 카프카(Apache Kafka) 클러스터를 운영하고 있습니다. 기존의 정적인 카프카 설정으로는 대규모 환경에서 발생하는 하드웨어 장애나 트래픽 변동에 유연하게 대응하기 어렵기 때문에, 데이터독은 카프카 인프라를 추상화한 '스트리밍 플랫폼(Streaming Platform)'이라는 제어 계층을 구축했습니다. 이를 통해 애플리케이션의 재설정이나 배포 없이도 실시간으로 트래픽을 리디렉션하고 클러스터를 관리함으로써 시스템의 복원력과 확장성을 극대화했습니다. ### 스트림(Streams)을 통한 파이프라인 복원력 강화 - **논리적 추상화**: 물리적인 카프카 토픽 대신 '스트림'이라는 추상화된 단위를 사용합니다. 스트림은 여러 클러스터와 가용 영역(AZ)에 걸쳐 존재할 수 있으며, 생산자와 소비자는 실제 카프카 토폴로지를 알 필요 없이 안정적인 식별자를 통해 데이터에 접근합니다. - **인프라 디커플링**: 애플리케이션이 특정 카프카 리소스에 종속되지 않기 때문에, 인프라 구성을 실시간으로 변경하거나 트래픽을 새로운 토픽/클러스터로 원활하게 재라우팅할 수 있습니다. ### 실시간 트래픽 페일오버 및 리밸런싱 - **무중단 전환**: 특정 클러스터에 문제가 발생하면 제어 계층이 즉시 새로운 토픽을 생성하고 트래픽을 리디렉션합니다. 생산자는 즉시 새 토픽으로 데이터를 보내고, 소비자는 기존 토픽의 잔량을 처리한 후 새 토픽으로 넘어가는 방식을 통해 데이터 유실 없이 전환이 이루어집니다. - **유연한 운영**: 장애 대응뿐만 아니라 클러스터 폐기, 파티션 수 조정, 부하 분산 등의 작업을 애플리케이션 수정 없이 수 초 내에 수행할 수 있습니다. ### 대규모 환경에 최적화된 Assigner와 소비자 모델 - **자체 코디네이터 개발**: 카프카의 기본 그룹 코디네이터는 세션 타임아웃에 의존하여 반응이 느리다는 단점이 있습니다. 이를 대체하기 위해 개발된 'Assigner'는 클러스터 상태와 CPU 부하 등의 메트릭을 실시간으로 모니터링하여 수 초 내에 워크로드를 재분배합니다. - **병렬 처리 극대화**: 엄격한 순서 보장보다는 '최소 한 번(at-least-once)' 전달 모델을 채택하고 소비 단계에서의 순서 제약을 완화했습니다. 이를 통해 대규모 병렬 처리를 구현하고, 순서 보장이 필요한 경우 이벤트 저장소 하단에서 처리하도록 설계했습니다. ### Head-of-line Blocking 문제 해결 및 고급 커밋 로그 - **스트림 레인(Stream Lanes)**: 서비스 품질(QoS)에 따라 트래픽을 독립적인 '레인'으로 분리합니다. 우선순위가 높은 실시간 데이터가 일시적인 트래픽 급증이나 낮은 우선순위 데이터로 인해 지연되는 것을 방지합니다. - **Dead-letter Queue(DLQ)**: 특정 이벤트(Poison Pill)가 처리를 방해할 경우 이를 별도의 DLQ로 격리하여 파티션 전체가 멈추는 현상을 방지합니다. - **메타데이터 기반 커밋**: 카프카의 단일 포인터 오프셋 커밋 방식에서 벗어나, 커밋 메타데이터 공간을 활용해 파티션 내 여러 오프셋 범위를 동시에 추적합니다. 이를 통해 소비자가 이전 데이터를 재처리하는 동안에도 최신 트래픽을 동시에 처리할 수 있는 유연성을 확보했습니다. 카프카를 대규모로 운영할 때는 인프라를 고정된 자산이 아닌 '교체 가능한 소모품'으로 취급하는 제어 계층이 필수적입니다. 데이터독의 사례처럼 물리적 인프라와 논리적 데이터 흐름을 분리하는 추상화 계층을 구축함으로써, 운영 복잡성을 낮추고 대규모 장애 상황에서도 시스템의 연속성을 보장할 수 있습니다.

Husky: Exactly-once ingestion and multi-tenancy at scale (새 탭에서 열림)

Datadog의 3세대 이벤트 저장소인 Husky는 대규모 멀티테넌트 환경에서 데이터 중복 없는 '정확히 한 번(Exactly-once)'의 인입을 보장하기 위해 데이터 지역성(Locality) 기반의 라우팅 아키텍처를 도입했습니다. 스캔과 집계에 최적화된 Husky의 특성상 고성능 포인트 조회가 어렵다는 점을 극복하기 위해, 결정론적 샤딩을 통해 중복 제거의 범위를 샤드 단위로 한정하여 시스템 복잡도를 낮췄습니다. 이를 통해 테넌트별 데이터 격리 비용을 최소화하고, 가변적인 트래픽 상황에서도 효율적으로 스토리지와 컴퓨팅 자원을 확장할 수 있는 기반을 마련했습니다. ## 샤드 라우터를 통한 데이터 지역성 확보 * **결정론적 매핑**: 업스트림 서비스인 'Shard Router'를 사용하여 이벤트의 ID와 타임스탬프를 기반으로 특정 샤드(파티션 그룹)에 이벤트를 할당합니다. * **샤드 할당 전략**: 각 테넌트에게 고정된 리스트의 샤드를 할당하고, 해당 리스트 내에서 이벤트 ID를 해싱하여 샤드를 선택함으로써 무작위 라우팅을 방지합니다. * **테넌트 격리**: 개별 워커 노드가 노출되는 테넌트와 인덱스의 수를 최소화하여, 시스템 전체의 복잡도를 관리 가능한 수준으로 유지합니다. ## 데이터 지역성 도입의 기술적 이점 * **중복 제거(Deduplication) 효율화**: 동일한 ID를 가진 이벤트는 항상 같은 샤드로 라우팅되므로, 전체 시스템이 아닌 샤드 내부에서만 중복 여부를 확인하면 됩니다. 이벤트 ID 세트가 메모리에 수용 가능한 크기로 유지되어 처리 속도가 비약적으로 향상됩니다. * **스토리지 비용 절감**: Husky는 테넌트별로 데이터를 전용 테이블에 격리하며 파일 단위로 저장합니다. 지역성을 통해 워커당 처리하는 테넌트 수를 제한하면 생성되는 파일 수가 줄어들어, 클라우드 스토리지 비용과 후속 컴팩션(Compaction) 작업의 부하를 동시에 낮출 수 있습니다. * **성능 최적화**: 워커 노드가 처리해야 할 논리적 네임스페이스의 카디널리티(Cardinality)가 낮아짐에 따라 쓰기 성능이 개선되고 리소스 효율성이 높아집니다. ## 동적 환경에서의 라우팅 도전 과제 * **할당 변경 관리**: 특정 테넌트의 트래픽이 갑자기 수십 배 증가하거나 전체 샤드 수가 변경될 때, 기존의 결정론적 규칙을 유지하면서도 유연하게 샤드 배정을 변경해야 합니다. * **분산 노드 간 합의**: 모든 샤드 라우터 노드가 동일한 라우팅 규칙을 공유해야 중복 데이터 유입을 방지할 수 있으며, 이를 위해 노드 간의 일관성 있는 결정 메커니즘이 필수적입니다. * **부하 분산(Load Balancing)**: 모든 샤드에 인입 트래픽이 균등하게 배분되도록 설계하여 특정 워커 노드에 부하가 집중되는 '핫스팟' 현상을 방지해야 합니다. 대규모 분산 시스템에서 데이터 일관성을 유지하며 비용을 최적화하려면, 무상태(Stateless) 라우팅보다는 데이터의 특성에 맞춘 지역성 설계를 우선 고려해야 합니다. 특히 테넌트 수가 많은 SaaS 환경에서는 워커가 처리하는 테넌트의 카디널리티를 물리적으로 제한하는 것이 스토리지 관리 비용을 결정짓는 핵심 요소가 됩니다.