概念
druid是基于olap的数据库查询系统。有点类似现在开源的kylin。下面我先简单介绍druid的一下基本概念,一些我认为需要重点展开和了解的,在后面会有章节具体介绍。
数据结构
druid里面的存储的数据结构,我直接拿了官方的例子
熟悉olap概念的话,可以看到上面的数据可以分成三部分,分别是
Timestamp column:时间戳列,我们所有的查询都需要围绕这个时间去做
Dimension columns: 维度列,publisher, advertiser, gender, and country这几个字段都属于这部分,通俗点就是作为你的查询条件的并且不需要做聚合运算的字段。
Metric columns:度量列,如果你需要对click和price做求和或者其他聚合运算的话,是可以把这些字段作为度量列的。
分片
上面说明了druid它的数据的一个表现形式,现在就来了解一下它的存储方式。
druid它是按照一个个分片(segment)来存储的,这个和elasticsearch是类似的,目前我们使用的话,是按照天来划分的,也就说timeStamp在同一天的话会分配到同一个分片里面,这个粒度可以根据你们数据量大小做调整,官方是建议一个分片的大小在700m左右。
dataSource_interval_version_partitionNumber 这个是分片的命名的格式。
roll-up
在大部分时候,druid获取的每条的数据的详情你是不关心的,你需要的是在某个粒度下某些维度聚合后的结果。类似下面这种结果
这样的话,你就可以大大的节省存储空间,查询速度也会有大大的提高,当然损失的就是你查不了每条原始数据了。以上都可以通过配置文件配置,后面会专门说明这块。
数据查询
durid原始支持http请求查询,也提供了其它语言的查询接口,具体可用到官方文档查http://druid.io/libraries.html
druid 集群
druid集群只要以下不同类型的节点组成,每个节点负责的事情也不一样。
Historical Nodes :历史数据节点的主要是通过zk获得自己需要的元数据,然后去下载或者删除相关的分片,并负责响应来自broker查询的请求
Broker Nodes:接受来做客户端的查询请求,分析请求后,把请求分发到对应分片的历史数据节点或者实时节点,响应返回后再对结果进行合并。
Coordinator Nodes :负责管理存放在历史数据节点的分片数据,管理分片的分配。
Real-time Processing:实时处理节点,可以由自带的realtime nodes 或者 indexing service去做,主要职责是负责实时数据的摄取,为数据创建索引,将处理好的数据发往历史数据节点,接收来自broker的查询请求。
安装
druid原生的安装过程比较繁琐,所以用的是一个叫imply的安装包,基本上一键安装。地址
这样的话,你就可以大大的节省存储空间,查询速度也会有大大的提高,当然损失的就是你查不了每条原始数据了。以上都可以通过配置文件配置,后面会专门说明这块。
数据查询
durid原始支持http请求查询,也提供了其它语言的查询接口,具体可用到官方文档查http://druid.io/libraries.html
druid 集群
druid集群只要以下不同类型的节点组成,每个节点负责的事情也不一样。
Historical Nodes :历史数据节点的主要是通过zk获得自己需要的元数据,然后去下载或者删除相关的分片,并负责响应来自broker查询的请求
Broker Nodes:接受来做客户端的查询请求,分析请求后,把请求分发到对应分片的历史数据节点或者实时节点,响应返回后再对结果进行合并。
Coordinator Nodes :负责管理存放在历史数据节点的分片数据,管理分片的分配。
Real-time Processing:实时处理节点,可以由自带的realtime nodes 或者 indexing service去做,主要职责是负责实时数据的摄取,为数据创建索引,将处理好的数据发往历史数据节点,接收来自broker的查询请求。
安装
druid原生的安装过程比较繁琐,所以用的是一个叫imply的安装包,基本上一键安装。地址