Apache Druid程序员

Druid-高性能实时数据分析数据库

2019-01-31  本文已影响10人  93张先生

概览

事件流的分析

druid 提供了快速的分析查询一个高并发,在实时节点和历史节点上;强大的用户交互界面;

重构思想

新型数据库,主要思想来自 OLAP/analytic databases,timerseries database,search systems在这个实时架构中;

构建下一代数据栈

原生集成了kafka AWS KinesiS 数据湖 HDFS AWS S3;工作时,有良好的层次的数据流查询架构。

解锁新的工作流程

构建了一个快速的特别分析在实时数据和历史数据两个方面;解释趋势,探索数据,快速查询回答问题。

任何地方部署

在任何×NIX环境中部署,商业硬件和云上部署都支持;原生云支持:扩容和减少非常简单。

定义

druid是一个为高性能、在大量数据集上分片和分块分析 而设计的数据存储

公共应用场景领域

应用场景

关键特征

列存储格式

druid使用面向列的存储,对一个特定的查询只需要加载需要的列,面对少量列的查询有了一个速度的大幅提升,每一个列的存储针对特定的数据类型做了存储优化,支持快速扫描和聚合。

可扩展的分布式系统

druid是一个典型的十到数百台的集群服务部署,每秒百万级的数据摄取,保留数万条记录,亚秒级到几秒钟的查询延迟。

大规模并行处理

druid一个查询并行处理在整个集中。

自健康检查 自平衡 简单操作

扩大集群,增加、减少服务,这样的操作集群会自动平衡,无需停机,如果一个服务失败,路由会自动绕个这个服务,直到找到可以替换的服务。druid设计成一个无需任何原因7×24小时不停机的运行的架构,包括配置修改,软件升级.

原生云的 默认容错不会丢失数据的架构

一旦druid摄取了数据,一个copy会被安全的存储到deep storage,例如HDFS、云存储、一个共享的文件系统中;及时每一个服务挂了,数据可以从deep storage恢复;对于一些失败,影响了一些服务,备份确保一些查询是可用的,直到系统被恢复。

用于快速过滤的索引服务

Druid使用CONCISE或 Roaring压缩位图索引来创建索引,这些索引可以跨多个列进行快速过滤和搜索。

近似算法

druid包含一些算法;近似count-distinct、近似排序、位图直方图的近似计算,算法在有限内存中基本上是快于准确计算;这些场景是为了快速计算;druid也提供了准确的count-distinct和排序

摄取时自汇总

druid可选的支持摄取时数据汇总,汇总可以预先聚合你的数据,可以大量开销的节和性能提升。

架构

Historical

Historical是一个处理存储和历史数据查询查询到工作站,Historical处理从deep storage加载过来的segments,对这些segments从broker发出的历史数据的查询做出回应;他不接受写;

MiddleManager

MiddleManager摄取新数据到集群中;它负责度额外的数据源(新的实时的数据)和发布新的druid segments

MiddleManager是一个执行提交任务的工作节点;提交任务到peon上在一个独立的JVMs,因为任务的资源和日志的隔离,每一个Peon使用了隔离的JVMS,每一个Peon同时每次只能运行一个task,一个MiddleManager有多个peon;

Broker

处理来自客户端的查询,解析将查询重定向到Historical和MiddleManager,Broker接收到数据从这个子查询中,合并这些结果然后返回给查询者;

Coordinator

Corrdinator监控Historical处理,负责分配segments到指定的服务,确保存在HIstorical中是自平衡的;

Overlord

监控MiddleManager处理和控制数据加载进druid集群;对分配给MiddleManager的摄取任务和协调segments的发布负责;

local or remote模式 默认local
创建任务锁

Router

可选服务;提供了Brokers,Overlords,Coordinator的统一路由网关;


Peon(苦力)

Peons运行一个单独的任务在一个单独的JVM,MiddleManager负责创建执行任务的peon;peons自己运行是非常稀少的。

