graph-database

6 개의 포스트

netflix4분 읽기큐레이션 요약

대규모 서비스 토폴로지 구축: 아키텍처, 도전 과제, 그리고 얻은 교훈

넷플릭스는 장애 대응과 변경 영향 분석을 위해 실시간 서비스 의존성 지도를 구축했으며, 이를 위해 배치가 아닌 스트리밍 중심 아키텍처를 선택했다. 시스템은 eBPF 네트워크 흐름, IPC 메트릭, 분산 추적 데이터를 물리적으로 분리된 계층에 저장하고, 필요할 때 통합해 제공한다. 대규모 트래픽에서도 안정적으로 동작하기 위해 백프레셔와 분산 집계 파이프라인을 적용했으며, 약간의 지연을 허용하는 대신 데이터 손실과 시스템 장애를 방지했다. ## 실시간 서비스 토폴로지가 필요한 이유 - 기존의 시간별·일별 배치 방식은 데이터가 생성될 때 이미 오래된 상태가 된다. - 장애 대응 시 한 시간 전의 의존성 지도는 현재의 장애 원인과 영향 범위를 정확히 보여주기 어렵다. - 실시간 변경 검증과 장애 분석을 위해 지속적인 데이터 수집과 갱신이 필요하다. - 넷플릭스의 시스템은 일반적으로 수십 분 이내에 토폴로지 정보를 갱신하는 것을 목표로 한다. ## 스트리밍 중심 아키텍처 - 여러 리전의 Kafka 스트림에서 네트워크 흐름 데이터를 지속적으로 수집한다. - IPC 메트릭은 Server-Sent Events(SSE) 형태로 전달하고, 반응형 파이프라인에서 처리한다. - 배치 처리처럼 완전한 스냅샷을 기다리지 않고, 데이터가 도착하는 즉시 토폴로지를 갱신한다. - 대규모 트래픽을 처리하면서도 처리 지연이 누적되지 않도록 스트리밍 처리와 부하 제어를 함께 설계했다. ## 백프레셔를 통한 안정적인 부하 제어 - 단순한 무제한 큐는 트래픽이 급증할 때 메모리를 고갈시키고 인스턴스 장애를 일으킬 수 있다. - 버퍼가 가득 찼을 때 데이터를 버리는 방식은 연결 정보가 사라져 토폴로지가 불완전해진다. - 배치 방식은 데이터를 보존할 수 있지만, 장애가 끝난 뒤에야 결과를 확인하게 될 수 있다. - 백프레셔는 하위 단계의 처리 속도에 맞춰 상위 단계가 자동으로 속도를 줄이는 방식이다. - 그래프 데이터베이스가 느려지면 Stage 2가 Stage 1에 감속을 요청한다. - 감속 신호는 Kafka 소비자까지 전파된다. - Kafka에 데이터가 남아 있으므로 처리 능력이 회복된 뒤 이어서 처리할 수 있다. - GC 일시정지, 외부 저장소 지연, 트래픽 급증 상황에서도 시스템이 중단되거나 데이터를 대량으로 버리지 않고 점진적으로 느려진다. - 실시간성이 몇 초 또는 몇 분 늦어지는 대신, 시간 단위로 오래된 데이터나 누락된 토폴로지를 피할 수 있다. - 반응형 스트림은 전통적인 동기식 처리보다 이해하고 운영하기 어렵지만, 넷플릭스 규모에서는 안정성을 위한 필수 요소로 평가된다. ## 데이터 소스별 물리적 토폴로지 계층 넷플릭스는 서로 다른 특성을 가진 데이터를 하나의 저장소에 억지로 통합하지 않고, 세 개의 계층으로 분리했다. - **네트워크 계층** - eBPF 기반 네트워크 흐름 로그를 그래프 데이터베이스에 저장한다. - 서비스 간 연결을 폭넓게 포착하지만 애플리케이션 수준의 상세한 맥락은 부족하다. - **IPC 계층** - 애플리케이션 메트릭을 별도의 그래프 데이터베이스에 저장한다. - 엔드포인트 정보가 풍부하지만 계측된 서비스만 포함한다. - **트레이싱 계층** - 분산 추적 데이터를 Parquet 기반 컬럼형 저장소에 저장한다. - 실제 요청 경로를 보여주지만 샘플링으로 인해 전체 트래픽을 대표하지 않을 수 있다. - 각 계층을 물리적으로 분리하면 처리량, 쿼리 패턴, 데이터 발전 주기에 맞춰 독립적으로 최적화할 수 있다. - 쿼리 시에는 필요한 저장소에 병렬 질의한 뒤 결과를 병합해 통합된 서비스 뷰를 제공한다. ## 네트워크 중간 장비를 해결하는 분산 집계 파이프라인 네트워크 흐름 로그는 실제 서비스 의존성이 아니라 개별 네트워크 홉만 보여주는 문제가 있다. - 실제 경로가 `App A → 로드 밸런서 → App B`라면 흐름 로그에는 두 개의 별도 연결로 기록된다. - 이 데이터를 그대로 시각화하면 서비스 대신 로드 밸런서, NAT 게이트웨이, API 게이트웨이, 프록시 같은 인프라 컴포넌트가 중심에 나타난다. - 따라서 여러 홉을 분석해 논리적인 `App A → App B` 의존성으로 재구성해야 한다. - 이를 위해 네트워크 계층 수집은 세 단계의 분산 집계 파이프라인으로 구성된다. ### Stage 1: 초기 집계 - 네 개 리전의 Kafka에서 흐름 로그를 소비한다. - 잘못된 흐름 로그를 필터링한다. - 5분 단위 시간 창으로 데이터를 묶는다. - 각 시간 창마다 초기 집계 객체를 생성한다. - 일관성 해싱을 사용해 집계 대상을 분산한다. - 생성된 집계 결과를 SSE를 통해 Stage 2로 스트리밍한다. - 이 단계에서는 중간 장비가 포함된 네트워크 홉을 식별하지만, 최종적인 서비스 간 연결은 아직 확정하지 않는다. ## 대규모 분산 시스템에서 얻은 설계 교훈 - 실시간 처리는 단순히 빠르게 처리하는 문제가 아니라, 느려지는 상황에서도 시스템을 무너지지 않게 만드는 문제다. - 데이터 손실보다 일시적인 지연을 선택하는 것이 서비스 토폴로지와 장애 분석에는 더 적합할 수 있다. - 서로 다른 데이터의 특성이 뚜렷하다면 저장소와 처리 계층을 분리하고, 조회 시 통합하는 편이 확장성과 독립적인 최적화에 유리하다. - 로컬 환경에서 정상 동작하는 구현도 운영 환경에서는 Kafka 지연, 메모리 부족, 트래픽 편중, GC 비용 등으로 쉽게 한계에 도달할 수 있다. - 따라서 대규모 시스템은 초기 설계뿐 아니라 부하 상황에서의 관찰, 병목 측정, 단계별 최적화 방법론이 중요하다. 실용적으로는 스트리밍 파이프라인을 구축할 때 무제한 버퍼나 무조건적인 데이터 삭제보다 백프레셔를 우선 고려하는 것이 좋다. 또한 서로 다른 품질과 용도를 가진 데이터 소스를 하나의 모델로 통합하기보다, 각 소스에 맞는 저장 계층을 유지하고 조회 단계에서 결합하는 방식이 운영 유연성을 높인다.

