druid.io剖析

Druid学习笔记(2)Druid架构剖析 1. 前言Druid 的目标是提供一个能够在大数据集上做实时数据摄入与查询的平台,然而对于大多数系统而言,提供数据的快速摄入与提供快速查询是难以同时实现的两个指标。例如对于普通的RDBMS,如果想要获取更快的查询速度,就会因为创建索引而牺牲掉写入的速度,如果想要更快的写入速度,则索引的创建就会受到限制。而Druid却可以完美的对两者进行结合,本文将对Druid如何实现这种结合做一个简单的介绍。2. 阅读详情

简介

druid作为现在最有潜力的海量数据实时分析系统,在优酷广告团队中扮演者非常重要的角色

整体架构

整体架构

现在已经用tranquility+indexing service替换realtime

实时数据经由tranquility被推送到Indexing Service,然后生成索引(Segment),同时提供来自用户的 查询请求。当索引所在的时间段过去以后,Indexing Service会将索引推送到deep storage。 索引信息会被注册到metadata中。协调节点定时同步metadata,感知新生成的Segment, 并通过Zookeeper去通知历史节点加载索引。

除了实时加载数据,Druid也支持批量导入数据。导入的数据生成索引segment,写入deep storage, 经与上述同样的步骤,通过修改metadata信息将segment加载到历史节点。

Lambda架构思想

Lamda架构用来同时处理离线和实时数据

lambda架构

druid借助lambda思想,很好的解决了实时处理逻辑会丢弃时间窗口以外的数据的问题。

  • 实时:通过tranquility拉取数据并导入druid
  • 离线:通过druid提供的Hadoop Indexer(实际上是mr任务)获取hdfs数据,生成segment并导入hdfs,并将索引元信息导入mysql。druid定时轮询mysql并获取最新索引数据,最后通过指定负载均衡算法分配给工作节点

依赖

kafka(16c32g480gx8)

TT日志-->storm etl-->kafka

kafka作为storm和druid之间的缓冲

tranquility(4c8g120gx9)

/home/admin/druid-tranquility/default

config目录存储了很多json文件,定义了数据源的schema,也就是druid表结构,所有schema中配置的segmentGranularity都是hour级别, queryGranularity有hour也有minute级别

重要参数

segmentGranularity不等于queryGranularity

  • segmentGranularity:索引粒度,也就是一个segment文件包含的数据时间范围
  • queryGranularity:查询粒度,也就是最小聚合粒度,代表数据存储的时候,在维度相同的情况下,同一查询粒度范围内的数据会自动被聚合,导致查询的时候只能查到该粒度级别的数据
  • intermediatePersistPeriod:定时持久化增量索引的周期,目前大多是5min
  • windowPeriod:时间窗口,表示如果数据时间比当前时间老或者比当前时间新,超过该窗口范围之外的全部被丢弃,目前大多是10min,也有5min

推荐配置:intermediatePersistPeriod ≤ windowPeriod < segmentGranularity,queryGranularity<= segmentGranularity

tranquility工作流程:

tranquility

简而言之,tranquility会做两件事:

  • 建立索引任务并发给overlord:tranquility发送的task会被overlord接受,最后会占用middle-manager的一个空闲slot。为防止太多task,tranquility会为同一个segmentGranularity范围之内的task分配同一个id,这个所有发送过去的task都会被合并。还有两个配置项影响task数量,tranquility可以在schema中为每个数据源配置partitions和replicants,一个小时以内请求的task数量= partitions * replicants。目前middle-manager的所有slot数量都可以在overlord UI查看,可以根据剩余slot数量来修改配置中的partitions和replicants参数。建立的task主要目的是明确每个tranquility该往哪个peon发送实时数据,即实时数据在众多peon中负载均衡的策略(稍后讨论handoff阶段)
  • 将实时数据发送给peon进程:peon会通过EventReceiverFirehose服务暴露一个http接口,tranquility通过zookeeper获取task的分配信息,明确实时数据该往哪个peon发,并将peon暴露的接口发起post请求,提交实时数据

