Apache Druid 소개

Apache Druid 소개 (아키텍처 개요)

Apache® Druid는 대규모 데이터셋에서 빠른 슬라이스앤다이스 분석("OLAP" 쿼리)을 실행하도록 설계된 실시간 분석 데이터베이스예요. 실시간 수집과 빠른 쿼리 성능, 높은 가용성이 중요한 곳에서 가장 자주 쓰이죠. 분석 애플리케이션 GUI의 데이터베이스 백엔드나 빠른 집계가 필요한 고동시성 API에도 흔히 쓰여요. 웨어하우스·시계열 데이터베이스·로그검색 시스템의 아이디어를 섞은 구조라 이벤트 중심 데이터에 특히 잘 어울립니다.

출처: Apache Druid 공식 문서 — Introduction to Apache Druid

본문

주요 유스케이스

유스케이스 설명
클릭스트림 분석(Clickstream analytics) 웹사이트·모바일 앱에서 사용자 행동을 분석해 탐색 패턴, 인기 콘텐츠, 사용자 참여도를 파악해요
네트워크 텔레메트리 분석(Network telemetry analytics) 네트워크 트래픽·성능 지표를 모니터링해 효율을 높이고 병목을 찾아내며 서비스 품질을 보장해요
서버 지표 저장(Server metrics storage) CPU 사용량, 메모리 사용량, 디스크 I/O, 네트워크 활동 같은 성능 지표를 모아 서버 상태를 모니터링하고 자원 배분을 최적화해요
공급망 분석(Supply chain analytics) 공급망 각 단계의 데이터로 재고 관리·물류·수요 예측을 최적화해 운영 효율을 높여요
애플리케이션 성능 지표(Application performance metrics) 소프트웨어 애플리케이션 성능을 모니터링해 개선점을 찾고 문제를 해결하며 사용자 경험을 보장해요
디지털 마케팅/광고 분석(Digital marketing/advertising analytics) 소셜 미디어·검색엔진·디스플레이 광고 등 여러 채널에서 마케팅·광고 캠페인 효과를 추적·분석해요
BI/OLAP(온라인 분석 처리) 큰 데이터셋에서 통찰을 얻고 리포트를 만들어 데이터 기반 의사결정을 지원해요
고객 분석(Customer analytics) 고객 데이터의 선호·행동·구매 패턴을 분석해 개인화 마케팅·고객 서비스·고객 유지 전략을 세워요
IoT 분석(IoT analytics) IoT 기기 데이터를 처리·분석해 기기 성능과 사용자 행동, 환경 조건을 파악하고 자동화·최적화·예지 보전을 돕니다
금융 분석(Financial analytics) 금융 데이터를 평가해 성과를 가늠하고 리스크를 관리하며 사기를 탐지하고 투자 결정을 내려요
헬스케어 분석(Healthcare analytics) 환자 결과를 개선하고 진료 전달을 최적화하며 비용을 줄이고 질병·치료의 추세와 패턴을 찾아요
소셜 미디어 분석(Social media analytics) 좋아요·공유·댓글·멘션 같은 활동을 모니터링해 감정과 브랜드 인식을 파악하고 인플루언서를 찾아요

Druid의 핵심 기능