원문 읽기(새 탭에서 열림)
gitlab5분 읽기큐레이션 요약

GitLab Orbit 소개

GitLab Orbit은 코드뿐 아니라 머지 리퀘스트, 파이프라인, 배포, 취약점, 소유권까지 연결한 실시간 그래프를 제공해 AI 에이전트가 시스템 전체 맥락을 한 번에 이해하도록 하는 서비스다. 이를 통해 에이전트는 파일을 반복 탐색하는 대신 관계형 질의를 수행하며, 최대 11배 빠르고 토큰 사용량은 4.5배 적어질 수 있다. GitLab은 Orbit이 코드 리뷰와 장애 대응, 보안, 마이그레이션처럼 여러 시스템을 함께 봐야 하는 작업의 정확성과 처리 속도를 높인다고 설명한다. ## 기존 AI 코딩 에이전트의 한계 - AI 에이전트는 코드 작성에는 강하지만 다음 정보를 찾는 데는 취약하다. - 관련 코드와 의존성 - 해당 코드를 실행하는 테스트와 파이프라인 - 실제 배포 환경 - 변경을 요청한 작업 항목 - 관련 팀과 담당자 - 대규모 모노레포에서는 에이전트가 파일을 탐색하는 데 토큰과 시간을 많이 사용한다. - 저장소가 여러 개로 나뉘면 컨텍스트가 부족해져 의존성을 놓치거나, 코드가 겉보기에는 맞지만 실제로는 되돌려지는 결과를 만들 수 있다. - 단순한 검색이나 RAG 방식만으로는 코드와 개발 lifecycle 데이터 사이의 관계를 충분히 복원하기 어렵다. ## 실제 머지 리퀘스트에서의 검증 - 영국 가격 비교 플랫폼 Compare the Market은 79개의 실제 머지 리퀘스트를 대상으로 AI 코드 리뷰의 컨텍스트 검색 방식을 비교했다. - Orbit을 사용한 리뷰어의 정확한 인라인 댓글 비율은 약 70%였다. - RAG 방식은 약 58%에 그쳤다. - 변경 사항 요약에서 핵심 변경을 포착한 비율도 Orbit이 68%, RAG가 66%였다. - RAG는 컨텍스트를 사용하지 않은 방식보다도 낮은 성능을 보였다. - 테스트 결과 Orbit은 단순히 현재 diff를 읽는 것이 아니라 코드베이스의 구조와 변경의 주변 영향을 이해하는 데 효과적이었다. ## 코딩 에이전트의 탐색 비용 감소 - Claude Code 같은 외부 에이전트를 MCP(Model Context Protocol)로 Orbit에 연결할 수 있다. - 에이전트는 다음 질문을 파일을 반복해서 읽으며 추론하지 않고 그래프에 직접 질의한다. - 특정 코드가 어디에 있는가? - 어떤 코드가 이를 의존하는가? - 어떤 테스트와 파이프라인이 이를 검증하는가? - 같은 모델과 같은 작업을 비교했을 때 다음과 같은 개선이 제시됐다. - 최대 11배 빠른 작업 수행 - 최대 4.5배 적은 토큰 사용 - 최대 45배 적은 환각 생성 - 결과적으로 에이전트가 실제 구현 작업을 시작하기 전에 소모하는 탐색 시간이 줄어든다. ## 파이프라인 장애의 전체 영향 추적 - 기존 에이전트는 실패한 파이프라인의 개별 job만 보고 원인을 고립된 문제로 판단하기 쉽다. - Orbit은 실패한 job에서 관련 파이프라인, 머지 리퀘스트, 프로젝트까지 연결해 추적한다. - 예시 질의는 실패한 CI job과 연결된 최근 머지 리퀘스트를 프로젝트별로 조회한다. ```cypher MATCH (job:CiJob {status: "failed", name: $job_name}) -[:RAN_IN]->(pipeline)-[:FOR]->(mr:MergeRequest) RETURN mr.title, mr.author, pipeline.started_at, mr.project_id ORDER BY pipeline.started_at DESC LIMIT 20 ``` - 이 방식으로 여러 프로젝트에서 동일한 장애를 만날 진행 중인 MR을 한 번에 찾을 수 있다. - 여러 팀이 같은 원인을 따로 해결하는 대신, 한 번의 대응으로 문제를 확산시키는 변경까지 파악할 수 있다. ## 취약점의 영향 범위와 담당자 파악 - 취약한 코드 자체를 찾는 것보다, 해당 코드가 시스템 어디까지 퍼졌는지를 확인하는 일이 더 어렵다. - Orbit은 다음 정보를 연결해 보여준다. - 취약한 컴포넌트를 포함한 서비스 - 해당 서비스를 빌드하는 파이프라인 - 실행되는 환경 - 각 구성 요소의 소유 팀 - 보안팀은 CVE가 공개된 직후 영향을 받는 구성 요소와 담당자를 포함한 remediation 계획을 만들 수 있다. - 수작업으로 여러 도구를 조사하는 데 걸리던 시간을 줄여 대응 속도를 높이는 것이 목표다. ## 조직 전반의 질의와 마이그레이션 계획 - Orbit은 고정된 대시보드에 없는 복합적인 질문에도 활용된다. - 예를 들어 팀별 cycle time을 파이프라인 실패율, 배포 빈도와 결합해 조회할 수 있다. - 공용 컴포넌트 마이그레이션에서는 다음 의존성을 한 번에 확인할 수 있다. - 종속 서비스 - 관련 job - 배포 환경 - 담당 소유자 - 숨은 downstream 의존성을 놓쳐 일정이 지연되는 위험을 줄이고, 마이그레이션 범위와 책임자를 구체화할 수 있다. ## Orbit의 기술 구조 - 소프트웨어 개발 lifecycle 데이터를 CDC(Change Data Capture) 방식으로 수집해 ClickHouse에 저장한다. - Rails 내부 API를 통해 12개 언어의 코드를 분석한다. - Ruby, Java, Kotlin, Python, TypeScript, JavaScript - Rust, Go, C#, C, C++, PHP - Cypher와 유사한 DSL, MCP, REST, GitLab CLI를 통해 그래프를 조회한다. - GitLab 자체 환경에서는 4만 개 이상의 프로젝트, 5억 개 노드, 20억 개 엣지를 45분 이내에 인덱싱한다고 설명한다. - 이벤트 기반 엔진이 변경 사항을 즉시 반영해 그래프를 최신 상태로 유지한다. - 인덱싱은 별도 서비스에서 수행되므로 쿼리 트래픽이 GitLab 인스턴스에 직접 부담을 주지 않는다. - GitLab 권한을 그대로 반영하므로 에이전트는 사용자가 UI에서 볼 수 있는 데이터만 조회한다. - 쿼리는 데이터베이스에 실행되기 전에 검증, 실행 계획 수립, 최적화, 보안 검사를 거친다. ## 다양한 사용 방식과 Data Explorer - GitLab Duo Agent Platform의 에이전트는 Orbit을 기본적으로 질의할 수 있다. - Claude Code, Codex, OpenCode 같은 외부 에이전트는 MCP와 GitLab CLI를 통해 연결한다. - 사내 도구나 맞춤형 에이전트는 REST API를 사용할 수 있다. - Data Explorer에서는 에이전트 없이 엔지니어가 같은 그래프를 직접 조회한다. - 장애 조사, 의존성 전파 추적, 반복적인 CI 실패 원인 분석처럼 정해진 프롬프트에 맞지 않는 작업에도 활용할 수 있다. Orbit은 코드 검색 도구라기보다 코드와 개발 lifecycle 전체를 연결하는 지식 그래프에 가깝다. 여러 저장소와 시스템에 걸친 의존성, 장애 영향, 보안 노출, 소유권을 자주 추적해야 하는 대규모 조직이라면 특히 효과가 크며, 도입 시에는 실제 MR 리뷰나 장애 대응 업무를 대상으로 기존 검색·RAG 방식과 정확도 및 비용을 비교해 검증하는 것이 좋다.

