2-Druid架构-Druid white paper
ARCHITECTURE
Real-time Nodes
Events 索引化便于查询,只关注小时间范围的事件,然后收集到的将不可变的批次事件,传递给集群中特定处理该类事件的其他节点。期间依赖Zookeeper协调集群
索引化过程,内存中的buffer构建索引,定期将这些索引存到外部
real-time节点定期调度一个后台任务组织合并索引,将所涉及的不可变数据构建一个数据块即一个segment,并在handoff阶段将这些数据存到外部存储deep storage中。
所以整个过程是ingest事件,persist索引,merge索引,handoff数据segment到deep storage
例如:node在13:37启动开始接收数据并设置每个segment为1小时,并设置为每10分钟(可具体设置)将数据向deep storage persit,在接近14:00和向15点的分界点,不会立即
将segment生成,而是稍延后等到处理窗完成后生成segment,对外声明该窗给处理完毕,开始14:00-15:00的segment
可用性和负载考虑,producter和consumer间一般会添加一级message bus如kafka,一方面提供数据缓存,产生数据offet消费标记,供错误重读等,另一方面,message bus作为单点供多个consumer节点分段同时消费
Historical Nodes
- Tiers层管理
- 可用性
Broker Nodes
- 历史数据的Caching功能
- 可用性
Coordinator Nodes
负责数据在historical nodes上的管理和分布,告知historical nodes加载新数据,drop过期数据,复制数据和数据均衡移动。Coordinator Nodes以选举形式产生,多余的节点作为备用。定期判决集群状态,一方面和zk连接获得集群信息,一方面和MySQL数据库连接,MySQL数据库包含额外的操作参数和配置信息,其中最重要的是historical nodes需要服务的segments列表。该列表可以被任务产生segments的service(如real-time 节点)更新。MySQL数据库还包含管理segment如何在集群中生成、销毁、复制的规则表
- Rules
- load Balancing
- 可用性
同理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
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.