세션명: Imply Druid를 활용한 실시간 데이터 분석과 당근마켓 사례
일시: 2024.05.17 16:30 ~ 17:00
장소: 코엑스 Level 100, 그랜드볼룸 105호
작성자 : [CTC 1Team/박창훈]
최근 Imply 클러스터를 구축하는 프로젝트를 진행했었습니다. 클러스터를 구축하면서 다른 회사는 Imply를 어떤 형태로 실시간 집계 분석하고 활용하는지 알고싶었는데 마침 당근마켓 사례를 들을 수 있는 기회가 생겨 참관하였습니다.
먼저 분석 애플리케이션은 여러 측면에서 필요성을 가질 수 있습니다.
첫째, 서비스가 성장하고 데이터 양이 증가하면서 사용자들에게 빠른 응답 속도가 요구됩니다. 테라바이트와 페타바이트 규모의 데이터에서도 실시간으로 응답이 필요하게 됩니다.
둘째, 동시성이 늘어나고 있기 때문에 여러 사용자가 동시에 데이터에 접근할 수 있어야 합니다. 또한 이는 비용 효율적으로 처리되어야 합니다.
셋째, 실시간 데이터를 의미 있는 정보로 가공하기 위해서는 과거 데이터의 집계가 필요합니다. 이를 통해 비즈니스에 대한 통찰력을 얻을 수 있습니다.
종합해보면, 분석 애플리케이션을 사용할 때는 빠르고 안정적인 시스템이 필요하다는 것이 핵심입니다. 이를 바탕으로 Druid는 분석 애플리케이션을 위해 개발되었으며, 기존 트랜잭션 DB와는 다른 의미 있는 데이터 분석과 애플리케이션 지원을 제공하고 있습니다.
빅데이터는 데이터를 다루고 처리하는 ETL 파이프라인에서 수집부터 분석까지 다양한 기술이 필요한 분야입니다. ETL 처리하기 위해서는 트랜잭션 DB부터 SQL 엔진, DW 엔진, 빅데이터 쿼리 엔진 등 다양한 분석 기술이 있지만 중간 영역에서 실시간으로 이벤트 데이터를 수집하면서 고급 분석을 지원하기 위해 설계된 것이 Druid입니다.
이러한 실시간 분석 솔루션을 위해 Druid를 통한 도입을 고려하는 당근마켓에게 Imply는 빠른 시간 안에 비즈니스 요구 사항을 충족시킬 수 있습니다. 특히 POC를 통해 비즈니스 요구 사항을 충족시키며 리소스를 적게 사용할 수 있습니다.
도입 후에는 주기적인 Druid 클러스터 리뷰를 통해 쿼리 최적화와 데이터 처리 등을 고려하며 운영을 진행했습니다. 특히 당시 당근마켓은 개발 타임라인이 타이트하고 내부 DB를 운영하는 엔지니어가 1명이었기 때문에 특정 기술과 경험자에 대한 의존을 해소하기 위해 Druid 인프라를 도입하여 이러한 문제를 해결하였습니다.
당근마켓의 AS-IS에서는 사전에 정의한 집계 방식을 알아야만 했습니다. 또한 해당 배치를 통한 집계 결과에만 빠르게 조회할 수 있었으나, 고도화된 광고 플랫폼에서는 지역, 성별, 연령대 등 다양한 차원에서 실시간으로 조회하고 보고서를 다운로드해야 했습니다.
이에 대한 요청이 들어올 때마다 모든 차원이 실시간으로 조회되어야 하며, 처리 시간은 20~300ms 안에 이루어져야 합니다. 또한 다이나모 DB 한 다큐먼트 사이즈의 제한이 400k바이트였는데, 이를 넘어가는 경우가 있었기 때문에 이러한 문제들을 해결하기 위해 Druid를 도입했습니다.
현재 당근에서는 하루에 1.5억 개의 이벤트를 Druid에 실시간으로 수집하고 있습니다. 이전에는 기존의 Druid 스키마를 사용하지 않아 비즈니스 로직에 맞게 재설계되었고, 카카오 이벤트가 실시간으로 인덱싱되어 광고주가 필요할 때 바로 조회할 수 있게 되었습니다.
도입 후 약 1년 7개월이 지난 현재, 530억 개의 데이터셋을 운영하며, 성능은 대부분의 경우에 250에서 300ms 미만의 쿼리 퍼포먼스를 제공하고 있습니다. 이로써 광고주에게 필요한 성과를 실시간으로 제공하고 있습니다
다음 장부터 Druid의 핵심 기능을 설명드리겠습니다.
Druid 기능으로 Nested Column은 데이터를 JSON 형태로 저장하는 기능으로, 스키마를 일반적인 형태로 정하지 않고 JSON 그대로를 한 컬럼에 넣어주는 역할을 합니다. 이러한 기능은 데이터가 자주 변경되거나 일정한 형태로 정의하기 어려운 경우에 유용하게 사용됩니다. 예를 들어 광고 AB 테스트나 타겟팅 정보와 같이 메타데이터 형태의 정보를 유연하게 저장하고 활용할 수 있습니다.
Multi Stage Query Engine을 통해 Ingestion하면 Worker 개수나 다른 설정을 조절하면서 SQL 문법을 사용하여 다양한 형태의 웹 데이터를 처리할 수 있습니다. 이미 존재하는 데이터에 추가된 데이터를 중복 제거하고 필요에 따라 데이터를 늘리거나 조절할 수 있습니다. 이를 통해 대량의 데이터를 빠르게 처리할 수 있습니다.
Druid의 Query From Deep Storage는 하드웨어 용량 한계로 인해 오래된 데이터는 주로 하드웨어에 유지되는 반면, 이 기능을 사용하면 하드웨어와 Cold티어 데이터를 함께 조회할 수 있습니다. 이를 통해 Async하게 수행하고 결과를 S3에 저장할 수 있습니다. 또한 쿼리 워커의 개수를 지정하여 저장 속도를 높일 수 있습니다. 이 기능은 대용량 보고서 다운로드와 같은 광고 시스템에서 유용하게 활용될 수 있습니다.
마치며
이 세션을 통해 Imply Druid의 활용성과 가치에 대해 많은 것을 배웠습니다. 먼저, 당근마켓의 사례를 통해 보았듯이, Imply Druid는 대량의 데이터를 실시간으로 처리하고 의미 있는 분석 결과를 제공하는 데 뛰어난 성능을 보여줍니다. 특히, 클러스터를 구축하고 운영하는 과정에서 발생하는 다양한 문제를 효과적으로 해결할 수 있다는 점이 인상적이었습니다.
서비스 성장과 데이터 양의 증가로 인해 빠른 응답 속도와 실시간 분석이 점점 더 중요해지고 있는 시대에, Imply Druid는 이러한 요구를 충족시키는 솔루션 중 하나입니다.
Imply Druid의 활용 방안으로는 서비스 성능 모니터링 및 개선, 사용자 행동 분석, 광고 성과 분석 등 다양한 분야에서 Imply Druid를 활용하여 실시간으로 데이터를 분석하고 비즈니스 의사결정을 지원할 수 있습니다. 또한, 다양한 데이터 소스와의 연동 및 데이터 품질 관리, 보안 및 규정 준수 등을 고려하여 종합적인 솔루션을 제공할 수 있을 것 같습니다