원문 읽기(새 탭에서 열림)
netflix5분 읽기큐레이션 요약

넷플릭스의 고처리량 그래프 추상화: 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)** 규칙을 적용한다. - 네트워크 지연이나 일시적 장애가 발생해도 재시도 가능한 쓰기 모델을 제공한다. 실시간·고처리량 그래프 시스템을 구축할 때는 범용 그래프 데이터베이스 하나에 모든 요구를 맡기기보다, 최신 상태 저장소·이력 저장소·캐시·스키마 관리 계층을 목적에 맞게 조합하는 방식이 효과적이다. 특히 강한 스키마와 제한된 탐색 모델을 도입하면 데이터 품질을 높이면서 쿼리 경로와 비용을 사전에 최적화할 수 있다.

원문 읽기(새 탭에서 열림)
netflix5분 읽기큐레이션 요약

사일로에서 서비스 토폴로지로: 넷플릭스가 실시간 서비스 맵을 구축한 이유

넷플릭스는 수천 개의 마이크로서비스 간 실제 의존성을 실시간으로 보여주는 ‘Service Topology’를 구축했다. 기존의 지표·로그·트레이스는 시스템의 일부만 보여주므로, 장애 원인과 영향 범위를 파악하려면 엔지니어가 정보를 직접 조합해야 했다. Service Topology는 여러 데이터 소스로 네트워크와 애플리케이션 의존성 그래프를 만들고, 이를 통합해 빠르게 탐색할 수 있도록 하는 것이 핵심이다. ## 분산 시스템에서 의존성 파악이 어려운 이유 - 넷플릭스의 하나의 재생 요청도 인증, 추천, 인코딩 선택, 재생 최적화 등 수많은 서비스 호출을 발생시킨다. - 장애 상황에서 엔지니어가 즉시 확인해야 하는 질문은 다음과 같다. - 어떤 서비스가 서로 의존하는가? - 특정 서비스 장애나 점검의 영향 범위는 어디까지인가? - 문제가 상위 의존 서비스에서 시작됐는가, 현재 서비스가 다른 서비스로 전파하고 있는가? - 기존 관측 도구의 한계: - 메트릭은 성능 저하나 오류 같은 증상을 보여준다. - 로그는 개별 서비스의 동작을 보여준다. - 트레이스는 특정 요청의 흐름을 보여준다. - 그러나 시스템 전체의 지속적인 서비스 연결 구조를 한눈에 보여주지는 못한다. - 여러 도구의 정보를 엔지니어가 머릿속으로 조합해야 하므로, 장애 대응이 느리고 오류가 발생하기 쉽다. ## 실시간 서비스 맵이 필요한 배경 - 넷플릭스는 수천 개의 마이크로서비스와 수백 개의 엔지니어링 팀으로 운영된다. - 라이브 프로그램과 광고 지원 요금제 등 새로운 기능이 추가되면서 장애 조사와 모니터링의 신속성이 더욱 중요해졌다. - 특히 라이브 이벤트는 긴 장애 분석을 기다릴 수 없기 때문에 실시간에 가까운 의존성 정보가 필요하다. - 엔지니어 지원 요청을 분석한 결과, 다음과 같은 의존성 관련 질문이 반복적으로 제기됐다. - 상·하위 의존 서비스는 무엇인가? - 장애가 내 서비스 문제인가, 의존 서비스 문제인가? - 서비스를 중단하면 어떤 서비스가 영향을 받는가? - 메트릭에서 특정 서비스가 `Unknown`으로 표시되는 이유는 무엇인가? - 최근 호출 경로가 어떻게 바뀌었으며, 그것이 현재 문제와 관련 있는가? ## 기존 접근 방식에서 얻은 교훈 넷플릭스는 외부 그래프 데이터베이스와 상용 플랫폼을 검토하고, 다양한 저장 기술과 데이터 모델로 내부 프로토타입을 만들며 접근 방식을 발전시켰다. - **실시간성이 중요하다** - 하루 전 또는 몇 시간 전의 토폴로지는 자주 배포되는 환경에서는 이미 오래된 정보다. - 서비스 배포와 트래픽 변화에 따라 토폴로지가 거의 실시간으로 갱신되어야 한다. - **대규모 환경에서는 확장성이 핵심이다** - 소규모 환경에서 동작하는 저장소와 그래프 모델도 넷플릭스의 서비스 수와 트래픽 규모에서는 한계에 도달한다. - **기존 관측 생태계와의 통합이 필요하다** - 엔지니어가 새로운 도구와 작업 방식을 별도로 배워야 해서는 안 된다. - 기존 메트릭, 로그, 트레이스와 자연스럽게 연결되어야 한다. - **데이터 품질이 중요하다** - 누락되거나 잘못된 의존성 정보는 정보가 없는 것보다 위험하다. - 장애 상황에서 잘못된 원인이나 영향 범위를 판단하게 만들 수 있기 때문이다. - **단일 데이터 소스만으로는 부족하다** - 네트워크 연결 정보에는 애플리케이션 수준의 의미가 부족하다. - 애플리케이션 메트릭은 계측된 서비스만 포함할 수 있다. - 따라서 여러 관점의 데이터를 결합해야 한다. ## Service Topology의 요구사항 넷플릭스가 구축하려 한 것은 정적인 아키텍처 다이어그램이 아니라, 운영 상태를 계속 반영하는 ‘살아 있는 지도’였다. - 서비스 배포, 트래픽 변화, 신규 의존성 생성과 기존 의존성 제거를 실시간에 가깝게 반영한다. - 호출 그래프 탐색 결과를 1초 이내에 제공해야 한다. - 다음 두 계층을 모두 표현한다. - **네트워크 계층**: 실제로 어떤 서비스가 통신하는가 - **애플리케이션 계층**: 어떤 API와 엔드포인트가 호출되는가 - 단순한 연결 관계 외에도 다음 정보를 함께 표시한다. - 서비스 상태와 가용성 - 중요도 및 availability tier - 비즈니스 도메인 - 서비스 소유 팀 - 기타 운영 메타데이터 - 엔지니어가 탐색할 수 있는 UI뿐 아니라 자동화 시스템도 사용할 수 있는 프로그래밍 API를 제공한다. - 복원력 프레임워크 - 영향 범위 계산기 - 장애 대응 자동화 시스템 ## 세 가지 데이터 소스를 결합하는 구조 핵심 설계는 하나의 데이터 소스에 의존하지 않고, 서로 다른 관점에서 별도의 의존성 그래프를 구축하는 것이다. - 네트워크 계층, IPC 계층, 트레이싱 계층을 물리적으로 분리해 저장한다. - 각 계층은 독립적으로 발전하고 병렬로 조회할 수 있다. - 통합된 뷰가 필요할 때는 각 계층의 그래프를 동시에 탐색한 뒤 결과를 병합한다. - 이 구조를 통해 여러 계층을 함께 조회하더라도 1초 이내의 응답 시간을 목표로 한다. - 필요에 따라 통합된 그래프를 보거나, 특정 계층의 그래프만 독립적으로 분석할 수 있다. ## eBPF 기반 네트워크 흐름 첫 번째 데이터 소스는 커널 수준에서 eBPF로 수집한 네트워크 흐름 정보다. - 실제 네트워크 통신을 기반으로 어떤 서비스가 어떤 서비스에 연결되는지 기록한다. - 애플리케이션 계측 여부와 관계없이 실제 트래픽이 발생하는 모든 서비스를 포착할 수 있다. - 클러스터 간 통신과 애플리케이션 간 통신을 모두 파악할 수 있다. - 네트워크 트래픽이라는 실제 운영 데이터를 사용하므로 네트워크 계층의 기준점 역할을 한다. - 다만 네트워크 정보만으로는 어떤 API나 애플리케이션 기능이 호출됐는지 알기 어렵다. - 따라서 eBPF 데이터는 포괄적인 연결 관계를 제공하지만, 애플리케이션 의미를 해석하려면 IPC나 트레이싱 같은 추가 데이터가 필요하다. ## 운영 관점의 의미 - 서비스 토폴로지는 장애 원인 분석을 단순화하고, 상·하위 의존성 및 장애 전파 경로를 빠르게 확인하게 한다. - 서비스 중단이나 유지보수 전에 영향받을 서비스와 관련 팀을 파악할 수 있다. - UI와 API를 함께 제공함으로써 사람의 장애 대응과 자동화된 복원력·영향 분석을 모두 지원한다. - 정적인 아키텍처 문서보다 실제 트래픽과 현재 운영 상태를 반영하는 동적 지도가 분산 시스템에 더 유용하다. 실무적으로는 단일 관측 도구에 의존하기보다 네트워크 흐름, 애플리케이션 호출, 트레이싱 데이터를 결합해 의존성 정보를 구성하는 것이 좋다. 특히 대규모 마이크로서비스 환경에서는 실시간성, 데이터 정확성, 빠른 그래프 탐색, 기존 도구와의 통합을 초기 설계부터 핵심 요구사항으로 삼아야 한다.

