Apache Druid

 ·  ☕ 7  · 👀...

介绍

背景

  • 2011年,美国广告技术公司MetaMarkets于创建了Druid项目(MetaMarkets的核心数据处理平台,99%的数据查询在1秒内返回结果)
  • 2012年,开源了Druid项目

技术特性

  • 分布式时序数据库
  • 为分析而生,在处理数据的规模、数据处理实时性方面,比传统的OLAP系统有了显著的性能改进
  • 拥抱主流的开源生态,包括Hadoop等
  • JAVA编写(jdk1.7+)
  • 支持Linux、Mac OS

资源

节点类型

节点类型 说明
Overlord Node 1. 控制数据提取工作负载的分配
2. 对数据变更(索引服务)做出相应
Coordinator Node 管理群集上的数据可用性
负责集群 Segment 的管理和发布,并确保 SegmentHistorical 集群中的负载均衡。
Broker Node 处理来自外部客户端的查询
负责从客户端接收查询请求,并将查询请求转发给 Historical 节点和 MiddleManager 节点。Broker 节点需要感知 Segment 信息在集群上的分布。
Historical Node 1. 非实时数据查询
2. 非实时数据存储
Router 【可选】将请求路由到BrokerCoordinatorOverlords
Real-time Node 1. 实时索引服务
实时节点会周期性的构建 Segment ,并且把这些 Segment 推到历史节点并修改元数据。
2. 实时摄取数据
负责监听输入数据流并让其在内部的Druid系统立即获取
注意:只响应broker节点的查询请求,返回查询结果到broker节点。旧数据会被从Realtime节点转存至Historical节点。

扩展依赖

扩展依赖 说明
Deep storage 每个 Druid 服务器都可以访问共享文件存储。
这通常是像S3或HDFS这样的分布式对象存储,或者是网络安装的文件系统。
Druid 使用它来存储已被摄入系统的任何数据。
参考深层存储依赖性
Metadata storage 元数据存储保存各种共享系统元数据,例如段可用性信息和任务信息。
这通常是传统的RDBMS,如PostgreSQL或MySQL。
参考元数据存储依赖性
Zookeeper 用于内部服务发现,协调和领导者选举。
参考Zookeeper依赖性

服务器类型

服务器类型 说明
主服务器(Master) 运行 Coordinator 和 Overlord 进程,管理数据可用性和摄取。
查询服务器 运行代理和可选的路由器进程,处理来自外部客户端的查询。
数据服务器 运行Historical 和 MiddleManager进程,执行提取工作负载并存储所有可查询数据。

架构图

Druid架构图.png

基本概念

Broker

接收来自外部客户端的查询,并将这些查询转发到Realtime和Historical节点。当Broker节点收到结果,它们将合并这些结果并将它们返回给调用者。由于了解拓扑,Broker节点使用Zookeeper来确定哪些Realtime和Historical节点的存在。

Historical

是对“historical”数据(非实时)进行处理存储和查询的地方。Historical节点响应从Broker节点发来的查询,并将结果返回给broker节点。它们在Zookeeper的管理下提供服务,并使用Zookeeper监视信号加载或删除新数据段。

Overlord

  • Overlord会形成一个加载批处理和实时数据到系统中的集群,同时会对存储在系统中的数据变更(也称为索引服务)做出响应。
  • Overlord负责接受任务、协调任务的分配、创建任务锁以及收集、返回任务运行状态给调用者。
  • 当集群中有多个Overlord时,则通过选举算法产生Leader,其他Follower作为备份。
Overload运行模式 说明
local **(默认)**Overlord也负责Peon的创建与运行工作。
remote Overlord和MiddleManager各司其职。

MiddleManager

MiddleManager负责接收Overlord分配的索引任务,同时创建新的进程用于启动Peon来执行索引任务,每一个MiddleManager可以运行多个Peon实例。

Segments

Segments介绍

Druid 把它的索引存储到一个Segment文件中,Segment文件是通过时间来分割的。

Segment数据结构数据格式

对于摄入到Druid的数据的列,主要分三种类型:时间列、维度列、指标列。如下图:
数据格式.png

清理Segment

Druid会将集群中的Segment和数据库中的Segment进行对比,如果集群有的的数据库中没有的会被清理掉。同事那些老的被新的替换的Segment也会被清理掉。

Segment可用性

历史节点可能因为某种原因不可用,协调节点会发现节点不可用了,会将这个节点上的Segment转移到其他的节点。Segment不会立即被转移,如果在配置的时间段内节点恢复了,历史节点会从本地缓存加载Segment。恢复服务

Segment负载均衡

协调节点会找到Segment最多的节点和Segment最少的节点,当他们的比例超过一个设定的值的时候,协调节点会从Segment最多的节点转移到Segment最少的节点。

Peon

