druid简介
- Druid是一个快速的列式分布式的支持实时分析的数据存储系统,其在处理pb级数据、毫秒级查询、数据实时处理方面,比传统的OLAP系统有了显著的性能改进。
- 注意与阿里巴巴的数据库连接池同名项目druid做区分,两者没有任何关联。
druid的特点
- 列式存储格式:
- druid使用面向列的存储,它只需要加载特定查询所需要的列,所以查询速度很快
- 可扩展的分布式系统:
- druid通常部署在数十到数百台服务器的集群中,并提供数百万条每秒的摄取率,保留数百万条记录,以及亚秒级到秒级查询延迟
- 大规模的并行处理:
- druid可以在整个集群中进行大规模的并行查询
- 实时或批量摄取:
- druid可以实时摄取数据或批量处理数据
- 自愈、自平衡、易操作:
- 集群的扩展和缩小,只需要添加或删除服务器,集群会在后台自动重新平衡,无需任何停机时间
- 数据进行了有效的预聚合或预计算,查询速度快
- 数据结果应用了bitmap压缩算法
druid应用场景
- 清洗好的记录实时录入,但是不需要更新操作
- 支持宽表、不用join的方式(即只有一张单表)
- 可以总结出基础的统计指标且只用一个字段表示的情况
- 实时性要求性高的场景
- 对数据质量的敏感度不高的场景
druid的数据存储
- DataSource
- druid中的DataSource相当于关系型数据库中的表,DataSource的结构包括:
- 时间列:表明每行数据的时间值,默认使用UTC时间格式且精确到毫秒级别
- 维度列:维度来自于OLAP的概念,用来标识数据行的各个类别信息
- 指标列:是用于聚合和计算的列。通常是一些数字,计算操作通常包裹Count、Sum等等
- 无论是实时数据消费还是批量数据处理,druid在基于DataSource结构存储数据时即可选择对任意指标进行聚合操作,该操作主要基于维度列与时间范围两方面的情况
- druid在数据存储时就可以对数据进行聚合操作是其一大特点,该特点使得druid不光能够节省存储空间,而且能够提高聚合查询的效率
- druid中的DataSource相当于关系型数据库中的表,DataSource的结构包括:
- Segment
- 在druid中,dataSource是数据存储的逻辑结构,而segment则是数据实际物理存储的格式
- druid将不同时间范围内的数据存储在不同的segment数据块中,这便是所谓的数据横向切割,这样可以避免全表查询,极大的提高了效率
- 在segment中,也采用面向列进行数据压缩存储(bitmap压缩技术),这便是所谓的数据纵向切割
druid的框架原理
-
druid中的主要构成节点:
- MiddleManager Node:中间管理节点
- 负责及时摄入实时数据,生成segment文件
- Historical Node:历史节点
- 负责加载已生成好的数据文件以供数据查询
- historical节点时整个集群的查询性能的核心所在,因为大部分segment查询都由历史节点承担
- Broker Node:查询节点
- 负责接收客户端查询请求,并将这些查询转发给historicals 和 middle managers
- 当broker从这些子查询中收到结果时,他们会合并这些结果并将其返回给调用者
- 查询节点采用了缓存技术
- overlord node:统治者节点
- 负责监视middleManager进程,并且是数据摄入druid的控制器,他们负责将提取任务分配给middleManager并协调segment发布
- coordinator node:协调节点
- 组要负责历史节点数据负载均衡,以及通过规则管理数据的生命周期
- MiddleManager Node:中间管理节点
-
druid的一些依赖组件:
- deep storage:数据文件存储库
- 存放生成的segment数据文件,并供历史服务器下载,对于单节点集群可以是本地磁盘,对于分布式集群一般是hdfs
- metadata storage:元数据库
- 存储druid集群的元数据信息,比如segment相关的信息,一般用mysql
- zookeeper:
- 为druid集群提供协调无父,如内部服务的监控、协调与统治者的选举
- deep storage:数据文件存储库