Apache Druid初识

角色

Overload

Overload是MiddleManager的master节点,负责索引任务管理

MiddleManager

索引节点。负责处理索引任务(数据导入)将数据转换为列式存储,负责实时segement的查询。

Coodinator

Coodinator是Historical的master节点,负责负载混哼,确保Segement在历史节点之间尽量均衡。

Historical

历史节点,负责将Segemt加载到本地,负责历史Segement的查询

Broker

查询节点,负责接受Client查询请求,将查询分解为实时和离线部分,转发给索引节点和历史节点,并汇总最终的查询结果

Router

负载均衡Client的请求,负责将请求路由到Broker、Coordinator、Overload

Apache Druid数据存储

Apache Druid数据存储的核心是基于Datasource与Segement数据存储结构。

Apache Druid中的数据存储在DataSource中,Datasource类似RDMS中的table,DataSource中就是一个个的Segement,因此Druid最基本的存储单元式Segement,存储在Historical中,按照时间划分,每个时间范围称为一个chunk(比如按天分区,则一个chunk为一天)。Segement由MiddleManager进行创建,创建过程如下:

1、转换为列式存储
2、构建bitmao索引
3、压缩数据

segement是数据实际存储结构,每个segement都是一个单独的文件,通常包含几百万行数据甚至更多。
Segement中的数据类型主要分为三种:

1:时间戳
2:维度列
3:指标列

在维度列中,维度列支持过滤和分组操作。

Apache Druid索引服务

索引服务是数据摄入创建Segement的重要方式

索引服务分为三部分组件:

  • 1:Overload组件:分配任务给MiddleManger,负责集群资源管理和任务分配
  • 2:MIddleManager组件:用于管理Peon,负责接受任务和管理本节点的资源
  • 3:Peon组件:用于执行任务,执行节点上的具体任务

Apache Druid性能优势

预聚合

Druid通过一个rool-up的处理,将原始的数据在注入的时候就进行汇总处理
Druid会把选定的相同维度的数据进行聚合操作,可减少存储的大小.
聚合前:
Apache Druid初识

:
聚合后
Apache Druid初识

列式存储

说到列时存储先说一下行式存储
传统数据库是行式存储的,比如平时使用的MySQL,对于行式存储而言,数据是以行数据为基础单元进行数据存储的,并且一行中的数据在磁盘中是连续存储的。
而对于列式存储而言则正好相反, 数据是按照列为基单元进行存储的,一列中的数据在磁盘中是连续的。
因此列式存储只需要指定查询加载指定列,避免加载一些不必要的数据,提高查询的速度,另外,Druid还对每列进行了优化存储,从而支持快速扫描和聚合。

bitmap索引

bitmap索引也叫位图索引,在Druid中主要是为了加速查询时有调价过滤的场景,Druid在生成索引文件的时候,对每个列的每个取值生成对应的Bitmap集合.
索引之前的数据:
索引之后的数据:

mmap

这里借助于零拷贝的技术,可以查看以前关于Netty中介绍的零拷贝。

cache

操作系统缓存技术。