内部组件

indexing service

indexing service分为三个组件(工作进程),用类似storm的nimbus->supervisor->worker的方式工作

  • overlord(4c8g120gx2):接收tranquility请求的实时索引task,选择slot空闲最多的middle-manager,通过zk将task分配给middle-manager,填满为止。目前overlord两台机器,master-slave结构
  • middle-manager(4c8g120gx51):通过zk获取task,启动本地进程peon执行task
  • peon:获取实时数据,执行task,完成索引建立。peon本身还负责索引查询服务

index service接收tranquility请求并处理的整个流程:

indexing service

peon完成了索引build,merge,handoff的整个生命周期

peon-flow

每个middle-manger有N个slot,对应N个peon,每次分配一个索引task就会创建一个peon进程,这个小时以内peon会占据这个slot,等完成handoff之后才释放

这个小时以内,peon会不断生成增量索引,定时持久化索引,合并索引生成segment,最后handoff segment

handoff流程:

handoff

historical(16c32g480gx10)

historical提供索引加载和查询服务

historical

历史节点在从下载segment前,会从本地缓存检查是否存在,如果不存在才从hdfs下载。下载完成之后,会根据zk获取到的压缩信息进行解压处理并加载到内存,这时就能提供查询服务。

可以通过配置给历史节点划分不同的层,然后在coordinator配置规则来加载指定数据源到某个层。这样可以实现冷热数据划分处理,热数据查询多存量小,采用更好的cpu和内存机型配置,冷数据查询少存量大,采用更大的硬盘机型配置

broker(16c32g480gx2)

broker负责查询索引,目前是master-master结构

broker是查询节点,负责接受查询请求,解析查询对象中的时间范围,根据时间范围将实时索引请求(当前小时)路由到peon节点,将历史索引请求(1小时之前)路由到historical节点。接收peon和historical查询返回的数据,在做一次合并,最后返回结果

为了提高查询效率,broker会将查询结果缓存(LRU),目前提供了两种方式:

  • heap memory(目前使用)
  • kv存储,如memcached

只会缓存历史节点返回的数据,因为peon返回的实时数据经常改变,没有缓存的价值

coordinator(4c8g120gx2)

coordinator会协调历史节点中segment的分配

  • rules:每分钟从mysql拉取druid_rules和druid_segments,rules用来告知historical将如何load和drop索引文件,coordinator会读取这些rules,然后修改zk,通知historical加载删除指定的segment,这些都可以在coordinator的UI配置
  • load balance:根据zk中每个historical node负责的segment量,做负载均衡
  • replication:在coordinator的UI中配置rules时,可以同时配置加载segment的备份数量,这些备份数量会以load balance的形式,分配到多个historical上面。这个备份数量与hdfs的segment备份数量不一样,hdfs那个保证深度存储的数据不会丢失,historical上面备份是为了保证当某个historical挂掉的时候,其他存储了备份segment的节点能接着提供查询服务

外部依赖

zookeeper

druid依赖zk实现集群之间的交互

druid采用shard-nothing架构,每个节点之间不直接和其他打交道,而是采用zk来沟通。这样保证了druid本身的HA特性

peon和historical发布索引

  • /druid/announcements:声明所有peon和historical的host
  • /druid/segments:记录所有peon和historical的host,以及他们负责的索引

提供indexing service相关数据(overlord页面数据来源)

  • /druid/indexer
  • leaderLatchPath:overlord选主
  • tasks:运行的peon任务
  • status:peon任务状态
  • announcements:声明middle-manager的capacity

coordinator用来通知historical加载卸载索引

  • /druid/loadQueue/_historical_host/_segement_id:记录历史节点所负责的segment

coordinator选主

  • coordinator:记录coordinator信息

集群通信

  • discovery:集群中所有服务

附属功能

  • /druid/listeners:存储lookup数据

deep storage —— hdfs

