GN⁺: Netflix의 TimeSeries Data Abstraction Layer 소개
(netflixtechblog.com)- Netflix는 VoD와 Gaming등 다양한 분야로 확장하면서, 대량의 시간 데이터(페타바이트 단위)를 밀리초 단위의 지연 시간으로 저장하고 처리하는 능력이 중요해짐.
- Key-Value 추상화와 Data Gateway 플랫폼을 기반으로 TimeSeries 추상화를 개발하여 다양한 사용 사례에 걸쳐 시간상 이벤트 데이터를 효율적으로 저장 및 쿼리할 수 있는 솔루션 제공
도전 과제
- Netflix에서는 사용자 상호작용, 자산 노출, 복잡한 마이크로서비스 네트워크 활동 등에서 지속적으로 시간 데이터가 생성되고 사용됨.
- 이러한 데이터를 효과적으로 관리하여 사용자 경험과 시스템 신뢰성을 보장하는 것이 중요함.
- 주요 도전 과제:
- 높은 처리량: 초당 최대 1,000만 건의 쓰기를 관리하며 높은 가용성을 유지해야 함.
- 대규모 데이터셋에서의 효율적인 쿼리: 페타바이트 단위의 데이터를 저장하면서 주요 키 읽기 결과를 낮은 밀리초 단위로 반환하고, 여러 보조 속성을 통한 검색과 집계를 지원해야 함.
- 글로벌 읽기 및 쓰기: 전 세계 어디서나 읽기 및 쓰기 작업을 지원하며 조정 가능한 일관성 모델 제공.
- 조정 가능한 구성: 단일 테넌트 또는 다중 테넌트 데이터 저장소에서 데이터셋을 분할할 수 있는 기능 제공.
- 버스트 트래픽 처리: 새로운 콘텐츠 출시나 지역 장애 복구 시 발생하는 트래픽 급증을 관리해야 함.
- 비용 효율성: 장기 보존을 최적화하면서 인프라 비용을 최소화해야 함.
TimeSeries 추상화
- 데이터 분할: 고유한 시간 분할 전략과 이벤트 버킷 접근 방식을 사용하여 버스트 워크로드를 효율적으로 관리하고 쿼리를 간소화함.
- 유연한 저장소: Apache Cassandra 및 Elasticsearch와 같은 다양한 저장소 백엔드와 통합할 수 있도록 설계됨.
- 구성 가능성: 각 데이터셋에 대해 다양한 조정 가능한 옵션을 제공하여 다양한 사용 사례에 적응할 수 있는 유연성 제공.
- 확장성: 수평 및 수직 확장을 지원하여 Netflix의 사용자 기반과 서비스가 확장됨에 따라 증가하는 처리량과 데이터 볼륨을 처리할 수 있음.
- 샤드 인프라: Data Gateway Platform을 활용하여 필요한 접근 및 트래픽 격리를 통해 단일 테넌트 및/또는 다중 테넌트 인프라를 배포할 수 있음.
데이터 모델
- 이벤트 데이터를 캡슐화하여 효율적으로 쿼리할 수 있는 고유한 이벤트 데이터 모델을 따름.
- 이벤트 아이템: 이벤트 아이템은 사용자가 특정 이벤트에 대한 데이터를 저장하는 데 사용하는 키-값 쌍임. 예: {"device_type": "ios"}
- 이벤트: 이벤트는 하나 이상의 이벤트 아이템으로 구성된 구조화된 컬렉션임. 이벤트는 특정 시점에 발생하며 클라이언트에서 생성한 타임스탬프와 이벤트 식별자(UUID 등)로 식별됨. event_time과 event_id의 조합은 이벤트의 고유한 idempotency 키의 일부를 형성하여 사용자가 요청을 안전하게 재시도할 수 있음
- 타임시리즈 ID: time_series_id는 데이터셋의 보존 기간 동안 발생한 하나 이상의 이벤트 모음임. 예를 들어, device_id는 보존 기간 동안 특정 디바이스에서 발생한 모든 이벤트를 저장함. 모든 이벤트는 불변이며 TimeSeries 서비스는 주어진 타임시리즈 ID에 이벤트를 추가하기만 함
- 네임스페이스: 네임스페이스는 타임시리즈 ID와 이벤트 데이터의 모음으로, 전체 TimeSeries 데이터셋을 나타냄. 사용자는 각 유즈케이스에 대해 하나 이상의 네임스페이스를 생성할 수 있음. 추상화는 네임스페이스 수준에서 다양한 조정 가능한 옵션을 적용
API
- WriteEventRecordsSync: 이 엔드포인트는 이벤트 배치를 작성하고 클라이언트에 내구성 확인을 다시 전송함. 이는 사용자가 내구성 보장을 요구하는 경우에 사용됨
- WriteEventRecords: 이것은 위 엔드포인트의 fire-and-forget 버전임. 내구성 확인 없이 이벤트 배치를 대기열에 넣음. 이는 사용자가 처리량을 더 중요하게 여기고 약간의 데이터 손실을 감수할 수 있는 로깅이나 추적과 같은 경우에 사용됨
- ReadEventRecords: 네임스페이스, timeSeriesId, timeInterval, 선택적 eventFilters의 조합이 주어지면 이 엔드포인트는 일치하는 모든 이벤트를 밀리초 단위의 낮은 대기 시간으로 event_time 기준 내림차순으로 반환함
- SearchEventRecords: 검색 기준과 시간 간격이 주어지면 이 엔드포인트는 일치하는 모든 이벤트를 반환함. 이러한 사용 사례는 결과적으로 일관된 읽기에 적합함
- AggregateEventRecords: 검색 기준과 집계 모드(예: DistinctAggregation)가 주어지면 이 엔드포인트는 주어진 시간 간격 내에서 주어진 집계를 수행함. Search 엔드포인트와 유사하게 사용자는 최종 일관성과 잠재적으로 더 높은 대기 시간(초 단위)을 감수할 수 있음
저장소 계층
- TimeSeries의 저장소 계층은 기본 데이터 저장소와 선택적 인덱스 데이터 저장소로 구성됨.
- Apache Cassandra는 높은 처리량 시나리오에서 내구성을 보장하는 데이터 저장소로 선호됨.
- Elasticsearch는 인덱싱을 위한 데이터 저장소로 선호됨.
기본 데이터 저장소
- Apache Cassandra를 활용하여 TimeSeries 사용 사례를 처리함.
- 시간 간격에 따라 데이터를 청크로 분할하는 Temporal Partitioning으로 데이터 관리
- 시간 슬라이스: 보존 기간에 해당하는 Cassandra 테이블로 매핑
- 시간 버킷: 시간 슬라이스 내에서 특정 시간 범위 쿼리 최적화를 위해 데이터 다시 분할
- 이벤트 버킷: 단기간 내 타임 시리즈 대량 쓰기 처리를 위해 시간 버킷을 다시 분할
- 데이터 테이블은 실제 이벤트 데이터를 저장하고, 메타데이터 테이블은 네임스페이스별 시간 슬라이스 구성 정보 저장
인덱스 데이터 저장소
- 비주요 키 속성을 통한 보조 접근 패턴을 지원하기 위해 데이터를 Elasticsearch에 인덱싱함.
- 사용자는 검색 및 집계할 속성 목록을 네임스페이스별로 구성할 수 있음.
제어 플레인
- 데이터 플레인은 읽기/쓰기 작업을, 제어 플레인은 네임스페이스 동작의 모든 측면 구성
- 데이터 플레인은 TimeSeries 제어 스택과 통신하고, 이는 Data Gateway 제어 플레인과 상호 작용함
- 네임스페이스 구성으로 다양한 사항들을 유연하게 조정 가능 (예: 시간 분할, 버퍼링, 일관성, 보존 등)
네임스페이스 구성
- 서비스의 유연성을 보여주는 구성 스니펫을 통해 네임스페이스별로 여러 가지를 조정할 수 있음.
인프라 프로비저닝
- 다양한 매개변수를 고려하여 자동화된 프로비저닝 워크플로를 통해 최적의 설정을 도출함.
- 시스템은 초기 인프라를 프로비저닝한 후 사용자 워크로드에 따라 확장함.
확장성
- 초기 프로비저닝 시 사용량 예측이 제한적이므로 사후 조정 필요
- 수평 확장: TimeSeries 서버 인스턴스는 트래픽 수요에 따라 자동으로 확장 및 축소됨.
- 수직 확장: TimeSeries 서버 인스턴스 또는 저장소 인스턴스를 수직으로 확장하여 더 큰 CPU, RAM 및/또는 연결된 저장소 용량을 얻을 수 있음.
- 디스크 확장: EBS를 연결하여 데이터를 저장할 수 있으며, 디스크 저장소가 특정 임계값에 도달하면 EBS 볼륨을 확장함.
- 데이터 재분할로 과다/과소 분할된 데이터셋 조정
설계 원칙
- 이벤트 멱등성: 모든 변이 엔드포인트에 멱등성을 내장하여 사용자가 요청을 안전하게 재시도할 수 있도록 함.
- SLO 기반 헤징: 다양한 엔드포인트에 대해 서비스 수준 목표(SLO) 타겟을 할당하여 성능을 보장함.
- 부분 반환: 클라이언트가 지연에 민감할 경우 부분 결과 세트를 수락할 수 있음.
- 적응형 페이지네이션: 서비스 계층이 타임 시리즈 데이터셋이 밀집되어 있다고 판단하면 팬아웃 팩터를 동적으로 조정함.
- 제한된 쓰기 창: 데이터가 가능한 빨리 불변 상태가 되도록 하여 최적화를 적용할 수 있음.
- 쓰기 버퍼링: 버스트 워크로드를 처리하기 위해 이벤트를 짧은 기간 동안 병합하여 부하를 고르게 분산함.
- 동적 압축: 데이터가 불변 상태가 되면 읽기 성능을 최적화하기 위해 압축 전략을 사용함.
실제 성능
- 서비스는 낮은 밀리초 단위로 데이터를 기록할 수 있으며, 안정적인 포인트 읽기 지연 시간을 유지함.
Time Series의 Netflix에서의 활용
TimeSeries 추상화는 Netflix의 주요 서비스 전반에서 중요한 역할을 함. 다음은 몇 가지 영향력 있는 사용 사례임
- 추적 및 인사이트: Netflix 내의 모든 앱과 마이크로서비스에서 로그 추적을 수행하여 서비스 간 통신을 이해하고, 이슈 디버깅을 지원하며, 지원 요청에 답변함
- 사용자 상호 작용 추적: 동영상 재생, 검색, 콘텐츠 참여 등 수백만 건의 사용자 상호 작용을 추적하여 Netflix의 추천 알고리즘을 실시간으로 향상시키고 전반적인 사용자 경험을 개선하는 인사이트를 제공함
- 기능 출시 및 성능 분석: 새로운 제품 기능의 출시와 성능을 추적하여 Netflix 엔지니어가 사용자가 기능과 상호 작용하는 방식을 측정할 수 있게 하고, 이는 향후 개선에 대한 데이터 기반 의사 결정을 지원함
- 에셋 임프레션 추적 및 최적화: 에셋 노출을 추적하여 콘텐츠와 에셋이 효율적으로 전달되도록 하는 한편, 최적화를 위한 실시간 피드백을 제공함
- 청구 및 구독 관리: 청구 및 구독 관리와 관련된 과거 데이터를 저장하여 거래 기록의 정확성을 보장하고 고객 서비스 문의를 지원함
향후 개선 사항
사용 사례가 진화하고 추상화를 더욱 비용 효율적으로 만들 필요성이 커짐에 따라 향후 몇 달 동안 서비스를 많이 개선할 계획임. 그 중 일부는 다음과 같음
- 비용 효율성을 위한 계층형 스토리지: 오래되고 덜 액세스되는 데이터를 first byte까지 시간이 더 오래 걸리는 저렴한 객체 스토리지로 이동하는 것을 지원하여 Netflix에 수백만 달러를 절감할 수 있음
- 동적 이벤트 버킷팅: 네임스페이스를 프로비저닝할 때 다소 정적인 구성을 갖는 대신 이벤트가 스트리밍될 때 키를 최적 크기의 파티션으로 실시간 분할하는 것을 지원함. 이 전략은 파티셔닝이 필요하지 않은 time_series_id를 파티셔닝하지 _않음_으로써 읽기 증폭의 전체 비용을 절감한다는 큰 장점이 있음. 또한 Cassandra 4.x에서는 광범위한 파티션의 데이터 하위 집합을 읽는 데 있어 주요 개선 사항이 있어 사전에 전체 데이터 세트를 공격적으로 분할할 필요가 줄어들 수 있음
- 캐싱: 데이터의 불변성을 활용하여 개별 시간 범위에 대해 지능적으로 캐싱함
- 카운트 및 기타 집계: 일부 사용자는 주어진 시간 간격에 대한 모든 이벤트 데이터를 가져오는 대신 이벤트 수에만 관심이 있음
결론
- TimeSeries Abstraction은 Netflix의 온라인 데이터 인프라의 중요한 구성 요소로, 실시간 및 장기 의사 결정을 지원함.
- Netflix가 새로운 분야로 확장함에 따라 TimeSeries Abstraction은 플랫폼의 핵심 요소로 남아 스트리밍 및 그 이상의 가능성을 확장하는데 기여할 것
GN⁺의 의견
- TimeSeries 추상화를 통해 확장성, 유연성, 비용 효율성을 동시에 확보하여 방대한 양의 시계열 데이터를 안정적으로 처리할 수 있는 Netflix의 노하우가 인상 깊음. 특히 시간 기반 파티셔닝, 쓰기 버퍼링, 동적 컴팩션 등 데이터 특성과 접근 패턴에 최적화된 기법들이 눈에 띔
- 단순한 시계열 DB가 아니라 추상화 계층을 통해 Cassandra, Elasticsearch 등 다양한 저장소를 유연하게 활용하고, 워크로드 특성에 맞게 인프라를 프로비저닝하고 운영할 수 있는 제어 체계를 갖춘 것이 효과적으로 보임. 추상화를 통해 사용자는 복잡성을 숨기고 데이터에 집중할 수 있음
- 현재 페타바이트 규모의 데이터를 수용하면서 초당 1500만 이벤트를 처리하는 성능을 보여주고 있어, 고성능 시계열 데이터 파이프라인을 구축하려는 기업에게 귀감이 될 만함. 특히 대규모 서비스를 위해서는 데이터 볼륨과 속도뿐 아니라 비용 측면까지 종합적으로 고려해야 함을 시사
- 추적, 사용자 행동 분석, 청구 관리 등 Netflix 사업의 핵심 영역에서 다양하게 활용되고 있어, 시계열 데이터가 데이터 기반 의사 결정과 서비스 혁신의 원동력임을 알 수 있음. 단순 로깅이 아니라 실시간 추천 등 ML/AI 기반 서비스의 기반이 되고 있음
- 향후 계층화된 스토리지, 동적 파티셔닝, 집계 연산 등 개선 계획을 통해 지속적으로 진화하려는 의지를 엿볼 수 있음. 급변하는 비즈니스 요구에 대응하기 위해서는 이처럼 끊임없는 혁신이 필요할 것으로 보임. 이 과정에서 축적된 노하우가 오픈소스 등을 통해 공유되기를 기대함