원문 읽기(새 탭에서 열림)
netflix4분 읽기큐레이션 요약

넷플릭스에서 머신러닝의 민주화: 모델 수명 주기 그래프 구축

Netflix는 ML 자산이 개인화, 스튜디오, 결제, 광고 등 여러 영역으로 확장되면서 모델과 데이터가 각기 다른 시스템에 고립되는 문제를 겪었다. 이를 해결하기 위해 다양한 ML 메타데이터를 통합하는 Metadata Service(MDS)와 Model Lifecycle Graph를 구축했다. MDS는 모델·피처·파이프라인·실험·데이터셋 등의 관계를 연결해 자산의 발견, 계보 추적, 영향 분석, 재사용을 가능하게 하는 기반이다. ## ML 생태계의 확장과 사일로 문제 - Netflix의 ML 활용 영역은 개인화 중심에서 다음과 같이 확대됐다. - 콘텐츠 추천과 사용자 참여 최적화 - 스튜디오의 제작 전후 작업 - 사기 탐지, 결제 라우팅, 정기 결제 최적화 - 광고 타기팅과 실시간 의사결정 - 각 도메인은 서로 다른 기술 스택, 비즈니스 지표, 조직 구조를 사용한다. - 그 결과 모델이 블랙박스처럼 고립되고, 다른 팀이 기존 모델과 데이터를 발견하거나 재사용하기 어려워졌다. - 예를 들어 스튜디오에서 만든 콘텐츠 임베딩은 장면 전환과 콘텐츠 구조를 분석하지만, 광고의 문맥 매칭이나 개인화 추천에도 활용될 수 있다. - 그러나 모델 레지스트리, 파이프라인 오케스트레이터, 실험 플랫폼이 분리되어 있어 다음 질문에 답하기 어렵다. - 어떤 피처와 데이터 소스가 존재하는가? - 특정 모델은 어떤 파이프라인과 데이터로 생성되는가? - 해당 모델을 사용하는 A/B 테스트는 무엇인가? - 피처를 변경하면 어떤 모델이 영향을 받는가? - 각 자산의 담당자는 누구인가? ## 통합 UI보다 어려운 메타데이터 연결 - 문제의 본질은 화면을 하나로 합치는 것이 아니라, ML 라이프사이클의 서로 다른 구성 요소를 연결하는 것이다. - Netflix에는 다음과 같은 시스템이 각각 메타데이터를 생성한다. - 파이프라인 오케스트레이션: 실행 정보, 단계 의존성, 데이터 변환 - 모델 레지스트리: 모델 버전, 아티팩트, 오래된 모델 여부, 배포 이력 - 실험 플랫폼: A/B 테스트와 설정 - 피처 스토어: 피처 정의와 사용처 - AI Dataset 플랫폼: 데이터셋 생성, 관리, 검색, 로딩 - Identity 플랫폼: 사용자, 팀, 조직 정보 - 시스템마다 데이터 형식, 식별자, 개념 모델이 다르기 때문에 이질적인 메타데이터를 하나의 엔터티 모델로 변환하고 관계 그래프로 만드는 작업이 핵심 기술 과제가 됐다. ## Metadata Service와 Model Lifecycle Graph - MDS는 Netflix 전반의 ML 관련 엔터티를 색인하고 서로 연결하는 서비스다. - 모델, 피처, 파이프라인, 실험, 데이터셋 등의 메타데이터를 실시간으로 수집한다. - 다음과 같은 교차 도메인 질의를 지원하는 것을 목표로 한다. - 특정 모델을 실행 중인 실험은 무엇인가? - 특정 피처를 공유하는 모델은 무엇인가? - 모델에 사용된 데이터와 생성 파이프라인은 무엇인가? - MDS의 역할은 다음과 같다. - 여러 시스템에서 이벤트 수집 - 메타데이터에 조직·소유자 등 추가 맥락 결합 - ML 자산 간 관계 추론 및 구체화 - 연결된 그래프 형태로 탐색 가능하게 제공 - 궁극적인 목표는 모든 ML 자산을 팀과 도메인에 관계없이 발견하고, 이해하고, 재사용할 수 있도록 만드는 것이다. ## URI 기반 핵심 추상화 MDS는 시스템 간 일관된 연결을 위해 AI Platform URI를 사용한다. - **Component** - 고유한 URI로 주소 지정할 수 있는 모든 객체다. - 형식은 다음과 같다. ```text aip://<componentType>/<platformId>/<resourceId> ``` - 예: ```text aip://model/registry/ranking-v5 aip://user/identity/alice aip://pipeline/orchestrator/weekly-training ``` - **Entity** - 이름, 설명, 생성일, 소유자 등 추가 속성을 가진 ML 생태계의 구성 요소다. - 모델, 피처, 파이프라인 등이 이에 해당한다. - **Entity Type** - 동일한 데이터 구조와 속성·관계 제약을 공유하는 엔터티 집합이다. - **Domain** - 관련 엔터티 타입을 묶고 해당 ML 자산 범주의 추상 인터페이스를 정의한다. - 예를 들어 Models 도메인은 Model과 Model Instance를, Pipelines 도메인은 Schedule·Request·Execution을 정의한다. - **Provider** - 도메인을 실제로 구현하는 특정 소스 시스템이다. - 하나의 도메인에 여러 Provider를 연결할 수 있어, 모델 레지스트리가 교체되더라도 도메인 인터페이스를 변경하지 않고 확장할 수 있다. - URI는 서비스 간 ML 자산 참조를 단일 문자열로 통일하고, MDS가 이를 풍부한 메타데이터와 연결된 관계로 해석할 수 있게 한다. ## 이벤트에서 엔터티와 그래프로 - MDS는 Kafka와 AWS SNS/SQS를 통해 소스 시스템의 이벤트를 실시간으로 수집한다. - 소스 시스템은 식별자와 이벤트 유형 중심의 얇은 이벤트를 발행한다. - 예시는 다음과 같다. ```json { "event_type": "model_instance_created", "instance_id": "ranking-model-v5-20XX0101" } ``` - 생산 시스템은 복잡한 그래프 로직을 알 필요 없이 간단한 이벤트만 발행하고, MDS가 이를 엔터티로 변환하고 다른 시스템의 정보와 결합한다. - 이후 모델, 파이프라인, 피처, A/B 테스트 등의 관계를 추론해 질의 가능한 Model Lifecycle Graph로 materialize한다. - 이를 통해 모델 생성 이벤트와 실험 설정을 연결하는 것처럼, 서로 다른 시스템에 존재하는 관계도 하나의 그래프에서 탐색할 수 있다. MDS와 Model Lifecycle Graph는 단순한 모델 카탈로그가 아니라, ML 자산의 생성부터 배포·실험·재사용까지를 연결하는 메타데이터 인프라다. 여러 팀이 공통 URI와 엔터티 모델을 사용하도록 만들면 모델의 검색성, 의존성 파악, 변경 영향 분석, 조직 간 재사용이 크게 향상된다.