存储索引文件

metadata storage —— mysql

存储元数据

  • druid_segments:索引元数据,数据源、是否可用、大小、维度、指标
  • druid_rules:通知historical该如何加载、卸载索引的规则,可以在coordinator配置
  • druid_config:存放运行时配置信息
  • druid_audit:记录配置、规则的变化
  • druid_task(相关的几张表):overlord用来存放索引task数据,防止overlord挂掉导致task丢失

索引文件

segment就是压缩后的索引文件,命名方式为datasource_intervalStart_intervalEnd_version_partitionNum。如dsp_report_2011-01-01T01:00:00Z_2011-01-01T02:00:00Z_v1_0,代表dsp_report数据源,从2011-01-01那天1点到2点的数据,版本号为v1,分区数为0

深入剖析segment存储结构

  • version.bin:4字节,记录segment version
  • XXXXX.smoosh:该文件存放多个逻辑意义上的子文件,通过记录offset来管理这些子文件。有的子文件存放了column信息,有的存放了索引元信息。column信息也就是真实存储的数据
  • meta.smoosh:上面这些子文件名称以及他们出现的offset都记录在meta.smoosh中

XXXXX.smoosh中存放的column是最重要的,可以分为Timestamp, Dimensions, Metrics三部分。

timestampdomainadvertiserdevicecityclickcost
2015-11-25T10:00:00Zyouku.comBMWAndroidPeking90.9
2015-11-25T10:00:00Zyouku.comBMWIphoneHongKong30.3
2015-11-25T10:00:00Ztudou.comPANDORAIphoneHongKong20.2
2015-11-25T10:00:00Ztudou.comPANDORAIphonePeking10.1
  • Timestamp:用时间戳来表示时间,可以用一系列时间戳表示该segment所有Timestamp列信息,采用LZ4算法压缩
  • Metrics:也是数字,存放方法同上,压缩算法同上
  • Dimensions:由于Dimensions大多是字符串,采用上面的存放方式无法很好压缩。目前Dimensions拆分成多个结构进行存储。

Dimensions结构:

  1. 将字符串映射为整数id的字典
  2. 记录该dimension每一行的值,值用上述字典编码
  3. 为每个不同dimension的值,定义一个bitmap,存储该值出现的行号,采用roaring压缩算法

上述结构中,1可以有效减少索引文件的大小,2的基础上做排序可以很方便的做groupby合并处理,3是快速完成where条件查询的利器。

内存管理

druid使用了三种不同类型的内存:

  • 堆内存:broker用来缓存查询结果、简单计算
  • 直接内存:一般用来存储聚合操作中所产生的临时数据
  • MMap:历史节点用来加载segment,快速,减少一次系统复制操作。memory_for_segments = total_memory - heap - direct_memory - jvm_overhead,segment可用的内存越小,mmap操作就会导致更多的内存换页操作

参考资料

Apache Druid CVE-2021-36749任意文件读取漏洞深度剖析与修复实践 在Web应用安全领域,输入验证是保障系统安全的第一道防线。其核心原理在于对所有外部输入进行严格的校验、过滤和规范化,防止恶意数据破坏程序逻辑或访问未授权资源。这项技术的价值在于能够从源头遏制大量常见攻击,如SQL注入、跨站脚本(XSS)以及路径遍历。路径遍历漏洞便是输入验证失效的典型场景,攻击者通过构造包含“../”等序列的路径参数,绕过预期目录限制,访问或读取服务器上的敏感文件。在实时大数据分析平台Apache Druid中,其数据采样API因对用户提交的路径参数缺乏有效的规范化与边界检查,导致了CVE- 阅读详情

相关推荐

dbcp连接池不合理的锁导致连接耗尽

应用报错,表象来看是连接池爆满了。 org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is org.apache.commons.dbcp.SQLNestedException: Canno

seaboat——a free boat on the sea.(公众号:远洋号) 2万+

Druid(Druid.io)简单使用

