Apache Druid 用于驱动实时分析应用,这些应用需要在高负载下对流数据和批处理数据进行大规模的快速查询。Druid 在其摄取、存储和查询层中采用独特的分布式架构,以处理大规模聚合所需的规模,并提供应用所需的性能。

Druid 是一种基于服务的架构,包含可独立扩展的摄取、查询和编排服务,每一项都可以进行微调,以优化混合用例和工作负载的集群资源。例如,随着工作负载的变化,可以为 Druid 的查询服务分配更多资源,而减少摄取服务的资源。Druid 服务的故障不会影响其他服务的运行。
Druid 部署是一个由商用硬件组成的可扩展集群,其中的节点类型执行特定功能。在小型配置中,所有这些节点可以运行在单台服务器(甚至是笔记本电脑)上。对于更大的部署,每个节点类型可以专用一台或多台服务器,并可扩展至数千个节点,以满足更高的吞吐量需求。
- Master 节点:管理数据可用性和数据摄取
- Query 节点:接收查询,管理整个系统的执行,并返回结果
- Data 节点:执行摄取工作负载和查询,并存储可查询的数据
此外,Druid 利用深度存储层(云对象存储或 HDFS)来存储每个数据段的额外副本。它实现了 Druid 进程之间的数据后台迁移,并提供了一个高持久性的数据源,以便在系统故障时进行恢复。
欲了解更多信息,请访问我们的文档页面。
摄取层
在 Druid 中,摄取(有时称为索引)是将数据加载到表中的过程。Druid 从源系统(无论是文件还是流)读取数据,并将数据存储在段(segments)中。
当数据被摄取到 Druid 时,它会自动进行索引、分区,并可选择性地进行部分预聚合(称为“rollup”)。压缩位图索引支持跨多列的快速过滤和搜索。数据按时间分区,也可选择按其他维度分区。

流数据
Druid 从设计之初就旨在实现流数据的快速摄取和即时查询。无需连接器,因为 Druid 内置了使用 Apache Kafka® 和 Amazon Kinesis API 进行流数据“精确一次”(exactly-once)摄取的功能。Druid 持续备份到深度存储也确保了流数据的零 RPO(恢复点目标)。
批处理数据
Druid 可以轻松从包括 HDFS、Amazon S3、Azure Blob 和 Google Cloud Storage 在内的对象存储中,以及数据库和其他来源的数据文件中摄取数据。数据文件可以是多种常见格式,包括 JSON、CSV、TSV、Parquet、ORC、Avro 和 Protobuf。Druid 同时支持 SQL 批处理导入和库内转换。
欲了解更多信息,请访问我们的文档页面。
存储格式
Druid 将数据存储在段(segments)中。每个段都是一个独立的文件,通常包含多达几百万行数据。每个 Druid 表可以拥有从一个到数百万个分布在集群中的段。
在段内部,数据存储是列式的。查询仅加载每个请求所需的特定列。每列的存储都根据数据类型进行了优化,这进一步提高了扫描和聚合的性能。字符串列使用压缩字典编码存储,而数字列则使用压缩原始值存储。

欲了解更多信息,请访问我们的文档页面。
交互式查询
Druid 的交互式查询引擎用于性能敏感型查询。查询引擎和存储格式是共同设计的,旨在以最少的资源实现最大的查询性能(以及在混合工作负载下实现最佳的性价比)。
通过此引擎,Druid 仅从预加载到 Data 节点内存或本地存储中的段读取数据。这确保了快速性能,因为数据与计算资源位于同一位置,无需跨网络移动。随后使用散发/聚集(scatter/gather)方式查询数据,以实现最佳的并行化。

首先,查询引擎会修剪段列表,根据时间间隔和其他过滤器创建与查询相关的段列表。接下来,查询被拆分为离散的片段,并行发送到管理每个相关段或段副本的 Data 节点(“散发”)。在 Data 节点上,子查询被处理并发送回 Query 节点以合并最终结果集(“聚集”)。
散发/聚集机制适用于从最小的单服务器集群(整个 Druid 运行在一台服务器上)到拥有数千台服务器的集群,即使在处理数 PB 的超大规模数据集时,也能为大多数查询实现亚秒级的响应性能。
欲了解更多信息,请访问我们的文档页面。