解決兩個(gè)核心問題:
-. RDBMS的查詢太慢茉盏。
-. 支持靈活的查詢分析能力议谷。
Druid的三個(gè)設(shè)計(jì)原則
- 快速查詢:部分?jǐn)?shù)據(jù)的聚合(Partial Aggregate) + 內(nèi)存化(In-Memory) + 索引(Index)
- 水平擴(kuò)展能力:分布式數(shù)據(jù)(Distributed Data) + 并行化查詢(Parallelizable Query)
- 實(shí)時(shí)分析: 不可變的過去主届,只追加的未來(Immutable Past, Append-Only Future)
快速查詢
大部分?jǐn)?shù)據(jù)分析場景,我們只會(huì)關(guān)心一定粒度聚合的數(shù)據(jù)宜鸯,而非每一行的原始數(shù)據(jù)的細(xì)節(jié)情況腾供,給Druid爭取了很大的性能優(yōu)化空間仆邓。精細(xì)的內(nèi)存使用設(shè)置,如BItMap和各種壓縮技術(shù)伴鳖。為了支持Drill-Down某些維度节值,Druid維護(hù)了一些倒排索引。這種凡是可以加快AND和OR等計(jì)算操作榜聂。
水平擴(kuò)展能力
數(shù)據(jù)可以分布在多個(gè)節(jié)點(diǎn)的內(nèi)存中搞疗,因此當(dāng)數(shù)據(jù)增長的時(shí)候,可以通過簡單增加機(jī)器的方式進(jìn)行擴(kuò)容须肆。為了保持平衡匿乃,Druid按照時(shí)間范圍把聚合數(shù)據(jù)進(jìn)行分區(qū)處理。歷史Segment數(shù)據(jù)可以保存在深度存儲(chǔ)系統(tǒng)(HDFS等)中豌汇。如果某些節(jié)點(diǎn)出現(xiàn)故障幢炸,可借助Zookeeper協(xié)調(diào)其他節(jié)點(diǎn)進(jìn)行重新構(gòu)造。Druid查詢模塊能夠感知和處理集群的狀態(tài)變化拒贱。
實(shí)時(shí)分析
Druid提供了包含基于時(shí)間維度數(shù)據(jù)的存儲(chǔ)服務(wù)宛徊,并且任何一行數(shù)據(jù)都是歷史真實(shí)發(fā)生的時(shí)間,因此在設(shè)計(jì)之初就約定時(shí)間一旦進(jìn)入系統(tǒng)柜思,就不能在改變岩调。
Druid的技術(shù)特點(diǎn)
- 數(shù)據(jù)吞吐量大
- 支持流式數(shù)據(jù)攝入和實(shí)時(shí)
- 查詢靈活且快
- 社區(qū)支持力度大
Druid的基本概念
數(shù)據(jù)格式
Druid在數(shù)據(jù)攝入之前,首先需要定義一個(gè)數(shù)據(jù)源(DataSource)赡盘, 這個(gè)DataSource有些類似數(shù)據(jù)庫中表的概念号枕。每個(gè)數(shù)據(jù)集包括三個(gè)部分:時(shí)間列(TimeStamp)、維度列(Dimension)和指標(biāo)列(Metric)陨享。
- 時(shí)間列
每個(gè)數(shù)據(jù)集合必須有時(shí)間列葱淳,Druid會(huì)講時(shí)間很近的一些數(shù)據(jù)行聚合在一起。因此所有的查詢都需要指定查詢時(shí)間范圍抛姑。 - 維度列
用來標(biāo)識(shí)一些事件(Event)赞厕,這些標(biāo)識(shí)主要用于過濾或者切片數(shù)據(jù),維度列的字段為字符串類型定硝。隨著業(yè)務(wù)分析的精細(xì)化皿桑,增加維度列也是一個(gè)常見的需求。 - 指標(biāo)列
用于聚合和計(jì)算的列。