Druid简单使用 一、Druid服务进程 Historical进程:Historical进程用于处理历史数据的存储和查询(历史数据包括所以已经被committed的流数据)。Historical进程从深度存储(Deep Storage)中下载Segment数据,同时支持对这些数据的查询操作。Historical进程不支持写入操作。 MiddleManager进程:MiddleManager负责将...

凌晨1点21分的专栏 1561

DruidIODemo源码下载地址

查询json数据格式 查询javaDEMO,对java的支持 JDBC操作Druid-io

Druid.io——基本概念

1、数据 Druid在数据摄入之前,首先需要定义一个datasource,类似于数据库中表的概念。每个DataSource包括三个部分: 时间序列(Timestamp),Druid既是内存数据库,又是时间序列数据库,每个数据集合都必须有时间列。Druid中所有查询以及索引过程都和时...

choumo7895的博客 441

基于Python适用于YOLO目标检测算法的图片数据增强处理

为了增强模型的鲁棒性以及数据的丰富性,同 时为了防止由于数据过少发生过拟合,本设计对数 据集进行数据增强处理,包括随机亮度调节、随机 对比度调节、随机饱和度调节、加入高斯噪声、水 平翻转、运动模糊和旋转 15°

weixin_67136409的博客 700

MySQL 分库分表及其平滑扩容方案

MyCAT不仅仅可以用作读写分离,以及分表分库、容灾管理,而且可以用于多租户应用开发、云平台基础设施,让你的架构具备很强的适应性和灵活性。分表对于一张多行(记录)多列(字段)的二维数据表,又分两种情形(1)垂直分表竖向切分,不同分表存储不同的字段,可以把不常用或者大容量、或者不同业务的字段拆分出去;扩容前每个节点的数据,有一半要迁移至一个新增节点中,对应关系比较简单。此时,四个节点的数据都已完整,只是有冗余(多存了和自己配对的节点的那部分数据),择机清除即可(过后随时进行,不影响业务)。...

m0_71777195的博客 1929

Druid(Druid.io)介绍

Druid(Druid.io)简介 一、简介 Druid 的目标是提供一个能够在大数据集上做实时数据摄入与查询的平台,然而对于大多数系统而言,提供数据的快速摄入与提供快速查询是难以同时实现的两个指标。而Druid却可以完美的对两者进行结合,本文将对Druid如何实现这种结合做一个简单的介绍。 Druid.io是一个开源的,分布式的,列式存储的,适用于实时数据分析的OLAP系统。它能够快速聚合...

凌晨1点21分的专栏 1303

避坑指南:企业微信IP白名单设置失败的5种常见原因及解决方案

本文深入解析企业微信API调用中IP白名单设置失败的5种常见原因,包括动态公网IP变更、代理服务器导致的IP失真等,并提供针对性的解决方案。特别针对可信IP配置问题,详细介绍了诊断方法和Java代码示例,帮助企业开发者快速解决访问限制问题,确保API调用安全稳定。

weixin_29280657的博客 619

Druid 介绍和应用

Druid(Druid.io)简介 一、简介 Druid 的目标是提供一个能够在大数据集上做实时数据摄入与查询的平台,然而对于大多数系统而言,提供数据的快速摄入与提供快速查询是难以同时实现的两个指标。而Druid却可以完美的对两者进行结合,本文将对Druid如何实现这种结合做一个简单的介绍。 Druid.io是一个开源的,分布式的,列式存储的,适用于实时数据分析的OLAP系统。它能够快速聚合、灵活过滤、毫秒级查询、和低延迟数据导入。2011年,MetaMarkets公司为了解决广告交易中海量实时数据的

hudeyong926的专栏 1690

Jetpack Compose Navigation实战:从基础到高级导航模式

本文全面解析Jetpack Compose Navigation在Android开发中的应用,从基础导航实现到高级模式(如单任务/单顶模式),涵盖参数传递、嵌套导航、深层链接等核心功能。通过实战代码示例展示如何优化导航性能,并与ViewModel、Hilt等架构组件整合,为开发者提供高效的Compose导航解决方案。

