Druid是为处理海量时间序列数据而设计的一款开源的OLAP系统。它是分布式处理系统,在设计之初就采纳了线性扩容和高可用的设计方案。集群的规模可以随着业务的增长而动态增加。要查询的数据集都做了分片(partition)和副本(replication),可以在集群部分机器down机之后,查询服务依然可用。Druid采用模块化设计的理念,模块之间的依赖通过Guice依赖注入框架自动进行,Druid支持用户自定义的组件,方便用户扩展。
Druid擅长按照不同的时间粒度(Time Granularity)和各种维度(Dimensions)组合去查询聚合数据,不擅长原始数据的查询。Druid的实时性体现在两个方面。一是Druid查询的响应时间非常快,大部分查询会在10s以内返回。二是能够查询的数据的时效性非常高,进入Druid采集系统的数据,就能被立即查询到,延迟在ms级别。
数据源
Druid仅支持时间序列类型的数据源,例如
时间(timestamp)列标示事件发生的时间,必须存在。该数据在进入采集系统后,会按照配置的时间粒度(半小时,小时,天,周,月,年等)进行聚合。
维度(dimensions)列标示数据里面的维度信息,一般为string类型。
度量(metrics)数据标示数据里面的各种度量信息,数据一般为数据类型
Druid系统在做数据查询时,一般会按照时间粒度和维度做分组,然后在各个分组内部聚合度量数据,聚合的方法有sum,mean,max,min等。Druid系统也支持自定义的聚合函数。
核心服务
Druid的核心服务有两种:数据采集服务和数据查询服务,为了保证数据的时效性,所有采集服务的数据均可以被查询系统所查询。Druid系统服务内部有一系列相互独立的服务进程构成,进程之间不会直接通信(比如RPC),而是通过zookeeper进行间接通信。查询的接口以restapi的方式提供给上层。
数据采集服务
时间序列数据通过采集服务进入到Druid集群。Druid不保存时间序列的原始信息,仅保存聚合之后的数据集。聚合一般按照时间和数据维度进行。为了加快查询的速度,Dr