一、認(rèn)識(shí)
分布式的支持實(shí)時(shí)分析的數(shù)據(jù)存儲(chǔ)系統(tǒng)辰如,處理海量規(guī)模的數(shù)據(jù)和實(shí)時(shí)方面比傳統(tǒng)的olap系統(tǒng)有顯著的性能改善
-
特點(diǎn)
快速查詢拌牲,數(shù)據(jù)預(yù)聚合和內(nèi)存華,使用bitmap和各種壓縮技術(shù)減少內(nèi)存占用撮珠,并維護(hù)一些倒排索引沮脖,有效提高數(shù)據(jù)的查詢效率,提高內(nèi)存的使用率
水平擴(kuò)展方面芯急,把數(shù)據(jù)按照時(shí)間進(jìn)行分區(qū)處理勺届,對(duì)于高基數(shù)維度的數(shù)據(jù)還可以再進(jìn)行segment的切片,歷史數(shù)據(jù)可存儲(chǔ)至HDFS娶耍、云服務(wù)等(需要查詢時(shí)再裝載到內(nèi)存)免姿,節(jié)點(diǎn)故障還可以根據(jù)zk進(jìn)行數(shù)據(jù)重構(gòu)
不可變的過去,僅追加的未來
-
數(shù)據(jù)格式
在數(shù)據(jù)攝入之前榕酒,需要定義一個(gè)DataSource胚膊,包含三個(gè)部分:時(shí)間序列、維度想鹰、指標(biāo)
數(shù)據(jù)攝入:支持實(shí)時(shí)流式數(shù)據(jù)和批處理數(shù)據(jù)
數(shù)據(jù)查詢:原生采用json格式通過http請(qǐng)求紊婉,支持大多數(shù)的標(biāo)準(zhǔn)sql查詢
二、架構(gòu)
2.1辑舷、節(jié)點(diǎn)描述
Druid包含4個(gè)節(jié)點(diǎn):
實(shí)時(shí)節(jié)點(diǎn):消費(fèi)流數(shù)據(jù)喻犁,以及生成segment文件
-
歷史節(jié)點(diǎn):加載生成好的數(shù)據(jù)文件,提供數(shù)據(jù)查詢
歷史節(jié)點(diǎn)在啟動(dòng)的時(shí)候,會(huì)先檢查自己的本地緩存中已存在的Segment株汉,再?gòu)膁eep storage中下載屬于自己的但是不在本地磁盤的Segment文件筐乳,然后再把相關(guān)的Segment加載到內(nèi)存里提供查詢服務(wù)。查詢效率跟歷史節(jié)點(diǎn)的內(nèi)存大小有很大關(guān)系
Druid采用層的概念乔妈,將集群中的歷史節(jié)點(diǎn)按照性能容量等指標(biāo)劃分為不同的層蝙云,并且可以讓不同性質(zhì)的DataSource使用不用的層來存儲(chǔ)Segment文件
高可靠與可擴(kuò)展,節(jié)點(diǎn)的上下線通過zk進(jìn)行狀態(tài)通訊
協(xié)調(diào)節(jié)點(diǎn):負(fù)責(zé)歷史節(jié)點(diǎn)的數(shù)據(jù)負(fù)載均衡路召,以及通過規(guī)則(DataSource設(shè)置的加載或丟棄具體的數(shù)據(jù)文件)管理數(shù)據(jù)的生命周期(從元數(shù)據(jù)里獲取Segment的相關(guān)信息勃刨,將其根據(jù)規(guī)則的設(shè)置分配給符合條件的歷史節(jié)點(diǎn))
-
查詢節(jié)點(diǎn):負(fù)責(zé)對(duì)外提供數(shù)據(jù)查詢服務(wù)
查詢節(jié)點(diǎn)提供數(shù)據(jù)的對(duì)外查詢服務(wù),一般考慮到負(fù)載均衡和高可靠會(huì)有多個(gè)查詢節(jié)點(diǎn)
同時(shí)Druid依賴3個(gè)外部節(jié)點(diǎn):
深度存儲(chǔ):存放生成的segment文件股淡,提供給歷史節(jié)點(diǎn)進(jìn)行下載身隐,存儲(chǔ)介質(zhì)可以是本地硬盤、云服務(wù)唯灵、HDFS等
元數(shù)據(jù)存儲(chǔ):存儲(chǔ)segment文件的相關(guān)信息
分布式協(xié)調(diào)服務(wù):提供一致性的協(xié)調(diào)服務(wù)組件贾铝,一般是Zookeeper
2.3、節(jié)點(diǎn)之間的工作聯(lián)系
Druid類LSM-tree架構(gòu)的實(shí)時(shí)節(jié)點(diǎn)埠帕,在消費(fèi)實(shí)時(shí)流數(shù)據(jù)的時(shí)候垢揩,不會(huì)將數(shù)據(jù)寫入到WAL,而是將實(shí)時(shí)流數(shù)據(jù)寫入到堆內(nèi)存緩沖區(qū)里(相當(dāng)于HBase的Memstore)敛瓷,當(dāng)條件滿足后叁巨,會(huì)將數(shù)據(jù)flush到磁盤中生成一個(gè)數(shù)據(jù)塊(Segment Split),同時(shí)會(huì)在周期性時(shí)間內(nèi)將同一時(shí)間段內(nèi)的數(shù)據(jù)塊合并成一個(gè)大的數(shù)據(jù)塊Segment(相當(dāng)于HBase的Compact)呐籽,然后再上傳到Deep Storage中
當(dāng)歷史節(jié)點(diǎn)加載到了Segment后锋勺,會(huì)通過協(xié)調(diào)服務(wù)聲明從此時(shí)開始負(fù)責(zé)該Segment的讀取服務(wù),當(dāng)實(shí)時(shí)節(jié)點(diǎn)收到該聲明后也會(huì)立即向集群聲明不再負(fù)責(zé)對(duì)該Segment的查詢服務(wù)狡蝶。
對(duì)全局?jǐn)?shù)據(jù)來說庶橱,查詢節(jié)點(diǎn)會(huì)從實(shí)時(shí)節(jié)點(diǎn)(少量當(dāng)前數(shù)據(jù))和歷史節(jié)點(diǎn)(大量歷史數(shù)據(jù))分別查詢后再做一個(gè)結(jié)果的合并,最后再返回
2.2贪惹、存儲(chǔ)
采用了LSM-tree(日志結(jié)構(gòu)合并樹)的方法進(jìn)行數(shù)據(jù)存儲(chǔ)
對(duì)比\樹結(jié)構(gòu) | 二叉查找樹 | B+樹 | 日志結(jié)構(gòu)合并樹 |
---|---|---|---|
特點(diǎn) | 二叉有序樹悬包,保證左邊節(jié)點(diǎn)一定小于根節(jié)點(diǎn) | 樹的內(nèi)部節(jié)點(diǎn)(索引節(jié)點(diǎn))只保存鍵,葉子節(jié)點(diǎn)保存值馍乙,并且有指向相鄰節(jié)點(diǎn)的指針 | 使用了兩種樹的數(shù)據(jù)結(jié)構(gòu)來進(jìn)行數(shù)據(jù)存儲(chǔ)布近,C0樹負(fù)責(zé)新的數(shù)據(jù)的插入更新和讀請(qǐng)求,存放在內(nèi)存緩存中丝格,C1樹由C0樹的數(shù)據(jù)刷寫到磁盤中生成撑瞧,特點(diǎn)是有序且不可更改(類似HBase的數(shù)據(jù)寫入與合并過程) |
查找效率 | log2N-logN,跟樹的高度显蝌、平衡性相關(guān) | 所有葉子節(jié)點(diǎn)與根節(jié)點(diǎn)的距離相同预伺,任何查詢的效率很相似 | 存在內(nèi)存中的數(shù)據(jù)提供快速讀寫更新订咸,刷到磁盤中的數(shù)據(jù)使用布隆布隆過濾器進(jìn)行讀取 |
優(yōu)點(diǎn) | 實(shí)現(xiàn)簡(jiǎn)單,樹平衡的狀態(tài)下能達(dá)到log2N的查找效率 | 樹的高度較低酬诀,查找效率高脏嚷,與二叉樹相比,樹的更新操作直接從葉子節(jié)點(diǎn)開始瞒御,以較小的代價(jià)實(shí)現(xiàn)自平衡 | 利于海量數(shù)據(jù)的快速寫入父叙,海量數(shù)據(jù)中快速讀取某條數(shù)據(jù) |
缺點(diǎn) | 極端非平衡狀態(tài)下,樹的查找效率達(dá)到logN肴裙,相當(dāng)于順序查找趾唱, | 隨著數(shù)據(jù)的不斷插入,葉子節(jié)點(diǎn)會(huì)發(fā)生分裂蜻懦,導(dǎo)致邏輯上原本連續(xù)的數(shù)據(jù)會(huì)存在不同的物理磁盤位置上甜癞,在做范圍查詢時(shí)會(huì)導(dǎo)致較高的IO | 不適合大范圍的數(shù)據(jù)量查詢,不適合更新刪除操作頻繁的場(chǎng)景 |
2.4宛乃、數(shù)據(jù)結(jié)構(gòu)
-
DataSource:類似于mysql的表悠咱,包含時(shí)間字段(默認(rèn)使用utc格式且精確到毫秒級(jí)別,這個(gè)時(shí)間字段是聚合與查詢的重要維度)征炼、數(shù)據(jù)維度析既、指標(biāo),DataSource是一個(gè)邏輯概念
-
Segment:Segment是數(shù)據(jù)的物理存儲(chǔ)格式柒室,Druid通過Segment對(duì)數(shù)據(jù)進(jìn)行了橫縱向的數(shù)據(jù)切割。橫向指的是按照設(shè)定的時(shí)間粒度進(jìn)行將數(shù)據(jù)劃分到不同Segment的操作逗宜,這一設(shè)計(jì)使得Druid在查詢時(shí)不必再進(jìn)行明細(xì)數(shù)據(jù)的范圍掃描雄右,只需對(duì)所在時(shí)間范圍內(nèi)的數(shù)據(jù)塊進(jìn)行讀取操作,提高了數(shù)據(jù)的查詢效率纺讲;縱向指的是Druid使用了Bitmap等壓縮技術(shù)對(duì)數(shù)據(jù)塊進(jìn)行了壓縮
sequenceDiagram participant 實(shí)時(shí)節(jié)點(diǎn) participant 元數(shù)據(jù)管理 participant 深度存儲(chǔ) participant 協(xié)調(diào)節(jié)點(diǎn) participant 歷史節(jié)點(diǎn) participant zk 實(shí)時(shí)節(jié)點(diǎn)-->>元數(shù)據(jù)管理: 消費(fèi)實(shí)時(shí)數(shù)據(jù)生成Segment的元信息 實(shí)時(shí)節(jié)點(diǎn)->>深度存儲(chǔ): 傳輸實(shí)時(shí)消費(fèi)生成的Segment文件 元數(shù)據(jù)管理-->>協(xié)調(diào)節(jié)點(diǎn): 協(xié)調(diào)節(jié)點(diǎn)-->>元數(shù)據(jù)管理: 協(xié)調(diào)節(jié)點(diǎn)得知Segment元信息 協(xié)調(diào)節(jié)點(diǎn)-->>zk: 根據(jù)規(guī)則分配給符合條件的歷史節(jié)點(diǎn) zk-->>協(xié)調(diào)節(jié)點(diǎn): 歷史節(jié)點(diǎn)->>深度存儲(chǔ): 從存儲(chǔ)系統(tǒng)里下載指定的Segment zk-->>歷史節(jié)點(diǎn): 獲取對(duì)應(yīng)Segment的下載指令 歷史節(jié)點(diǎn)-->>zk: 通過zk聲明其提供該Segment的查詢服務(wù) 實(shí)時(shí)節(jié)點(diǎn)-->>zk: 通過zk聲明不再提供該Segment的查詢服務(wù)