gremlin

1 개의 포스트

netflix

넷플릭스의 고처리량 그래프 추상화: 1부 (새 탭에서 열림)

넷플릭스의 Graph Abstraction은 분석 중심의 OLAP가 아니라, 밀리초 수준의 지연 시간과 초당 수백만 건의 처리량이 필요한 OLTP 그래프 서비스를 위해 설계됐다. 이 시스템은 약 650TB 규모의 그래프 데이터를 초당 약 1,000만 건의 연산으로 처리하며, KV·TimeSeries·EVCache 등 기존 데이터 추상화를 조합해 실시간성과 비용 효율을 확보한다. 강한 타입의 스키마와 사전 정의된 관계를 활용해 데이터 품질, 쿼리 계획, 탐색 중복 제거를 개선하는 것이 핵심이다. ## OLAP와 OLTP 그래프의 차이 - **OLAP 그래프** - 대규모 그래프를 대상으로 개방형·알고리즘 중심의 분석을 수행한다. - RDF/SPARQL, Property Graph/Gremlin·openCypher, SQL 등을 사용한다. - 낮은 지연 시간이나 높은 처리량보다 심층 분석과 유연성이 중요하다. - **OLTP 그래프** - 초당 수백만 건의 연산과 밀리초 단위의 탐색 응답을 요구한다. - 높은 성능을 위해 최종적 일관성(eventual consistency)을 허용할 수 있다. - 시작 노드 지정, 최대 탐색 깊이 제한 등 쿼리 복잡도 제약을 둔다. - 스트리밍 처리나 사용자 경험과 직접 연결되므로 높은 글로벌 가용성이 필요하다. - Netflix Graph Abstraction은 이러한 OLTP 요구를 대상으로 만들어졌다. ## 넷플릭스의 주요 활용 사례 - **Real-Time Distributed Graph(RDG)** - 넷플릭스 생태계의 엔터티와 상호작용 사이의 동적 관계를 표현한다. - 기존 RDG 구현이 Graph Abstraction에 통합됐다. - **Social Graph** - Netflix Gaming 내부의 소셜 연결을 모델링한다. - 사용자 참여도 향상에 활용된다. - **Service Topology** - 넷플릭스 내부 서비스 간 관계를 나타낸다. - 실시간 및 과거 데이터를 분석해 장애 발생 시 근본 원인 분석을 지원한다. ## 기존 데이터 추상화 위에 구축한 아키텍처 - 저장소와 캐시를 새로 개발하지 않고 Netflix Online Datastore 생태계의 추상화를 활용한다. - **KV Abstraction** - 노드와 엣지의 최신 상태를 저장한다. - 모든 실시간 그래프 쿼리를 위한 인덱스로 사용된다. - **TimeSeries Abstraction** - 선택적으로 연결할 수 있다. - 시간에 따른 그래프 변화와 과거 상태를 조회할 수 있다. - **EVCache** - 밀리초 단위의 낮은 지연 시간을 달성하기 위한 캐시 계층이다. - 더 특화된 캐시 계층도 실험 중이다. - **Data Gateway Control Plane** - 그래프 스키마를 관리한다. - KV와 TS 데이터셋의 생성, 삭제, 구성 및 프로비저닝을 자동화한다. ## 강한 타입의 Property Graph 모델 - 그래프는 여러 타입의 노드와 엣지로 구성된다. - 노드와 엣지는 각각 속성(properties)을 가질 수 있다. - 속성 타입을 강하게 지정해 다음을 보장한다. - 필터링을 효율적으로 수행한다. - 데이터 내보내기(export)의 일관성을 유지한다. - 잘못된 형식의 데이터 입력을 방지한다. - 엣지는 의미에 따라 다음 중 하나로 정의된다. - **단방향 엣지**: 한 방향으로만 탐색한다. - **양방향 엣지**: 양쪽 방향의 관계를 표현한다. ## 네임스페이스와 물리적 격리 - 그래프 데이터는 **네임스페이스(namespace)**라는 독립 단위로 분리된다. - 각 네임스페이스는 Control Plane 설정에 따라 특정 물리 저장 계층과 연결된다. - 전용 하드웨어 또는 공유 하드웨어에 배포할 수 있다. - 프로비저닝 자동화는 다음 요구사항을 바탕으로 비용 효율적인 하드웨어 구성을 결정한다. - 목표 처리량 - 허용 지연 시간 - 데이터셋 크기 - 워크로드의 중요도 ## 명시적 그래프 스키마와 엣지 매핑 - 각 네임스페이스에는 명시적인 그래프 스키마가 연결된다. - 스키마는 다음을 정의한다. - 노드 타입과 엣지 타입 - 허용되는 속성과 타입 - 노드 간 허용 관계 - 엣지 방향 - 관계는 **엣지 매핑(edge mapping)**의 집합으로 표현된다. - 출발 노드 타입 - 엣지 타입 - 도착 노드 타입 - 단방향 또는 양방향 여부 - 예를 들어 `account -owns-> profile`은 단방향이고, `profile -linked_to- device`는 양방향으로 설정할 수 있다. - 엣지별 속성 스키마를 통해 `registration_time`은 TIMESTAMP, `status`는 STRING처럼 허용된 속성명과 타입을 지정한다. ## 스키마를 활용한 최적화 Graph Abstraction 서버는 시작 시 스키마를 읽어 가능한 관계를 나타내는 인메모리 메타데이터 그래프를 구축한다. - **데이터 품질 보장** - 스키마와 맞지 않는 노드, 엣지, 속성의 쓰기를 거부한다. - 데이터 내보내기 결과의 일관성을 높인다. - **쿼리 계획 수립** - 사용자 요청을 처리할 수 있는 탐색 경로를 빠르게 구성한다. - **엣지 중복 제거** - 같은 노드 타입 사이의 양방향 엣지를 탐색할 때 중복 경로 처리를 줄인다. - **불가능한 경로 제거** - 스키마상 존재할 수 없는 관계를 탐색 대상에서 제외한다. - 필터 조건이나 속성 타입이 맞지 않는 경로도 제거한다. - 서버는 Control Plane을 주기적으로 조회해 변경된 스키마를 반영한다. - 향후에는 엣지 카디널리티를 이용해 쿼리 fanout을 줄이고, 타입 안전한 데이터 접근 계층과 스키마 인식형 Gremlin 유사 API를 제공할 계획이다. ## KV 기반 실시간 인덱스 - 각 네임스페이스는 기본 저장 계층의 하나의 테이블과 연결된다. - 테이블은 고유 ID를 기준으로 레코드를 분할한다. - 하나의 레코드에는 정렬된 여러 key-value 항목이 저장된다. - 결과적으로 네임스페이스는 유연한 접근 패턴을 지원하는 **정렬된 맵들의 맵(map of sorted maps)** 구조를 갖는다. - 노드와 엣지의 모든 실시간 그래프 인덱스는 KV를 기반으로 저장된다. ## 멱등성과 Last-Write-Wins - 동일한 ID와 키에 대한 쓰기는 멱등적으로 처리된다. - 따라서 요청을 여러 번 재시도하거나 request hedging을 수행해도 안전하다. - 멱등성 토큰에는 타임스탬프가 포함된다. - KV는 이 타임스탬프를 이용해 저장 계층에서 **Last-Write-Wins(LWW)** 규칙을 적용한다. - 네트워크 지연이나 일시적 장애가 발생해도 재시도 가능한 쓰기 모델을 제공한다. 실시간·고처리량 그래프 시스템을 구축할 때는 범용 그래프 데이터베이스 하나에 모든 요구를 맡기기보다, 최신 상태 저장소·이력 저장소·캐시·스키마 관리 계층을 목적에 맞게 조합하는 방식이 효과적이다. 특히 강한 스키마와 제한된 탐색 모델을 도입하면 데이터 품질을 높이면서 쿼리 경로와 비용을 사전에 최적화할 수 있다.