Druid 是一个高性能实时分析数据库。它是为大型数据集上实时探索查询的引擎,提供专为 OLAP 设计的开源分析数据存储系统,它的设计意图是在面对代码部署、机器故障以及其他产品系统遇到不测时能保持100%正常运行。它也可以用于后台用例,但设计决策明确定位线上服务。
1、角色
1.1 Overload
Overload是MiddleManager的master节点,负责索引任务管理
1.2 MiddleManager
索引节点。负责处理索引任务(数据导入)将数据转换为列式存储,负责实时segement的查询。
1.3 Coodinator
Coodinator是Historical的master节点,负责负载混哼,确保Segement在历史节点之间尽量均衡。
1.4 Historical
历史节点,负责将Segemt加载到本地,负责历史Segement的查询
1.5 Broker
查询节点,负责接受Client查询请求,将查询分解为实时和离线部分,转发给索引节点和历史节点,并汇总最终的查询结果
1.6 Router
负载均衡Client的请求,负责将请求路由到Broker、Coordinator、Overload
2、数据存储
Apache Druid数据存储的核心是基于Datasource与Segement数据存储结构。
Apache Druid中的数据存储在DataSource中,Datasource类似RDMS中的table,DataSource中就是一个个的Segement,因此Druid最基本的存储单元是Segement,存储在Historical中,按照时间划分,每个时间范围称为一个chunk(比如按天分区,则一个chunk为一天)。Segement由MiddleManager进行创建,创建过程如下:
-
1、转换为列式存储
-
2、构建bitmap索引
-
3、压缩数据
segement是数据实际存储结构,每个segement都是一个单独的文件,通常包含几百万行数据甚至更多。
Segement中的数据类型主要分为三种:
-
时间戳
-
维度列
-
指标列
在维度列中,维度列支持过滤和分组操作。
3、索引服务
索引服务是数据摄入创建Segement的重要方式
索引服务分为三部分组件:
-
Overload组件:分配任务给MiddleManger,负责集群资源管理和任务分配
-
MIddleManager组件:用于管理Peon,负责接受任务和管理本节点的资源
-
Peon组件:用于执行任务,,执行节点上的具体任务
4、性能优势
1.1 预聚合
Druid通过一个rool-up的处理,将原始的数据在注入的时候就进行汇总处理。
Druid会把选定的相同维度的数据进行聚合操作,可减少存储的大小。
聚合前:
聚合后
1.2 列式存储
说到列时存储先说一下行式存储
传统数据库是行式存储的,比如平时使用的MySQL,对于行式存储而言,数据是以行数据为基础单元进行数据存储的,并且一行中的数据在磁盘中是连续存储的。
而对于列式存储而言则正好相反, 数据是按照列为基单元进行存储的,一列中的数据在磁盘中是连续的。
因此列式存储只需要指定查询加载指定列,避免加载一些不必要的数据,提高查询的速度,另外,Druid还对每列进行了优化存储,从而支持快速扫描和聚合。
1.3 bitmap索引
bitmap索引也叫位图索引,在Druid中主要是为了加速查询时有条件过滤的场景,Druid在生成索引文件的时候,对每个列的每个取值生成对应的Bitmap集合.
索引之前的数据:
索引之后的数据:
1.4 mmap
这里借助于零拷贝的技术,可以查看以前关于Nett中介绍的零拷贝。Netty学习之搞懂零拷贝原理
1.5 cache
操作系统缓存技术。