总结

  1. Historical是历史数据摄取和查询到节点,Coordinator监控协调Historical节点上的任务,确保segments自平衡;
  2. MiddleManager是一个新数据摄取和查询的节点;overlord监控和协调task任务的分配和segments的发布。
  3. 三种托管计划:

"Data" servers run Historical and MiddleManager processes.
"Query" servers run Broker and (optionally) Router processes.
"Master" servers run Coordinator and Overlord processes. They may run ZooKeeper as well.

druid架构.png
额外依赖

这个额外依赖设计的idea是为了druid集群在生产环境容易扩张;比如:独立的deep storage 和 metadata store 使集群处理是根本上的容错的;即使一个druid server失败;你可以重启集群从存储在deep storage 和 Metadata store;

Datasources 和 segments

druid data 被存储在打他source中,datasource按照时间进行分区;也可以用其他属性进行分区,每一个时间范围,叫做chunk;一个chunk被分区到一个或多个segments,一个segments是一个单一的文件;里面存储典型的被压缩的原生数据;segments被组织成chunks;就像生活在这个时间线上;datasource > chunk > segment;
一个datasource可能有几个或几千个甚至百万个segments;每一个segment在MiddleManager被创建,在这个时候segment是易变的没有提交的;生成紧凑的支持快速查询segment的步骤:

  1. 转换为列模式
  2. 建立位图索引
  3. 各种算法压缩数据:

最小存储的字符串列的字典编码
位图索引的位图压缩
所有列的类型感知压缩

定期提交和发布segments;在这一时刻,他们被写入深度存储,变成不可变的,从MiddleManager移除到HIstorical流程;一个关于这个segment的条目被写入到Metadata store;这个条目关于segment是自描述的,包含segment的列信息,大小,deep storage的位置;这些条目是告诉Coordinator集群中有哪些数据是可以访问的。

查询处理

查询首先到达Broker,broker确定被修建的查询需要的数据在哪些segments上;这个segments经常按照时间被修剪,也可以按照你datasource分区时的属性进行修剪;broker确定Historical还是MiddleManager服务于这些segments,然后发出子查询向Historical和MiddleManager,Historical和MiddleManager处理这些查询,并返回结果,broker汇总结果,最终返回给调用者;
broker裁剪是druid限制每一个查询扫描数据的关键方法,但不是唯一途径;broker可以采用更细粒度的过滤器进行裁剪,segments内部索引结构允许druid指出过滤器匹配的数据,在查看任何原生数据之前;一旦druid知道匹配了一个特定查询哪些行,他就会访问查询的指定列;druid可以在行之间进行跳跃,避免读取查询过滤器不匹配的数据。

druid最大化查询性能的三种技术

额外依赖

Deep storage

Druid使用deep stroage只作为一个数据的备份和一种druid内部处理转化数据的方式。为了相应查询,Historical预先拉取segment从你的本地硬盘,而不是deep stroage;这意味这druid在一个查询期间从不需要访问deep stroage,最少的降低延迟;这也意味着为了在deep storage和Historical处理你将要加载的数据,你必须有足够硬盘空间。

Metadata storage

存储各种各样的系统元数据

MySQL
metadata storage被访问的节点(only)

只有overlord 和Coordinator能够直接访问Metadata storage

Zookeeper

druid使用zookeeper管理集群状态,使用场景


Task

Task Overview

tasks 跑在MiddleManager和总是操作单一的数据源
tasks 通过post请求发送到Overlord节点
几种不同的tasks类型

Segment Creation Tasks

Compaction Tasks

Segment Merging Tasks


Indexing Service

Indexing service是一个跑关于task索引的、高可用、分布式服务。
Indexing tasks 创建了Druid的segments;Indexing service有一个主从架构。
Indexing service 主要由3个组件构成:a Peon、 a MiddleManager、a Overlord。
a Peon 跑一个单一的task;一个MiddleManager包含多个peons,an Overlord管理多个分布式任务到MiddleManager。
当MiddleManagers和peons总是跑在相同的节点时,Overlords和MiddleManager或许跑在同一个节点或跨越多个节点

task-流程.png
上一篇下一篇

猜你喜欢

热点阅读