Druid의 핵심 아키텍처는 데이터 웨어하우스, 시계열 데이터베이스, 로그검색 시스템의 아이디어를 결합한 것이에요. 주요 기능을 하나씩 살펴볼게요.

  1. 컬럼 기반 저장 형식(Columnar storage format). Druid는 컬럼지향 저장을 사용해요. 즉 특정 쿼리에 필요한 정확한 컬럼만 로드하지요. 덕분에 몇 개 컬럼만 조회하는 쿼리 속도가 크게 좋아져요. 게다가 빠른 스캔과 집계를 지원하기 위해 데이터 타입별로 컬럼 저장을 최적화해 둡니다.
  2. 확장 가능한 분산 시스템(Scalable distributed system). 흔한 Druid 배포는 수십에서 수백 대 서버로 클러스터를 이룹니다. 초당 수백만 레코드 속도로 수집하면서도 수조 개의 레코드를 보관하고, 쿼리 레이턴시는 서브초에서 수 초 이내로 유지할 수 있어요.
  3. 대규모 병렬 처리(Massively parallel processing). Druid는 각 쿼리를 클러스터 전체에서 병렬로 처리할 수 있어요.
  4. 실시간 또는 배치 수집(Realtime or batch ingestion). Druid는 실시간과 배치 방식 모두로 데이터를 수집할 수 있고, 수집된 데이터는 즉시 쿼리가 가능해요.
  5. 자가치유·자체균형·운영이 쉬움. 운영자가 서버를 추가하면 스케일아웃, 제거하면 스케일다운이 돼요. 클러스터는 다운타임 없이 백그라운드에서 자동으로 균형을 다시 맞추지요. 서버가 죽으면 시스템이 자동으로 장애를 우회하도록 데이터 경로를 돌리고 서버 교체 때까지 동작을 이어가요. Druid는 어떤 이유로든 계획된 다운타임 없이 연속 실행되도록 설계됐어요. 설정 변경이나 소프트웨어 업데이트에도 마찬가지입니다.
  6. 데이터를 잃지 않는 클라우드네이티브·내결함성 아키텍처. 수집 후 Druid는 데이터 사본을 안전하게 deep storage에 보관해요. deep storage는 흔히 클라우드 스토리지, HDFS, 공유 파일시스템이에요. 만에 하나 모든 Druid 서버가 실패해도 deep storage에서 데이터를 복구할 수 있지요. 몇 대 서버만 영향받는 제한적 장애에서는 복제 덕분에 시스템 복구 중에도 쿼리가 가능합니다.
  7. 빠른 필터링을 위한 인덱스. Druid는 Roaring 또는 CONCISE 압축 비트맵 인덱스를 사용해 여러 컬럼에 걸친 빠른 필터링·검색을 위한 인덱스를 만들어요.
  8. 시간 기반 파티셔닝. Druid는 먼저 시간으로 데이터를 분할해요. 필요하면 다른 필드를 기준으로 추가 파티셔닝도 구현할 수 있지요. 시간 기반 쿼리는 쿼리의 시간 범위와 일치하는 파티션만 접근해서 성능이 크게 좋아져요.
  9. 근사 알고리즘(Approximate algorithms). Druid는 근사 count-distinct, 근사 랭킹, 근사 히스토그램·분위수 계산 알고리즘을 포함해요. 이 알고리즘들은 메모리 사용이 제한적이고 정확 계산보다 훨씬 빠를 때가 많아요. 속도보다 정확도가 중요한 상황에서는 정확 count-distinct와 정확 랭킹도 제공합니다.
  10. 수집 시점의 자동 요약. Druid는 수집 시점에 데이터 요약을 선택적으로 지원해요. 이 요약은 데이터를 부분적으로 사전 집계해서 비용은 크게 절약하고 성능은 올려주지요.

언제 Druid를 쓸까

Druid는 다양한 규모의 회사에서 여러 목적으로 사용하고 있어요. 다음 조건이 몇 가지라도 맞는다면 Druid가 좋은 선택이 될 가능성이 높아요.

  • 삽입(insert) 속도는 매우 높지만 업데이트는 드문 경우
  • 대부분의 쿼리가 집계·리포트 쿼리인 경우 (예: "group by" 쿼리). 검색·스캔 쿼리도 있을 수 있어요.
  • 쿼리 레이턴시를 100ms에서 수 초로 목표하는 경우
  • 데이터에 시간(time) 요소가 있는 경우 — Druid에는 시간 특화 최적화와 설계 선택이 있어요.
  • 테이블이 여러 개여도 각 쿼리가 큰 분산 테이블 하나만 건드리는 경우. 쿼리가 작은 "lookup" 테이블 여러 개를 건드릴 수도 있어요.
  • URL, 사용자 ID처럼 고기수성(cardinality) 데이터 컬럼이 있고 그 위에서 빠른 카운트·랭킹이 필요한 경우
  • Kafka, HDFS, 플랫 파일, Amazon S3 같은 오브젝트 스토리지에서 데이터를 로드하려는 경우

반대로 다음 상황이라면 쓰지 않는 편이 좋아요.

  • 기본 키로 기존 레코드를 저레이턴시로 업데이트해야 하는 경우. Druid는 스트리밍 삽입은 지원하지만 스트리밍 업데이트는 지원하지 않아요. 업데이트는 백그라운드 배치 잡으로 수행할 수 있습니다.
  • 쿼리 레이턴시가 중요하지 않은 오프라인 리포트 시스템을 만드는 경우
  • "큰" 조인, 즉 큰 사실(fact) 테이블끼리 조인해야 하고 쿼리가 오래 걸려도 괜찮은 경우

더 알아보기