美文网首页Apache Druid程序员
Druid-高性能实时数据分析数据库

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

作者: 93张先生 | 来源:发表于2019-01-31 18:53 被阅读10次

    概览

    事件流的分析

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

    重构思想

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

    构建下一代数据栈

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

    解锁新的工作流程

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

    任何地方部署

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

    定义

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

    公共应用场景领域

    • 点击流分析
    • 网络流量分析
    • 服务器指标存储
    • 应用性能指标
    • 数字营销分析
    • 商业智能/OLAP

    应用场景

    • 大比例的插入操作,少量的更新操作
    • 大部分查询应用聚合和报告查询使用group by、查询或者扫描操作
    • 数据有一个时间列
    • load data from kafka HDFS Amazon S3

    关键特征

    列存储格式

    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
    额外依赖
    • Deep storage:一个被druid可访问的共享的文件存储;比如分布式文件系统HDFS、S3、一个网络挂在的文件系统;用它来存储已经陪摄入的任何数据;
    • Metadata store:一个共享的元数据存储,典型的关系型数据库PostgreSql和Mysql;
    • Zookeeper:一个被用来了额外服务发现、协调、领导选举的;

    这个额外依赖设计的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最大化查询性能的三种技术
    • 为每一个查询修剪访问的segments
    • 在每一个segment中,使用索引确定要访问的列
    • 在每一个segment中,只读取特定查询的特定行和列

    额外依赖

    Deep storage

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

    Metadata storage

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

    MySQL
    metadata storage被访问的节点(only)
    • Indexing Service Nodes
    • Realtime Nodes
    • Coordinator Nodes

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

    Zookeeper

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

    • Coordinator选举
    • segment publishing协议从Historical和Realtime
    • segment 加载/删除协议在Coordinator和Historical
    • Overload选举
    • Indexing Service管理任务

    Task

    Task Overview

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

    Segment Creation Tasks

    • Hadoop Index Task
    • Native Index Tasks
    • Kafka Indexing Tasks
    • Stream Push Tasks (Tranquility)

    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

    相关文章

      网友评论

        本文标题:Druid-高性能实时数据分析数据库

        本文链接:https://www.haomeiwen.com/subject/uwfznftx.html