- What is Druid
- About Druid
- Druid 주요 특성
- Druid가 어떤 경우에 적절한가?
- Druid High-level Architecture
- Druid Overview
- Data - Event
- example data set (from online advertising)
- Sharding data
- Roll-up data
- Indexing data
- Loading data
- Querying data
- Druid Cluster - Nodes
- Historical Node
- Broker Node
- Coordinator Node
- Real-time Processing
- Indexing Service
- Druid 노드들의 기본 서비스 포트
- External Dependencies
- High Availability 특성
- 참고자료
Druid는 고성능, 컬럼기반, 수평확장 가능, 분산 데이터 저장소이다.
- high-performance : ingestion and query
- column-oriented : data storing format
- horizontal scalable
- distributed data store
About Druid
Druid는 최근 데이터와 과거 데이터에 대한 질의에 수초내로 응답하기 위해 디자인된 오픈소스 데이터 저장소이다.
Druid is an open-source data store designed for sub-second queries on real-time and historical data.
It is primarily used for business intelligence (OLAP) queries on event data.
Druid provides low latency (real-time) data ingestion, flexible data exploration, and fast data aggregation.
Existing Druid deployments have scaled to trillions of events and petabytes of data.
Druid is most commonly used to power user-facing analytic applications.
Druid 주요 특성
Sub-second OLAP Queries:
- 빠른 다차원 필터링(multi-dimensional filtering)
- 여러 속성에 대한 그룹핑(ad-hoc attribute groupings)
- 고속 집계 처리(fast aggregations)
Real-time Streaming Ingestion
- 다차원, 고용량 데이터셋에 대한 데이터 저장(lock-free ingestion)과 질의 처리 지원
- 발생된 이벤트가 저장되는 즉시 탐색 가능
Power Analytic Applications
- 복수의 사용자에 대한 지원(multi-tenancy)
- 클러스터 크기에 따라서 수천명의 동시 사용자 처리 가능
Cost Effective
- 규모 확장에 대한 비용 효율성
- 비용 절감을 위해 다양한 기능을 내장
- 상용 장비를 사용한 노드 구성(commodity hardware)
Highly Available
- 동일한 역할의 노드를 여러개 실행시켜 장애 대응 가능
- 서버에 대한 순환 업데이트 가능(rolling update, server spec up/down)
- 데이터 복제본을 만들고 여러 노드에 배치시켜 노드 장애시 질의 응답성을 높임
- 데이터 서비스 노드와 데이터 저장소의 분리를 통한 안정성 도모
Scalable
- 수평 확장성(horizontal scale)
- 필요에 따라 노드를 추가하는 것이 용이함
- 더 많은 데이터를 저장/제공하고자 한다면, 데이터 노드를 추가시키면 됨(예. 새로운 히스토리컬 노드 추가)
- add more data node(e.g historical node) for serve more data
- Existing Druid deployments handle trillions of events, petabytes of data, and thousands of queries every second.
Druid가 어떤 경우에 적절한가?
- 빠른 집계 처리와 OLAP 쿼리를 필요로하는 어플리케이션의 백앤드 엔진(fast aggregation and OLAP query)
- 실시간 분석이 필요한 경우(real-time analysis)
- 대량의 데이터를 빠르게 저장, 조회해야 하는 경우
- 고가용성 저장소가 필요한 경우
Druid High-level Architecture
Druid는 수집 된 모든 데이터를 집계 및 필터 처리에 최적화 된 custom column 형식으로 색인을 만들어 저장한다.
Druid 클러스터는 Node라고 불리는 다양한 형태의 프로세스로 구성된다.
각각의 Node는 고유한 기능을 갖고, Node간의 효율적인 협력으로 Druid의 전체 기능을 제공하게 된다.
Druid Overview
Druid는 이벤트 데이터에 대한 OLAP 쿼리를 지원하기 위하여 디자인된 오픈소스 데이터 저장소이다.
아래 내용은 Druid 공식 사이트의 설명 내용을 기준으로 작성되었다.
Data - Event
기본적으로 시간값(timestamp)을 갖는 이벤트 데이터를 수집/처리/저장/조회하게 된다.
데이터는 크게 3가지 구분되는 요소로 구성된 것으로 본다.
- Timestamp column : 모든 데이터는 시간값을 갖는 시계열 데이터이다. 많은 처리가 시간축을기준으로 이루어진다.
- Dimension columns : 일반적으로 문자열 형태의 값을 갖는 컬럼을 말한다. 보통 데이터 필터링에 사용된다.
- Metric columns : 집계와 계산에 사용되는 컬럼이다. 일반적으로 숫자형태의 값을 갖는 컬럼을 말한다. OLAP 용어로는 'measure' 라고 알려져 있다.
example data set (from online advertising)
- 위 샘플 데이터에서 publisher, advertiser, gender, country 컬럼이 dimension으로 click, price 컬럼이 metric으로 볼 수 있다.
Sharding data
Druid는 shard를 Segment라고 부르며, 항상 시간을 데이터를 조각내어 다루게 된다.
Segment는 고유한 식별자로 구분되며, 위의 샘플 데이터에 대하여 1시간 간격별 데이터 조각을 나눈 예 아래와 같다.
Segment 'sampleData_2011-01-01T01:00:00:00Z_2011-01-01T02:00:00:00Z_v1_0' 는 아래 데이터를 포함한다.
ultratrimfast.com
google.com
bieberfever.com
google.com
Segment 'sampleData_2011-01-01T02:00:00:00Z_2011-01-01T03:00:00:00Z_v1_0' 는 아래 데이터를 포함한다.
ultratrimfast.com
google.com
bieberfever.com
google.com
Segment는 시간 간격에 처리된 데이터와 해당 데이터에 대한 정보를 포함하는 컨테이너이다.
Segment는 컬러기반의 압축된 형태로 저장된 데이터와 컬럼에 대한 색인(index)을 포함한다.
세그먼트는 데이터 소스, 간격, 버전 및 선택적 파티션 번호로 고유하게 식별됩니다.
Segment는 다음과 같은 값의 조합으로 고유하게 식별된다.
- 데이터소스(datasource)
- 시간간격(interval)
- 버전(version)
- 파티션번호(optional partition number)
위에서 말한 값들의 조합으로 segment 식별자를 부여한 예는 다음과 같다.
Roll-up data
Druid는 롤업(roll-up)이라고 부르는 과정을 통해 처리 시간(ingestion time)에 원시 데이터를 요약하여 저장하게 된다.
roll-up은 dimension과 interval의 조합으로 roll-up시킬 데이터를 판단하게 된다.
dimension의 조합이 같고 timestamp의 값이 같은 시간 간격안에 포함되는 데이터는 roll-up 처리된다.
roll-up에서 적용한 시간 간격은 query가능한 최소 시간 간격이 되며 Druid에서는 이것을 'queryGranularity'라고 한다.
Druid에서 지원하는 최소 queryGranularity는 millisecond 이다.
TODO: roll-up의 예
roll-up 처리의 효과
- 원본 원천 데이터는 사라진다.
- 원천 데이터 그대로의 조회는 불가능해 진다.
- 저장되는 데이터의 크기가 줄어든다.
- 저장소의 필요 크기가 줄어든다.
- 비용이 줄어든다.
Druid는 2가지 roll-up mode를 제공한다.
- perfect roll-up : Hadoop indexing task는 항상 이 방식으로 실행된다.
- best-effort roll-up : 모든 형태의 straming indexing 처리가 이 방식으로 실행된다.
Indexing data
Druid에서 저장하는 데이터(segment)는 immutable 데이터이다.
segment는 분석용 질의를 빠르게 수행하기 위하여 최적화된 형태로 데이터를 처리하여 저장한 결과이다.
- column store : query에 사용된 컬럼만 처리에 포함됨
- column 별 압축방식 적용 가능
- column 별 인덱싱 적용 가능
Druid는 segment별로 인덱스를 생성한다.
Loading data
Druid는 아래와 같은 2가지 방식의 데이터 수집/처리 방식을 갖는다.
- real-time ingestion : 데이터의 중복이 발생할 수 있다.
- batch ingestion : exactly once 처리를 보장한다.
조회시점을 기준으로 최근 데이터를 갖는 노드와 최근보다 과거의 데이터를 갖는 노드를 통해 데이터를 제공한다.
Querying data
Druid는 JSON over HTTP 방식의 고유한 DSL 형태의 query 언어를 제공한다.
Druid는 기본적으로 하나의 데이터소스(table)에 대한 query 처리를 하는 것으로 디자인되었으며, 일반적인 join은 지원하지 않는다.
따라서 join이 예상되는 데이터는 denormalization된 형태로 Druid에 적재되어야 한다.
Druid를 사용하는 많은 상용 사이트에서는 ETL 처리 과정에서 join과 관련된 작업이 이루어지도록 구성하고 있다.
Druid Cluster - Nodes
Druid Cluster는 여러 타입의 노드로 구성된다. 각각의 노드는 고유한 역할을 수행한다.
- immutable segments를 로컬 디스크에 다운로드하고 segment에 대한 load/drop/query 처리를 담당한다.
- shared nothing architecture
- Druid를 사용하는 클라이언트나 어플리케이션과 통신하며 query에 대한 처리를 담당한다.
- Broker 노드는 쿼리 대상 segment가 어디에 배치되어 있는지 알고있다.
- 쿼리를 여러 노드에 전달하고 처리된 결과를 받아 병합하여 결과를 생성/반환한다.
- 클러스터내 historical 노드에 segment를 배치(load, drop, re-balance)하는 역할을 수행한다.
- segment 배치와 관련된 메타정보를 주기적으로 확인하여 설정된 정책에 따라 segment를 배치시킨다.
Real-time Processing
- Druid는 실시간 처리를 위해 2가지 방식을 사용한다.
- 실시간 처리는 아래와 같은 것을 포함한다.
- 데이터 수집처리
- 인덱스 생성(segment 생성)
- 생성된 segment에한 이관
Druid cluster에서 데이터는 저장처리 직후 바로 질의 가능하며, segment 이관(hand-off) 과정에서 데이터는 항상 질의 가능하다.
Indexing Service
Overlord
Middle Manager
Peon
- component node of Indexing Service
- do task
- isolated JVM process
Druid 노드들의 기본 서비스 포트
- history - 8083
- broker - 8082
- coordinator - 8081
- overlord - 8090
- middleManager - 8091
External Dependencies
Druid는 cluster 운영을 위해 몇 가지 외부 컴포넌트를 사용한다.
- Zookeeper : 클러스터내의 노드간 통신이나 협업을 위해 사용된다.
- Metadata Storage : segment나 configuration에 대한 메타데이터를 저장하는데 사용한다.
- segment 생성
- coordinator가 segment load/drop 처리 대상을 메타데이터를 모니터링하여 판단
- 저장소 예> MySQL, PostgreSQL, Maria, Derby(for test)
- Deep Storage
- segment를 보관하는 영구저장소
- segment를 생성하는 서비스는 생성 완료된 segment를 deep storage에 업로드한다.
- historical 노드는 deep storage에서 segment를 다운로드받아 서비스한다.
- 저장소 예> HDFS, S3
High Availability 특성
Druid는 SPOF(Single Point Of Failure)를 고려하여 디자인되었다.
모든 Node는 동일한 타입의 노드를 여러개 실행시킬 수 있으며, 특정 노드나 타입이 다른 노드에서 문제가 발생했을 때, 전체 클러스터가 서비스 중단되는 경우는 없다.
Druid cluster 구성시 각 타입의 노드를 최소한 2개 이상 실행시킬 것을 권장한다.
참고자료