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会把选定的相同维度的数据进行聚合操作,可减少存储的大小.
聚合前:
:
聚合后
列式存储
说到列时存储先说一下行式存储
传统数据库是行式存储的,比如平时使用的MySQL,对于行式存储而言,数据是以行数据为基础单元进行数据存储的,并且一行中的数据在磁盘中是连续存储的。
而对于列式存储而言则正好相反, 数据是按照列为基单元进行存储的,一列中的数据在磁盘中是连续的。
因此列式存储只需要指定查询加载指定列,避免加载一些不必要的数据,提高查询的速度,另外,Druid还对每列进行了优化存储,从而支持快速扫描和聚合。
bitmap索引
bitmap索引也叫位图索引,在Druid中主要是为了加速查询时有调价过滤的场景,Druid在生成索引文件的时候,对每个列的每个取值生成对应的Bitmap集合.
索引之前的数据:
索引之后的数据:
mmap
这里借助于零拷贝的技术,可以查看以前关于Netty中介绍的零拷贝。
cache
操作系统缓存技术。