什么是Apache Druid?
Apache Druid是一个专为大数据集的快速切片分析(OLAP查询)而设计的实时分析数据库。Druid作为数据库,最常用于支持以下用例:实时摄取、快速查询和高运行时长。例如,Druid一般用于支持分析型应用程序的GUI,或是需要快速聚合的高并发API后台。Druid最适合用于面向事件的数据。
Druid常见的应用领域包括:
- 点击流分析(Web和移动分析)
- 网络遥测分析(网络性能监视器)
- 服务器指标存储
- 供应链分析(制造指标)
- 应用程序性能指标
- 数字市场营销/广告分析
- 商业智能/OLAP
Druid的核心体系架构包括了数据仓库、时间序列数据库和logsearch系统的概念。Druid的关键特性包括:
- 列式存储方式。
Druid使用列式存储,意味着它只需要装载查询所需要的特定列。这就使查询特定几列时的效率有了极大提升。另外,针对每一列的数据类型都做了存储优化,因此支持快速遍历与聚合。 - 可扩展的分布式系统。
Druid一般被部署在十到百个服务器的集群中,并且可以提供每秒数百万条记录的摄取率,保留数以万亿计的记录,并且查询延迟在毫秒至数秒之间。 - 大规模并行处理。
- Druid可以在一个集群并行处理一个查询。
实时或批摄入。Druid可以摄入实时数据(摄入的数据可立即用于查询)或是批数据。 - 自愈、自平衡、易于操作。
操作者无论是扩展还是缩小集群,简单的增加或是减少服务器,集群都将在后台自动的保持均衡,而无需停机进行恢复。如果任何Druid服务器宕机,系统将自动绕过损坏机器,直到这些服务器可以被替换。Druid可以7*24小时运行而无需中途停机,就算配置变化和软件更新也无需停机。 - 云原生,不会丢失数据的容错体系架构。
一旦Druid摄取了你的数据,其副本就被安全的存储在了deep storage(典型的云存储,HDFS,或一个共享的文件系统)。即使是每一个Druid服务器都宕机了,你的数据也可以从deep storage中恢复过来。由于大部分的宕机影响的仅仅是一部分Druid服务器,副本确保了当系统恢复之后查询功能依然可用。 - 可用于快速筛选的索引。
Druid使用Concise或Roaring压缩位图索引来创建索引,该索引可以加强快速过滤与搜索多个列。 - 基于时间的分区。
Druid的第一个分区数据是时间,而且可以添加其他域的分区。这意味着基于时间的查询只会访问匹配了查询时间范围的分区。这可以显著的提升基于时间的数据查询性能。 - 近似算法。
Druid包含了近似计数、近似排名、计算的近似直方图和分位数。这些算法只用较小的内存,通常可以显著地快于精确计算。由于有些场景是精确度比计算速度更重要,Druid也提供了精确计数与精确排名。 - 在摄取时间自动汇总。
Druid支持在摄取数据时间自动汇总(可选地)。这个汇总可以预聚合你的数据,并且可以大量的节约成本与提升性能。
何时使用Druid?
当前有许多不同规模的公司正在针对许多用例使用Druid。可以查看Powered by Apache Druid页面。
如果你的用例符合以下所描述的,那么Druid就是很好的选择:
- 插入的频率很高,但是更新较少。
- 你的大多数查询是聚合或是报告查询(“group by查询”),或者也包括查找和遍历查询。
- 你希望查询延迟在100ms到数秒之间。
- 你的数据有时间元素(Druid专门针对时间相关数据做了设计与优化)。
- 你或许拥有多个表,但是每次查询只命中一个大的分布式表。查询可能命中多个较小的“查找”表。
- 你拥有高基数列(例如URL或用户ID等),并且需要对它们快速计数或排名。
- 你需要从Kafka、HDFS、平面文件或如Amazon S3这样的对象存储中读取数据。
而以下这些情况就说明你不适合选用Druid:
- 你需要对现存记录利用主键做低延迟更新。Druid支持流数据插入而非流数据更新(更新需使用后台批处理方式)。
- 你在构建一个离线的查询系统,该系统对查询延迟没有很高要求。
- 你需要做“大”Join操作(大表和大表做Join操作),并且你能够容忍这些查询需要较长时间。