文章目录
一、什么是Druid
二、Druid 的三个设计原则
2.1 快速查询(Fast Query)
2.2 水平扩展能力(Horizontal Scalability)
2.3 实时分析(Realtime Analytics)
三、Druid 的主要特点
四、Druid 的应用场景
4.1 主要应用
4.2 适合场景
4.3 不合适的场景
一、什么是Druid
Druid 是一个分布式的支持实时分析的数据存储系统(Data Store)。美国广告技术公司MetaMarkets 于2011 年创建了Druid 项目,并且于2012 年晚期开源了Druid 项目。Druid设计之初的想法就是为分析而生,它在处理数据的规模、数据处理的实时性方面,比传统的OLAP 系统有了显著的性能改进,而且拥抱主流的开源生态,包括Hadoop 等。多年以来,Druid 一直是非常活跃的开源项目。
Druid 的官方网站是 http://druid.io。
另外,阿里巴巴也曾创建过一个开源项目叫作Druid(简称阿里Druid),它是一个数据库连接池的项目。阿里Druid 和本问讨论的Druid 没有任何关系,它们解决完全不同的问题,因此大家不要把两者混淆了。
另外,我们还需要了解的一点:Druid是一个实时多维OLAP分析的数据处理系统。但是OLAP分析又分为关系型联机分析处理(ROLAP)、多维联机分析处理(MOLAP)两种。简单来说MOLAP需要数据预计算好为一个多维数组,典型的方式是Cube。而ROLAP就是数据本身什么样,就是什么样,通过MPP提高分布式计算能力。
Druid 走的就是 MOLAP。可以快速(实时)访问大量的、很少变化的数据的系统。并被设计为,在面对代码部署、机器故障和生产系统的其他可能性问题时,依旧能 100% 地正常提供服务。
二、Druid 的三个设计原则
快速查询(Fast Query):部分数据的聚合(Partial Aggregate)+内存化(In-emory)+索引(Index)。
水平扩展能力(Horizontal Scalability):分布式数据(Distributed Data)+ 并行化查询(Parallelizable Query)。
实时分析(Realtime Analytics):不可变的过去,只追加的未来(Immutable Past,Append-Only Future)。
2.1 快速查询(Fast Query)
对于数据分析场景,大部分情况下,我们只关心一定粒度聚合的数据,而非每一行原始数据的细节情况。因此,数据聚合粒度可以是1 分钟、5 分钟、1 小时或1 天等。部分数据聚合(Partial Aggregate)给Druid 争取了很大的性能优化空间。
数据内存化也是提高查询速度的杀手锏。内存和硬盘的访问速度相差近百倍,但内存的大小是非常有限的,因此在内存使用方面要精细设计,比如Druid 里面使用了Bitmap 和各种压缩技术。
另外,为了支持Drill-Down 某些维度,Druid 维护了一些倒排索引。这种方式可以加快AND和OR 等计算操作。
2.2 水平扩展能力(Horizontal Scalability)
Druid 查询性能在很大程度上依赖于内存的优化使用。数据可以分布在多个节点的内存中,因此当数据增长的时候,可以通过简单增加机器的方式进行扩容。为了保持平衡,Druid按照时间范围把聚合数据进行分区处理。对于高基数的维度,只按照时间切分有时候是不够的(Druid 的每个Segment 不超过2000 万行),故Druid 还支持对Segment 进一步分区。历史Segment 数据可以保存在深度存储系统中,存储系统可以是本地磁盘、HDFS 或远程的云服务。如果某些节点出现故障,则可借助Zookeeper 协调其他节点重新构造数据。
Druid 的查询模块能够感知和处理集群的状态变化,查询总是在有效的集群架构中进行。集群上的查询可以进行灵活的水平扩展。
2.3 实时分析(Realtime Analytics)
Druid 提供了包含基于时间维度数据的存储服务,并且任何一行数据都是历史真实发生的事件,因此在设计之初就约定事件一但进入系统,就不能再改变。
对于历史数据Druid 以Segment 数据文件的方式组织,并且将它们存储到深度存储系统中,例如文件系统或亚马逊的S3 等。当需要查询这些数据的时候,Druid 再从深度存储系统中将它们装载到内存供查询使用。
三、Druid 的主要特点
- 列式存储格式。Druid 使用面向列的存储,这意味着,它只需要加载特定查询所需要的列。这为只查看几列的查询提供了巨大的速度提升。此外,每列都针对其特定的数据类型进行优化,支持快速扫描和聚合。
- 可扩展的分布式系统。Druid 通常部署在数十到数百台服务器的集群中,并且提供数百万条/秒的摄取率,保留数百万条记录,以及亚秒级到几秒钟的查询延迟。
- 大规模的并行处理。Druid 可以在整个集群中进行大规模的并行查询。
- 实时或批量摄取。Druid 可以实时摄取数据(实时获取的数据可立即用于查询)或批量处理数据。
- 自愈,自平衡,易操作。集群扩展和缩小,只需添加或删除服务器,集群将在后台自动重新平衡,无需任何停机时间。
- 原生云、容错的架构,不会丢失数据。一旦Druid 吸收了您的数据,副本就安全地存储在深度存储中(通常是云存储、HDFS 或共享文件系统)。即使每个Druid 服务器都失败,也可以从深层存储恢复数据。对于仅影响少数Druid 服务器的更有限的故障,复制确保在系统恢复时仍然可以执行查询。
- 用于快速过滤的索引。Druid 使用CONCISE 或Roaring 压缩位图索引来创建索引,这些索引可以快速过滤和跨多个列搜索。
- 近似算法。Druid 包括用于近似计数、近似排序以及计算近似直方图和分位数的算法。这些算法提供了有限的内存使用,并且通常比精确计算快得多。对于准确度比速度更重要的情况,Druid 还提供精确的计数-明确和准确的排名。
- 插入数据时自动聚合。Druid 可选地支持摄取时的数据自动汇总。预先汇总了您的数据,并且可以导致巨大的成本节约和性能提升。
四、Druid 的应用场景
Druid 应用最多的是 类似于广告分析创业公司MetaMarkets 中的应用场景,如广告分析、互联网广告系统监控以及网络监控等 。当业务中出现以下情况时,Druid 是一个很好的技术方案选择:
- 需要交互式聚合和快速探究大量数据时;
- 具有大量数据时,如每天数亿事件的新增、每天数10T 数据的增加;
- 对数据尤其是大数据进行实时分析时;
- 需要一个高可用、高容错、高性能数据库时。
目前从 Apache Druid 官网看到有 100 多家企业都在使用,也包括了很多国内的公司,例如 BAT、字节跳动、知乎、优酷、小米、Oppo、有赞、作业帮等等,大概占到 10% 左右。
4.1 主要应用
点击流分析(Web 和 移动端分析)
网络遥测分析(网络性能监控)
服务器指标存储
供应链分析(制造指标)
应用程序性能指标
数字营销 / 广告分析
商业智能 / OLAP
4.2 适合场景
插入率很高,但更新并不常见
大多数查询都是聚合查询和 groupBy 分组查询,包括搜索和扫描查询
查询响应时间为百毫秒~几秒钟之间
时序数据
可能有多个表,但是每个查询仅命中其中某一个表
具有高基数数据列(例如 URL,用户 ID 等),并且需要对其进行快速计数和排序
要从 Kafka,HDFS,本地文件或 Amazon S3、AliyunOSS 之类的对象存储中加载数据
Apache Druid 支持将 groupBy 查询的中间结果溢出存储至磁盘,以应对大查询导致的内存资源不足。通过 druid.query.groupBy.maxOnDiskStorage 配置项可以控制对应的磁盘空间大小,默认值为 0,表示不开启该特性。
4.3 不合适的场景
使用主键对现有记录进行低延迟更新。 Druid 支持流式插入,但不支持流式更新(使用后台批处理作业完成更新)
正在构建脱机报告系统,此时查询延迟不是很重要
需要进行大的联接查询(将一个大事实表连接到另一个大事实表),并且可以花很长时间来完成这些查询