Peon是Indexing Service的最小工作单元,也是索引任务的具体执行者,所有当前正在运行的Peon任务都可以通过Overlord提供的web可视化界面进行访问。

Replication

Druid允许用户指定某个Datasource的Segment副本数,默认为1,即对于某个datasource的某个segment,只会存在于单个历史节点上。 为了防止某个历史节点宕机时,部分segment的不可用,可以根据资源的情况增加segment的副本数。

索引服务

介绍

索引服务(Indexing Service)是一个高可用的,分布式的服务来运行索引相关的Task。索引服务会创建或者销毁Segment。索引服务是一个Master/Slave架构。索引服务是三个组件的集合。

组件 说明
peon 跑索引任务
Middle Manager 管理peons
Overlord 向MiddleManager分发任务

优点

索引服务也可以产生Segment文件,相对于实时节点,索引节点主要包括以下优点:

  1. 除了支持Pull的方式摄取数据,还支持Push的方式
  2. 可以通过API的方式定义任务配置
  3. 可以更灵活的使用系统资源
  4. 可以控制segment副本数量的控制
  5. 可以灵活的完成和segment数据文件相关的操作
  6. 提供可扩展以及高可用的特性

缓存

Druid提供了两类介质提供Cache功能。

Cache类型 说明
外部Cache 例如Memcache
内部Cache 使用查询节点或是历史节点的内存

Broker Node默认使用 LRU 缓存策略。
查询的时候会首先访问Cache,如果Cache没有命中,才会继续访问历史/实时节点。

高可用

可以通过Nginx+(N*Broker Node)的方式达到查询节点高可用的效果,该种部署模式下,无论查询请求落到哪个查询节点,返回的结果都是相同的。

开发

数据查询

运维

单服务器部署参考配置、启动脚本

参考配置 硬件配置 配置目录 启动命令
micro-quickstart 4 CPU
16GB RAM
conf/druid/single-server/micro-quickstart bin/start-micro-quickstart
small 8 CPU
64GB RAM (~i3.2xlarge)
conf/druid/single-server/small bin/start-small
medium 16 CPU
128GB RAM (~i3.4xlarge)
conf/druid/single-server/medium bin/start-medium
large 32 CPU
256GB RAM (~i3.8xlarge)
conf/druid/single-server/large bin/start-large
xlarge 64 CPU
512GB RAM (~i3.16xlarge)
conf/druid/single-server/xlarge bin/start-xlarge

单服务器安装

CentOS

安装jdk

参考 {% post_link jdk安装 %}

注意:安装jdk版本最低要求:8u92+。

安装Druid

1
2
3
4
5
6
7
8
9
# 下载
$ cd /usr/local/
$ wget https://mirrors.tuna.tsinghua.edu.cn/apache/incubator/druid/0.15.0-incubating/apache-druid-0.15.0-incubating-bin.tar.gz

# 解压
$ tar zxvf apache-druid-0.15.0-incubating-bin.tar.gz

# 创建链接
$ ln -s apache-druid-0.15.0-incubating druid

安装Zookeeper

1
2
3
4
5
$ cd /usr/local
$ wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.5.5/apache-zookeeper-3.5.5-bin.tar.gz
$ tar zxvf apache-zookeeper-3.5.5-bin.tar.gz
$ mv apache-zookeeper-3.5.5-bin zk
$ mv zk druid/

启动Druid

1
2
3
# 启动Druid
$ cd druid/bin/
$ ./start-micro-quickstart

访问WebUI

http://localhost:8888

重置集群状态

  1. 停止服务
  2. 删除var目录
  3. 再次运行该脚本

重置Kafka

  1. 关闭Kafka代理
  2. 删除Kafka日志目录/tmp/kafka-logs

集群安装

环境说明

主机名 IP 操作系统 角色
node1 192.168.100.101 CentOS7 Coordinator、Overlord
node2 192.168.100.102 CentOS7 Historical、MiddleManager
node3 192.168.100.103 CentOS7 Historical、MiddleManager
node4 192.168.100.104 CentOS7 Broker
node5 192.168.100.105 CentOS7 MySQL
node6 192.168.100.106 CentOS7 Hadoop
node7 192.168.100.107 CentOS7 Hadoop
node8 192.168.100.108 CentOS7 Hadoop
node9 192.168.100.109 CentOS7 Kafka

加载数据

教程 说明
加载文件 Tutorial: Loading a file
从Kafka加载流数据 Tutorial: Load streaming data from Kafka
从Hadoop加载文件 Tutorial: Load batch data using Hadoop
使用Tranquility加载数据 Tutorial: Load streaming data with HTTP push
编写自己的提取规范 Tutorial: Writing an ingestion spec

监控

安全

参考


Wanglibing
Wanglibing
Engineer,Lifelong learner