pz890123456的博客 373

单细胞转录组上游分析完整流程(超详细)

本指南详细介绍单细胞转录组数据分析流程,从10xGenomics平台数据出发,使用CellRanger工具完成从原始FASTQ文件到基因表达矩阵的全过程。内容涵盖:1) 环境准备与参考基因组获取;2) 测试数据下载;3) 数据质量检测方法;4) CellRanger核心流程详解;5) 结果解读;6) 下游分析衔接。同时提供开源替代方案kallisto|bustools的使用说明,并解答常见问题。适合单细胞转录组分析初学者快速掌握标准分析流程。

Rita_rr的博客 1158

druid.io mysql_druid.io剖析

druid.io剖析简介druid作为现在最有潜力的海量数据实时分析系统,在优酷广告团队中扮演者非常重要的角色整体架构 现在已经用tranquility+indexing service替换realtime实时数据经由tranquility被推送到Indexing Service,然后生成索引(Segment),同时提供来自用户的 查询请求。当索引所在的时间段过去以后,Indexing Servi...

weixin_42524842的博客 257

硬件测试之—纹波测试为什么不要使用接地夹子

示波器为什么不推荐使用接地夹

qq_19294353的博客 2988

Druid(Druid.io)架构分析

1基本概念 2架构组成 3高性能原理 1.预聚合。 2. Druid中通过Segment实现了对数据的横众向切割操作。 3Druid中Segment采用类LSM-Tree(日志结构合并树)写入模型保证写入性能,同时数据分级存储保证查询性能以及存储成本 4.Segment中使用了Bitmap索引技术,大大加快了数据聚合查询性能。 5.数据的高度压缩(索引压缩,数据文件压缩)

凌晨1点21分的专栏 581

YOLOv26与其他目标检测算法的对比分析

本文对YOLOv26与其他主流目标检测算法进行了全面对比分析。YOLOv26在COCO数据集上达到96.0% mAP@0.5和79.0% mAP@0.5:0.95,显著优于其他YOLO系列算法,同时保持85FPS的推理速度和35MB的轻量级模型。相比两阶段算法(如Faster R-CNN),YOLOv26在速度、模型大小和内存占用方面优势明显;相比Anchor-free算法(如CenterNet),YOLOv26在速度和模型压缩方面更优。其核心创新包括动态锚框分配、自注意力机制和轻量级设计,使其成为适用于复

一键难忘的博客 994

新手必看!手把手教你在群晖 NAS 上玩转 Docker 容器(Container Manager)!(群晖 NAS 如何创建 Docker 容器以及 Compose 部署项目)

新手必看!手把手教你在群晖 NAS 上玩转 Docker 容器(Container Manager)!(群晖 NAS 如何创建 Docker 容器以及 Compose 部署项目)

XiaoqiangClub的博客 5162

后端/数据库方向面试必备:这些开源项目让你脱颖而出

开源项目经验为何成为面试加分项? 开源项目经验在技术面试中极具价值,因为它能证明候选人: 具备深入理解系统原理的能力,而非仅停留在API使用层面 接触过经过生产验证的高质量代码,了解真实工程实践 熟悉底层技术实现和设计权衡 以Redis为例,其源码学习价值体现在: 代码质量高(8万行核心C代码) 涵盖后端开发核心知识点(数据结构、网络、持久化等) 设计理念先进(单线程模型、跳表实现等) 面试官关注的是候选人对系统设计的深入理解,而非表面功能。例如: Redis 6.0多线程的I/O优化细节 跳表相比平衡树的

热爱技术与前沿创新,深耕科技领域,在科创中精进自我;探索技术乐趣,分享技术干货与成长心得,以技术为伴,热爱生活,在科创与生活中双向成长。 260

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

第七章:druid.io实践分享之realtime+kafka 一

