实时分析性数据库 Druid 架构解析

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Druid 是一个实时分析型的数据库,用于大规模实时数据导入、快速查询分析的场景,包括网站访问点击流分析、网络性能监控分析、应用性能指标存储与分析、供应链分析、广告分析等。 ![image.png](https://intranetproxy.alipay.com/skylark/lark/0/2020/png/34834/1600427846485-f227ea8b-07c5-47

Druid 是一个实时分析型的数据库,用于大规模实时数据导入、快速查询分析的场景,包括网站访问点击流分析、网络性能监控分析、应用性能指标存储与分析、供应链分析、广告分析等。

image.png

Druid 的核心集成了数据仓库、时序数据库、日志搜索系统的设计,主要包含如下特性:

  1. 列式存储:Druid 使用列存方式组织数据,访问时可按需加载访问到的列,支持快速的扫描和聚合计算能力;同时数据按列式存储,能极大的提升数据的压缩率。
  2. 分布式可扩展:Druid 集群可扩展至上百台服务器,可以高并发出力读写请求,提供每秒百万级的数据导入,以及亚秒级的查询延时。
  3. 支持实时及批量导入:Druid 支持实时或批量方式导入数据,非常方便点支持从 Kafka、Hadoop 等数据源导入数据。
  4. 高可用&负载均衡:Druid 集群支持在线的增加、移除服务节点,集群会进行自动的负载均衡,当有节点故障时,Druid 通过也可通过多副本高可用的方式自动 Failover。
  5. 云原生架构:Druid 将数据存储在外部 Deep Storage(例如 云存储、HDFS 等),即使 Druid 服务节点故障,也不影响数据的可靠性。
  6. 索引加速:Druid 通过位图方式自动对数据建索引,支持快速的索引过滤。
  7. 时间分区:Druid 会先将数据按时间分区,也可根据其他方式进一步分区,基于时间范围的查询只会访问对应时间范围内地数据。
  8. 预聚合:Druid 支持在导入数据时对数据进行提前的聚合分析,例如sum、count、min、max等,作为数据的元数据存储,当实际访问时,可直接访问预聚合好的数据。
  9. SQL 支持:Druid 同时支持 SQL、HTTP 方式访问,表达能力强,灵活方便。

Druid 数据模型

架构解析

核心组件

  • Coordinator 负责集群的协调及数据高可用
  • Overlord 控制集群数据导入任务的分配
  • Broker 处理客户端查询请求
  • Router 是可选的路由组件
  • Historical 负责可查询数据的存储
  • MiddleMangager 负责数据的导入

部署方式

Druid 的各个组件可以随意部署,但根据组件的职能,会分成三类,每一类组件建议在服务器上混部。

  • Master Servers:运行集群的 Coordinator 与 Overlord 控制类的组件。
  • Query Servers:运行集群查询类组件,包括 Broker、Router
  • Data Servers:运行集群数据导入、存储相关组件,包括 Middle Managers、Histricals

外部依赖

Druid 本身不存储数据,数据的存储依赖于外部的组件,数据的存储(Deep Storage)依赖外部的存储,例如 AWS S3、阿里云 OSS、HDFS 等分布式存储,云数据存储依赖 MySQL、PostgreSQL 等数据库;依赖 Zookeeper 实现服务发现、Leader 选举等功能。

Deep Storage

Druid 本身不存储数据,而将数据存储到外部的 Deep Storage,由 Deep Storage 保证数据的可靠存储,例如 AWS S3、阿里云 OSS、HDFS 等分布式存储。

Druid 的数据会按数据顺序组织,并按时间维度对数据进行分区存储,一段时间范围的数据会存储到一起,组成一个 Segment。数据在 Segment 里会按列存方式进行压缩存储,并对 Dimension 数据建立索引。
image.png

Segment 结构

Druid 的所有数据都包含时间戳列,还包含多个 Dimensions 以及 Metrics 列,其中 Dimension 列可支持快速过滤、聚合,Druid 在存储 Dimension 列时,会进行压缩存储,并通过位图方式建索引,每一列的数据包含

  1. Dictionary:存储列值到 整型 ID 的映射
  2. Column Data:根据 1产生的一系列的整型 ID,进行压缩存储
  3. Inverted Index(Bitmaps):针对 Column 里每个不同的 value,会建一个位图倒排索引

image.png
比如 Page 列的存储,包含 "Justin Bieber", "Ke$ha" 两个取值,该列对应的存储类似如下三个部分

1: Dictionary that encodes column values
  {
    "Justin Bieber": 0,
    "Ke$ha":         1
  }

2: Column data
  [0,
   0,
   1,
   1]

3: Bitmaps - one for each unique value of the column
  value="Justin Bieber": [1,1,0,0]
  value="Ke$ha":         [0,0,1,1]
 

当某一段时间范围内地数据量很大时,在将数据存储为 Segments 时,可以采用 sharding 策略,比如按文件大小切分 Segments、或根据指定的 Dimension 进行 Hash 分到多个 Segments,在检索的时候,能进一步减少需要查询的数据。

读写流程

数据导入

Druid 支持从 Kafka、Hadoop 里导入数据,数据导入以 Task 方式进行,Overlord 负责导入任务的分配,Middle Manager 负责实际的数据导入,数据会先写到 Middle Manager 的内存,积累到一定大小或时间窗口后,数据会组织为 Segment 写到 Deep Storage,并将 Segment 的元数据写入到 Metadata Storage。

Coordinator 会周期性的检测 Metadata Storage,当发现新的 Segment 产生时,会将 Segment 根据负载情况分给其中的部分 Historical(根据副本数) 节点管理,Historical 节点接管 Segment 的管理,这部分 Segment 即可用于查询。
image.png

数据查询

Broker 接收数据的查询请求,根据 Metadata 的信息,计算出查询关联的 Middle Managers、Historicals 节点,并将请求发送到对应的节点, Middle Managers、Historicals 根据查询的时间范围,找出所有可能包含查询数据的 Segments,并从中过滤出满足条件的数据,Broker 负责将查询结果进行汇总返回给客户端。
image.png

总结

  1. Druid 与传统数据库通过读写 API 写入数据的方式不同,通过 Pull 方式拉取数据,对接常用的 Kafka、HDFS等大数据生态数据源。
  2. 借助外部可靠的 Deep Storage 和 Meatadata store 来实现数据、元数据的存储,将 Druid 从数据存储的高可靠管理中解放,让各个组件的实现都非常轻量;
  3. Druid 的实现高度模块化,每个模块有独立的职能,但因为组件非常多,在部署管理上稍微有些复杂。
  4. 通过列式存储以及位图索引,极大的降低存储成本,并支持高效的数据过滤查询。
  5. 通过时间分区策略,对事件型、时序类型场景非常友好,能快速根据查询时间范围降低扫描的数据量。
相关文章
|
6天前
|
安全 数据处理 数据安全/隐私保护
C/S架构与B/S架构的适用场景分析
C/S架构(客户端/服务器架构)与B/S架构(浏览器/服务器架构)在适用场景上各有特点,主要取决于应用的具体需求、用户群体、系统维护成本、跨平台需求等因素。
50 6
|
3天前
|
IDE Android开发 iOS开发
深入解析Android与iOS的系统架构及开发环境差异
本文旨在探讨Android和iOS两大主流移动操作系统在系统架构、开发环境和用户体验方面的显著差异。通过对比分析,我们将揭示这两种系统在设计理念、技术实现以及市场策略上的不同路径,帮助开发者更好地理解其特点,从而做出更合适的开发决策。
19 2
|
9天前
|
负载均衡 5G 网络性能优化
深入解析LTE(长期演进技术)的基本架构及其关键组件
深入解析LTE(长期演进技术)的基本架构及其关键组件
54 2
|
26天前
|
存储 JSON 数据库
Elasticsearch 分布式架构解析
【9月更文第2天】Elasticsearch 是一个分布式的搜索和分析引擎,以其高可扩展性和实时性著称。它基于 Lucene 开发,但提供了更高级别的抽象,使得开发者能够轻松地构建复杂的搜索应用。本文将深入探讨 Elasticsearch 的分布式存储和检索机制,解释其背后的原理及其优势。
85 5
|
3天前
|
Java 对象存储 开发者
解析Spring Cloud与Netflix OSS:微服务架构中的左右手如何协同作战
Spring Cloud与Netflix OSS不仅是现代微服务架构中不可或缺的一部分,它们还通过不断的技术创新和社区贡献推动了整个行业的发展。无论是对于初创企业还是大型组织来说,掌握并合理运用这两套工具,都能极大地提升软件系统的灵活性、可扩展性以及整体性能。随着云计算和容器化技术的进一步普及,Spring Cloud与Netflix OSS将继续引领微服务技术的发展潮流。
14 0
|
14天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
160 37
|
6天前
|
存储 监控 安全
SaaS业务架构:业务能力分析
【9月更文挑战第20天】在数字化时代,软件即服务(SaaS)模式逐渐成为企业软件解决方案的首选。SaaS 业务架构设计对于提供高效、可靠的服务至关重要。其核心业务能力包括:用户管理(注册登录、角色权限)、数据管理(存储备份、安全共享)、业务流程管理(设计定制、工作流自动化)、应用集成(第三方应用、移动应用)及客户服务(支持培训、反馈改进)。通过优化这些能力,可为企业提供更高效、可靠的 SaaS 服务。
28 11
|
9天前
|
存储 缓存 自然语言处理
深度解析ElasticSearch:构建高效搜索与分析的基石
【9月更文挑战第8天】在数据爆炸的时代,如何快速、准确地从海量数据中检索出有价值的信息成为了企业面临的重要挑战。ElasticSearch,作为一款基于Lucene的开源分布式搜索和分析引擎,凭借其强大的实时搜索、分析和扩展能力,成为了众多企业的首选。本文将深入解析ElasticSearch的核心原理、架构设计及优化实践,帮助读者全面理解这一强大的工具。
80 7
|
12天前
|
算法 Linux 调度
操作系统的心脏:现代操作系统架构的深度解析
本文深入探讨了现代操作系统的架构设计,重点分析了进程管理、内存管理和文件系统等核心组件。通过对Linux和Windows两大主流操作系统的比较,揭示了不同设计哲学在实际应用中的表现。旨在为操作系统开发者提供参考,同时帮助普通用户更好地理解其设备背后的软件机制。 ##
31 2
|
27天前
|
设计模式 存储 人工智能
深度解析Unity游戏开发:从零构建可扩展与可维护的游戏架构,让你的游戏项目在模块化设计、脚本对象运用及状态模式处理中焕发新生,实现高效迭代与团队协作的完美平衡之路
【9月更文挑战第1天】游戏开发中的架构设计是项目成功的关键。良好的架构能提升开发效率并确保项目的长期可维护性和可扩展性。在使用Unity引擎时,合理的架构尤为重要。本文探讨了如何在Unity中实现可扩展且易维护的游戏架构,包括模块化设计、使用脚本对象管理数据、应用设计模式(如状态模式)及采用MVC/MVVM架构模式。通过这些方法,可以显著提高开发效率和游戏质量。例如,模块化设计将游戏拆分为独立模块。
67 3

推荐镜像

更多