원문 읽기(새 탭에서 열림)
netflix원문

넷플릭스가 실시간 분산 그래프를 구축한 방법과 이유: 1부 — 인터넷 규모의 데이터 스트림 수집 및 처리 (새 탭에서 열림)

넷플릭스는 비디오 스트리밍을 넘어 광고, 라이브 이벤트, 모바일 게임으로 비즈니스를 확장하면서 발생하는 데이터 파편화 문제를 해결하기 위해 '실시간 분산 그래프(RDG)'를 구축했습니다. 기존 마이크로서비스 아키텍처에서 발생하는 데이터 고립을 극복하고, 다양한 서비스 접점에서 발생하는 사용자 활동을 실시간으로 연결하여 개인화된 경험을 제공하는 것이 핵심 목표입니다. 이를 통해 복잡한 데이터 조인 없이도 수억 개의 노드와 엣지 사이의 관계를 즉각적으로 파악할 수 있는 기술적 기반을 마련했습니다. **데이터 파편화와 비즈니스 환경의 변화** * 스트리밍, 게임, 라이브 스포츠 등 서비스 영역이 넓어지면서 사용자가 여러 기기와 도메인에서 수행하는 활동을 하나의 맥락으로 통합해야 할 필요성이 커짐. * 넷플릭스의 강점인 마이크로서비스 아키텍처(MSA)는 서비스 독립성에는 유리하지만, 데이터가 각 서비스에 고립(Silo)되어 있어 통합적인 데이터 과학 및 엔지니어링 작업에 큰 비용이 발생함. * 기존 데이터 웨어하우스 방식은 데이터가 서로 다른 테이블에 저장되고 처리 주기가 제각각이라, 실시간으로 연관 관계를 분석하는 데 한계가 있음. **그래프 모델 도입의 기술적 이점** * **관계 중심 쿼리:** 테이블 기반 모델에서 필요한 비용 중심적인 조인(Join)이나 수동적인 비정규화 없이도 노드와 엣지 사이를 빠르게 탐색(Hop)할 수 있음. * **유연한 확장성:** 새로운 엔티티나 관계 유형이 추가될 때 대대적인 스키마 변경이나 아키텍처 재설계 없이도 신속하게 데이터 모델을 확장할 수 있음. * **패턴 및 이상 탐지:** 숨겨진 관계, 순환(Cycle) 구조, 그룹화 등을 식별하는 작업을 기존의 포인트 조회 방식보다 훨씬 효율적으로 수행함. **실시간 데이터 수집 및 처리 파이프라인 (RDG 레이어 1)** * 전체 시스템은 수집 및 처리, 저장, 서빙의 3개 레이어로 구성되며, 첫 번째 단계인 수집 레이어는 이기종 업스트림 소스로부터 이벤트를 받아 그래프 데이터를 생성함. * DB의 변경 사항을 추적하는 CDC(Change Data Capture)와 애플리케이션의 실시간 로그 이벤트를 주요 소스로 활용하여 데이터 소외 현상을 방지함. * 수집된 원시 데이터는 스트리밍 처리 엔진을 통해 그래프 스키마에 맞는 노드와 엣지 형태로 변환되며, 대규모 트래픽 환경에서도 실시간성을 유지하도록 설계됨. 복잡하게 얽힌 현대의 서비스 환경에서 데이터 간의 관계를 실시간으로 규명하는 것은 사용자 경험 고도화의 핵심입니다. 넷플릭스의 RDG 사례처럼 파편화된 마이크로서비스의 데이터를 그래프 형태로 통합하는 접근 방식은, 실시간 통찰력이 필요한 대규모 분산 시스템 설계 시 강력한 해결책이 될 수 있습니다.