目前使用druid已经有3年了,在整个国内互联网广告行业了解下来,我们算较早使用的团队。其优势太明显了,就是快,绝大多数的场景都可以在毫秒或秒级响应(特别是数据量足够大的情况下,还能保持良好的速度)。 其二就是提供的功能特别能解决我们业务上的问题。 其三整个系统相对来说还是比较封闭的,减少了不必要的依赖,json的灵活性提供了更好的二次开发的潜力。 其四整体源码风格是函数式,可以使之前面向对象

分布式应用与服务器架构专栏 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

HikariCP与Druid数据库连接池实战:原理、配置与性能调优

数据库连接池是后端开发中管理数据库连接的核心组件,其核心原理是通过预先创建并维护一定数量的连接,在应用需要时进行复用,从而避免频繁创建和销毁连接带来的巨大开销。这一机制解决了高并发场景下的资源消耗、响应延迟和连接数限制等关键问题,其技术价值在于显著提升应用性能与稳定性。在实际工程实践中,连接池广泛应用于Web服务、微服务架构等需要高效数据库访问的场景。本文聚焦于Java生态中两款主流连接池——以高性能著称的HikariCP和集成了强大监控功能的Druid,通过实战演示如何从零搭建、配置并进行性能调优,并深入

weixin_30751947的博客 348

Druid【基础 01】是什么+主要特点+设计原则+架构+数据结构(简单入门Druid)

Druid是一个开源的分布式实时分析数据库,结合了数据仓库、时间序列和搜索系统的特点。主要特点包括列式存储、实时批量数据摄取、灵活模式、SQL支持和水平扩展能力。其架构包含5类节点(MiddleManager、Historical、Broker、Coordinator、Overlord)和3类外部依赖(Deep Storage、Metadata Store、Zookeeper)。Druid适用于大规模实时数据分析场景,如广告分析、网络监控等,具有快速查询、高可用和易扩展等优势。

シ風 4877

Java工具09-Java数据库连接池:HikariCP与Druid

本文对比分析Java两大主流数据库连接池HikariCP和Druid。HikariCP以极致性能著称(单线程连接获取仅1.2μs),采用ConcurrentBag数据结构和字节码级优化,内存占用比Druid低50%。Druid则提供全面功能,包括SQL监控、防注入等企业级特性。性能测试显示HikariCP的连接获取速度是Druid的2-3倍,适合追求极致性能的场景;而Druid更适合需要完善监控和安全功能的复杂系统。文章从架构设计、核心参数、性能指标等维度提供选型建议,并给出典型配置示例。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

解Bug之路-Druid的Bug

解Bug之路-Druid的Bug

记事本 3150

Java面试-数据库连接池:HikariCP、Druid 原理与性能对比

每次查询都要,系统直接卡死!没错!数据库连接的创建和销毁是昂贵操作TCP 三次握手用户名密码认证权限校验内存分配数据库连接池(Connection Pool)就是为了解决这个问题——它像一个“连接仓库”,预先创建一批连接,用完不扔,放回池中复用。HikariCP:以“速度”著称Druid:以“功能”见长准备好了吗?我们出发!⚡📦场景推荐追求极致性能✅ HikariCP需要强大监控✅ Druid金融、安全要求高✅ Druid(SQL 防火墙)微服务、云原生。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

【Spring Boot实战与进阶】集成Druid数据库连接池和监控

Druid是阿里巴巴开源平台上的一个项目,整个项目由数据库连接池、插件框架和SQL解析器组成。该项目主要是为了扩展JDBC的一些限制,可以让程序员实现一些特殊的需求,比如向密钥服务请求凭证、统计SQL信息、SQL性能收集、SQL注入检查、SQL翻译等,程序员可以通过定制来实现自己需要的功能。

程序员云帆哥的博客 1282
上一篇: 快手 Druid 精确去重的设计和实现
下一篇: Spark 性能优化——和 shuffle 搏斗
千淘万漉
博客等级 码龄10年 115粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值