아래 포스트는 Keystone Real-time Streaming Processing Platform(medium)을 읽고 정리한 글입니다.
원글 글쓴이 : Zhenzhong Xu in Real-time Data Infrastructure team
Keystone Stream Processing Platform은 넷플릭스의 Data-driven culture을 가능케한 Data backbone 이자 infrastructure의 필수적인 부분을 뜻한다. Netflix Keystone은 2015년 기준, 8,000,000tps의 데이터를 처리하고 있으며 약 1PB 양의 데이터를 처리하고 있다.
오늘날 Keystone Platform은 두가지의 핵심 서비스를 제공한다.
1) Data Pipeline
Routing service, Messaging service를 통해 Data의 producing, collecting, processing, aggregating 역할을 하며, microservice event를 실시간으로 전달해주기도 한다.
2) Stream Processing as a Service(SPaaS)
사용자들이 Stream processing application을 빌드하고 커스텀하게 운영할 수 있도록 제공한다. 또한 플랫폼에서 Data scale, operation, domain expertise를 제공하여 사용자들은 Application logic에 집중하도록 도와준다.
그림. 넷플릭스 키스톤 파이프라인
이제, 상기 그림과 같은 Keystone platform을 설계하기 위해 직면했던 도전과제(challenges)와 설계원칙(Design principle)을 살펴보자.
Challenges
1. Scale
넷플릭스 서비스는 약 190개국의 1억 3천만 구독자가 사용한다. 데이터 스트리밍 플랫폼은 하루에 1조번 이상의 event와 페타바이트(petabyte)단위의 데이터를 처리하게 된다. 그러므로 구독자가 늘어남에 따라 Keystone platform은 scale out되는 구조를 가져야 한다.
2. Diverse Use-cases
Keystone Routing Service : 이 서비스는 사용자의 요구에 따라 입수되는 이벤트를 라우팅하는 역할을 한다. 각 라우팅된 이벤트들은 병렬로 스트리밍 프로세싱 처리 된다. 사용자는 선택적으로 해당 이벤트들에 대해 filter 혹은 aggregation 가능하다. 입수된 데이터들은 batch/stream processing을 위해 storage에 저장된다.
Stream Processing as a Service: SPaaS 플랫폼은 2017년부터 넷플릭스에서 사용되었다. 아직 성숙되지 않은 플랫폼이지만 아래와 같이 몇가지 고려해야할 사항이 있다.(Job state, Job Complexity, Traffic pattern, Failure recovery 등)
3. Multi-tenancy
Keystone은 수천개의 스트리밍 작업을 지원하면서 데이터 전달, 분석을 수행하고 microservice architecture pattern을 돌아가게 한다. 이러한 스트리밍 작업의 다양한 특성에도 안정적으로 데이터플랫폼을 운영하려면, 사용자들에게 의미있는 서비스 수준을 보장하기 위해 infrastructure level에서 실행&운영의 격리가 필요하며, 공유 자원의 overhead를 최소화 해야한다.
4. Elasticity
보통 스트림의 트래픽 패턴은 고정적이지만, 예상치 못한 급격한 트래픽 변화에 따른 시스템 자동 조정 및 대응이 필요하다.
5. Cloud Native Resiliency
넷플릭스의 마이크로서비스들은 모두 cloud service에 올라가 있다. Cloud service로 인한 네트워크 장애, 인스턴스 장애, regional disaster failure등 모든 단계에서 장애를 모니터링 탐지 할 수 있는 시스템을 설계해야한다.
6. Operation overhead
Keystone은 수천개의 라우팅 작업과 스트리밍 애플리케이션을 서비스한다. 모든 스트림을 수동으로 관리하게 되면 플랫폼팀에 의존하게 되므로, 운영하는데 비용이 증가하게된다. 그러므로, 사용자는 스트리밍 서비스의 각 job에 대해 lifecycle을 명시해야하며, 인프라는 가능한한 자동화 해야한다.
7. Agility
넷플릭스는 변경사항에 대해 하루에도 여러번 신속하게 개발하고 배포 할 수 있기를 원한다. 또한 사용자도 또한 동일한 수준으로 서비스를 자신있게 사용 할 수 있도록 플랫폼을 제공해주고자 한다.
Platform Mindset & Design Principle
Netflix Keystone 플랫폼의 주요 목표 중 하나는 다른 팀이 비즈니스 로직에 집중할 수 있께 하여 실험, 구현 및 스트림 처리 작업을 쉽게 수행할 수 있도록 도와주는 것이다. 또한 실패에 대해 생각을 해야하며, user과 플랫폼의 관계, 그리고 스트리밍 프로세스를 운영함에 있어 resource(CPU, Network, Memory)에 대한 효율적인 운용방법에 대해 고민해야한다.
Netflix's Approach
앞서 언급한 문제점들과 설계원칙을 고려하여 Key stone을 설계하였고 각 세부 설계 내용은 아래와 같다.
1. Declarative Reconciliation
Declarative Reconciliation protocol(선언적 조화?)는 전체 아키텍쳐에서 사용된다. 'Source of Truth(진실의 근원)'는 AWS RDS를 사용하여 저장한다. 이것은 Keystone의 전체시스템의 Single source of truth이다. 만약 Kafka cluster가 ZK의 실패로 인해 날라간다면, 넷플릭스는 항상 'source of truth'을 기반으로 전체 클러스터를 재창조 할 수 있다.
글쓴이 : 아마도 넷플릭스 키스톤의 모든 플랫폼, 모든 job들에 대해 source로서 선언을 해서 사용한다는 뜻을 풀어 쓴것 같다. Infra 단위에서는 Infrastructure as a Code(IaaC)를 말한 것 같고, Data Job단위로는 각 data에 대한 정보를 특정 저장공간에 저장하여 cloud에 존재하느 모든 cluster가 실패하여 동작을 멈추더라도 재빨리 재시작 가능하다는 점을 말하고 싶은 것으로 보인다.
2. Deployment Orchestration
3. Self-service Tooling
스크린샷. Keystone platform | 사용자가 직접 데이터 입수부터 저장까지 경로를 설정 할 수 있다.
스크린샷. Keystone self service | Spinnaker과 비슷하게 생긴 Flink code CI tool
4. Stream Processing Engines
5. Connectors, Managed Operators and Application Abstraction
그림. Directed Acyclic Graph
6. Configuration & Immutable Deployment
스크린샷. Keystone self service | kafka의 option들에 대해 환경변수를 설정 할 수 있다.
7. Self-healing
8. Backfill & Rewind
9. Monitoring & Alerting
모든 개별 스트리밍 작업에는 개인화 된 모니터링 및 경고 대시보드를 제공한다. 이를 통해 넷플릭스의 데이터 플랫폼, 데이터 인프라 팀, application을 개발하는 팀 모두 같이 문제를 진단하고 모니터랑이 가능하다.
스크린샷. 넷플릭스 데이터 플랫폼 모니터링 웹페이지
10. Reliability & Testing
Now and Future
결론
'빅데이터' 카테고리의 다른 글
Fluentd로 데이터파이프라인 구축하기 kafka→kafka→s3 (1) | 2019.09.17 |
---|---|
Fluentd vs Telegraf 차이점 알아보기 (0) | 2019.09.16 |
(번역)Netflix에서 데이터를 통해 유연하고, 안전한 클라우드 인프라로 활용하는 방법 (253) | 2019.03.22 |
모든 것을 측정하는 방법 - Bigdata시대에 부족한 data로 예측하기 (262) | 2018.12.16 |
JVM에서 MapReduce를 간편하게 쓸수 있는 오픈소스 라이브러리 Cascading (365) | 2018.11.19 |
Mongodb 기본 명령어 모음 (951) | 2018.10.30 |