2-Druid架构-Druid white paper

ARCHITECTURE 

Real-time Nodes

Events 索引化便于查询,只关注小时间范围的事件,然后收集到的将不可变的批次事件,传递给集群中特定处理该类事件的其他节点。期间依赖Zookeeper协调集群

索引化过程,内存中的buffer构建索引,定期将这些索引存到外部

2-Druid架构-Druid white paper

real-time节点定期调度一个后台任务组织合并索引,将所涉及的不可变数据构建一个数据块即一个segment,并在handoff阶段将这些数据存到外部存储deep storage中。
所以整个过程是ingest事件,persist索引,merge索引,handoff数据segment到deep storage

2-Druid架构-Druid white paper

例如:node在13:37启动开始接收数据并设置每个segment为1小时,并设置为每10分钟(可具体设置)将数据向deep storage persit,在接近14:00和向15点的分界点,不会立即

将segment生成,而是稍延后等到处理窗完成后生成segment,对外声明该窗给处理完毕,开始14:00-15:00的segment

2-Druid架构-Druid white paper

可用性和负载考虑,producter和consumer间一般会添加一级message bus如kafka,一方面提供数据缓存,产生数据offet消费标记,供错误重读等,另一方面,message bus作为单点供多个consumer节点分段同时消费

Historical Nodes 

Historical nodes负责数据加载和对外提供real-time节点生产的不可变数据segment,并且是无依赖的每个Historical node独立工作,独立知晓数据的load,drop等服务,数据的处理整个过程以命令形式下发各Zookeeper.在数据加载时,预先判断本地是否存在,准备好内存后申请加载缺失的数据,数据必须通过加载到内存后对外提供查询。

2-Druid架构-Druid white paper

  • Tiers层管理
Historical nodes可以通过不同优先级的Tiers层管理,依据segments的重要性分级别提供服务
  • 可用性
Historical nodes通过Zookeeper提供可用性保障,当Zookeeper宕,historical nodes节点上已有数据仍可以对外服务,而新数据和drop等操作不可用

Broker Nodes 

Broker nodes 作为historical和real-time节点的路由,知道发布在Zookeeper中的可查询segments和segments的位置,将caller的查询请求命中正确的historical or real-time nodes,同时对来自两类节点的partial性的结果在返回caller前合并整合。
  • 历史数据的Caching功能
Broker nodes提供数据并整合Caching功能,对数据查询Broker nodes查询相关的segment,当segment以在Cach中时不需要重新计算,对Cach中没有的数据,查询到后会以local memory或者外部分布式KV存储形式进行cache供以后加速查询。同时real-time data的查询由于易变不提供cache,另一方面cache也是有失效性控制的
2-Druid架构-Druid white paper
  • 可用性
即便在Zookeeper宕,broker nodes以最近一次对集群中real-time and historical nodes的感知提供查询

Coordinator Nodes

负责数据在historical nodes上的管理和分布,告知historical nodes加载新数据,drop过期数据,复制数据和数据均衡移动。Coordinator Nodes以选举形式产生,多余的节点作为备用。
定期判决集群状态,一方面和zk连接获得集群信息,一方面和MySQL数据库连接,MySQL数据库包含额外的操作参数和配置信息,其中最重要的是historical nodes需要服务的segments列表。该列表可以被任务产生segments的service(如real-time 节点)更新。MySQL数据库还包含管理segment如何在集群中生成、销毁、复制的规则表
  • Rules
管理historical segments的load和drop。指示segments如何在不同的historical node的tiers中部分以及不同tiers中的复制,coordinator nodes加载rules后对所有的segments遍历操作一遍
  • load Balancing
通过策略将segments复制到不同的节点上
  • 可用性
和Zookeeper连接知道historical nodes,Zookeeper宕,不可以下发drop segments和balace的指令,但是不影响已有的可用数据。
同理MySQL宕,停止分配新的segments和drop过期数据,broker、historical和real-time节点仍可查询

STORAGE FORMAT

Druid中的data sources(表)来记录时间戳标识的事件,事件以segments集合分区,每个segment一般是5-10百万行,segment是操作和数据组织的单元。
  • segment以data source、time间隔和递增的version唯一标识,其中version标识数据的刷新,后面version的数据有更新的数据views
  • 列存储,有不同的列存储形式,LZF压缩算法
  • Indices for Filtering Data对string列构建索,利用bitmap来加速查询,采用Concise algorithm压缩bitmap 
【1】Bitmap indices for OLAP workloads
P. O’Neil and D. Quass. Improved query performance with variant indexes. In ACM Sigmod Record, volume 26, pages 38–49. ACM, 1997.
【2】Bitmap compression algorithms
G. Antoshenkov. Byte-aligned bitmap compression. In Data Compression Conference, 1995. DCC’95. Proceedings, page 476. IEEE, 1995.
S. J. van Schaik and O. de Moor. A memory efficient reachability data structure through bit vector compression. In Proceedings of the 2011 international conference on Management of data, pages 913–924. ACM, 2011.
K. Wu, E. J. Otoo, and A. Shoshani. Optimizing bitmap indices with efficient compression. ACM Transactions on Database Systems (TODS), 31(1):1–38, 2006.
A. Colantonio and R. Di Pietro. Concise: Compressed ‘n’composable integer set. Information Processing Letters, 110(16):644–650, 2010.

QUERY API

特有的query语法,以POST形式请求,body是JSON,主要包含
  • data source name
  • 结果数据组织形式
  • 事件范围
  • request的类型
  • 需要聚合的metrics
  • filter集合(维度和值的布尔表达式)

Timestamp

Page

Username

Gender

City

Characters Added

Characters Removed

2011-01-01T01:00:00Z

Justin Bieber

Boxer

Male

San Francisco

1800

25

2011-01-01T01:00:00Z

Justin Bieber

Reach

Male

Waterloo

2912

42

2011-01-01T02:00:00Z

Ke$ha

Helz

Male

Calgary

1953

17

2011-01-01T02:00:00Z

Ke$ha

Xeno

Male

Taiyuan

3194

170

Table 1: Sample Druid data for edits that have occurred on Wikipedia. 

统计Wikipedia数据源的2013-01-01 to 2013-01-08的“page”维度为“Ke$ha”的行数,对day进行group by 
2-Druid架构-Druid white paper
返回结果为:
2-Druid架构-Druid white paper
不支持join,具体说明详见原文
支持的聚合API:http://druid.io/docs/latest/Querying.html 

DRUID IN PRODUCTION 

以后待补充