写点什么

多维分析利器 Druid

  • 2022 年 9 月 22 日
    北京
  • 本文字数:1952 字

    阅读完需:约 6 分钟

多维分析利器Druid

Druid 是一个用于大数据实时查询与分析的分布式列式数据存储系统。为了应对海量数据的实时查询和多维分析,Druid 应运而生。 Druid 诞生于 MetaMarkets 公司,而互联网广告分析正是 MetaMarkets 最重要的业务之一,基于同样的业务需求背景,微博广告也开始尝试将 Druid 作为监控平台后端数据引擎的技术方案之一。


一、Druid 特性

Druid 的特性如下:

  • 支持部分嵌套数据结构的列式存储。

  • 进行剪枝的分布式层级查询。

  • 通过索引快速过滤。

  • 数据的实时摄入和查询。 容

  • 错分布式架构确保数据不丢失。

  • 水平扩展。

二、Druid 架构

1、Druid 节点组成

Druid 是一个分布式系统,由多个角色的节点组合而成,每个节点都只关心自己的工作。Druid 架构示意图如下。


  • 实时节点:实时节点提供实时的索引服务,通过这些节点索引的数据可以立即用于查询。实时节点将在一定时间内收集到的数据生成一个 Segment 数据文件,并将这个 Segment 数据文件发送到历史节点中。通过 ZooKeeper 监控传输和元数据库来存储被发送的 Segment 数据文件的元数据。发送完成后,实时节点就会丢弃被发送的 Segment 数据文件。

  • 历史节点:存储和查询历史数据。历史节点不与其他节点直接通信,而是通过与 ZooKeeper 保持一个长连接,实时观察指定路径下的新 Segment 数据文件信息。当历史节点注意到 ZooKeeper 指定队列路径下有一个条目时,首先它会检查本地缓存中是否存在该 Segment 数据文件的元信息,如果本地缓存中不存在新 Segment 数据文件的元信息,那么历史节点将从 ZooKeeper 中读取新 Segment 数据文件的元信息到本地,并根据下载到本地的 Segment 数据文件的元信息去 Deep Storage 中拉取 Segment 数据文件。最后,历史节点会通过 ZooKeeper 向集群宣布,它将提供该 Segment 数据文件的查询服务。

  • 协调节点:主要负责 Segment 数据文件的加载、删除,管理 Segment 数据文件副本和平衡各历史节点的 Segment 数据文件。协调节点根据配置文件中指定的参数定期运行,每次运行,它都会监测集群状态,并采取相关的动作。协调节点通过 ZooKeeper 来获取集群信息,同时还会保持与存储可用段表和规则表的数据库的连接。协调节点不会直接与历史节点通信,它会根据规则、容量等信息指定历史节点,并在 ZooKeeper 中该历史节点的队列路径下生成关于 Segment 数据文件的临时信息。历史节点看到这些临时信息,就会去拉取 Segment 数据文件。

  • 代理节点:接收客户端的查询请求,并路由请求到实时节点或历史节点。代理节点通过 ZooKeeper 知道每个 Segment 数据文件存在于哪个节点上。代理节点还用于聚合每个节点返回的结果,再将聚合后的结果集返回给客户端。代理节点还可以通过配置缓存来存储历史节点查询的结果,提高了相同查询的效率。

  • 索引服务节点:索引服务是一个高可用的分布式服务,运行与索引相关的任务。索引服务是一个主/从架构。索引服务由三个组件组成,即运行一个任务的 peon 组件、管理 peon 的 Middle Manager 组件和管理任务分配给 Middle Manager 的 Overlord 组件。其中 Middle Manager 和 peon 组件必须在同一个节点上。

2、外部依赖
  1. ZooKeeper 集群:用于集群服务的发现和当前数据拓扑的维护。

  2. Metadata Storage:用于存储数据文件的元数据,但是不存储实际的数据。可以使用 MySQL 或者 PostgreSQL 作为 Metadata Storage。Metadata Storage 一般会存储以下几个表。

  • Segments Table:Segment 数据文件的元信息表。

  • Rule Table:Segment 数据文件的存储规则表。

  • Config Table:配置表,用于存储运行时的配置对象。

  • Task-related Table:索引服务创建并使用到的表。

  • Audit Table:审计表,用于存储配置变化的审计历史记录。

  1. Deep Storage:用于存储 Segment 数据文件。


3、Segment 传输过程

Segment 传输过程如下图。


实时数据写入后的 Segment 传输流程如下:

  1. 实时节点将在一定时间内收集到的数据生成一个 Segment 数据文件,并发送到 Deep Storage,同时将该 Segment 数据文件的元信息发送到元数据库中。

  2. 协调节点从元数据库中获取新的 Segment 数据文件的元信息,根据规则分配该 Segment 数据文件存储的历史节点,并将元数据写入在 ZooKeeper 上创建的一个临时节点中。

  3. 历史节点从 ZooKeeper 的临时节点中读取元数据,去 Deep Storage 中拉取指定的 Segment 数据文件,并删除在 ZooKeeper 上创建的临时节点。

4、DataSource

在 Druid 中,数据是存储在每个 DataSource 中的,而一个 DataSource 就相当于 MySQL 的一个总表。每个 DataSource 都会包含下面三部分信息。

  • Timestamp:存储指标的 UTC 时间列,可以精确到毫秒。

  • Dimension:存储指标的维度列。

  • Metric:指标列,用来聚合计算。

5、Segment

DataSource 描述的是数据的逻辑结构,而 Segment 则体现了数据的物理存储方式。Druid 通过 segmentGranularity 参数来设置 Segment 划分的时间范围,而 Druid 查询也正是通过指定的时间范围来确认需要查询的 Segment 数据文件的,减小了查询的数据量,提高了查询的效率。


发布于: 刚刚阅读数: 4
用户头像

InfoQ签约作者 2018.11.30 加入

热爱生活,收藏美好,专注技术,持续成长

评论

发布
暂无评论
多维分析利器Druid_Druid_穿过生命散发芬芳_InfoQ写作社区