Druid基本概念及架構(gòu)介紹

Druid基本概念及架構(gòu)介紹


1.什么是Druid

Druid是一個專為大型數(shù)據(jù)集上的高性能切片和OLAP分析而設計的數(shù)據(jù)存儲。Druid最常用作為GUI分析應用程序提供動力的數(shù)據(jù)存儲遗契,或者用作需要快速聚合的高度并發(fā)API的后端需频。Druid的常見應用領域包括:

  • 點擊流分析

  • 網(wǎng)絡流量分析

  • 服務器指標存儲

  • 應用性能指標

  • 數(shù)字營銷分析

  • 商業(yè)智能/OLAP

2.druid的主要特點

  • 1.列式存儲格式 Druid使用面向列的存儲巩剖,這意味著它只需要加載特定查詢所需的精確列憔古。這為僅查看幾列的查詢提供了巨大的速度提升罢坝。此外暑始,每列都針對其特定數(shù)據(jù)類型進行了優(yōu)化搭独,支持快速掃描和聚合。

  • 2.高可用性與高可拓展性 Druid采用分布式廊镜、SN(share-nothing)架構(gòu)牙肝,管理類節(jié)點可配置HA,工作節(jié)點功能單一嗤朴,不相互依賴配椭,這些特性都使得Druid集群在管理、容錯雹姊、災備股缸、擴容等方面變得十分簡單。Druid通常部署在數(shù)十到數(shù)百臺服務器的集群中吱雏,并且可以提供數(shù)百萬條記錄/秒的攝取率敦姻,保留數(shù)萬億條記錄瘾境,以及亞秒級到幾秒鐘的查詢延遲。

  • 3.大規(guī)模并行處理 Druid可以在整個集群中并行處理查詢镰惦。

  • 4.實時或批量攝取 實時流數(shù)據(jù)分析迷守。區(qū)別于傳統(tǒng)分析型數(shù)據(jù)庫采用的批量導入數(shù)據(jù)進行分析的方式,Druid提供了實時流數(shù)據(jù)分析旺入,采用LSM(Long structure-merge)-Tree結(jié)構(gòu)使Druid擁有極高的實時寫入性能兑凿;同時實現(xiàn)了實時數(shù)據(jù)在亞秒級內(nèi)的可視化。

  • 5.自愈茵瘾,自平衡礼华,易于操作 作為運營商,要將群集擴展或縮小龄捡,只需添加或刪除服務器卓嫂,群集將在后臺自動重新平衡,無需任何停機時間聘殖。如果任何Druid服務器發(fā)生故障晨雳,系統(tǒng)將自動路由損壞,直到可以更換這些服務器奸腺。Druid旨在全天候運行餐禁,無需任何原因計劃停機,包括配置更改和軟件更新突照。

  • 6.云原生帮非,容錯的架構(gòu),不會丟失數(shù)據(jù) 一旦Druid攝取了您的數(shù)據(jù)讹蘑,副本就會安全地存儲在深層存儲(通常是云存儲末盔,HDFS或共享文件系統(tǒng))中。即使每個Druid服務器都出現(xiàn)故障座慰,您的數(shù)據(jù)也可以從深層存儲中恢復陨舱。對于僅影響少數(shù)Druid服務器的更有限的故障,復制可確保在系統(tǒng)恢復時仍可進行查詢版仔。

  • 7.亞秒級的OLAP查詢分析 Druid采用了列式存儲游盲、倒排索引、位圖索引等關鍵技術(shù)蛮粮,能夠在亞秒級別內(nèi)完成海量數(shù)據(jù)的過濾益缎、聚合以及多維分析等操作。

  • 8.近似算法 Druid包括用于近似計數(shù) - 不同然想,近似排序以及近似直方圖和分位數(shù)的計算的算法绪抛。這些算法提供有限的內(nèi)存使用匕得,并且通常比精確計算快得多卓舵。對于精確度比速度更重要的情況,Druid還提供精確計數(shù) - 不同且精確的排名熙卡。

  • 9.豐富的數(shù)據(jù)分析功能針對不同用戶群體杖刷,Druid提供了友好的可視化界面励饵、類SQL查詢語言以及REST 查詢接口。

3.為什么會有Druid

大數(shù)據(jù)時代滑燃,如何從海量數(shù)據(jù)中提取有價值的信息役听,是一個亟待解決的難題。針對這個問題表窘,IT巨頭們已經(jīng)開發(fā)了大量的數(shù)據(jù)存儲與分析類產(chǎn)品典予,比如IBM Netezza、HP Vertica乐严、EMC GreenPlum等瘤袖,但是他們大多是昂貴的商業(yè)付費類產(chǎn)品,業(yè)內(nèi)使用者寥寥昂验。

而受益于近年來高漲的開源精神捂敌,業(yè)內(nèi)出現(xiàn)了眾多優(yōu)秀的開源項目,其中最有名的當屬Apache Hadoop生態(tài)圈既琴。時至今日占婉,Hadoop已經(jīng)成為了大數(shù)據(jù)的“標準”解決方案,但是甫恩,人們在享受Hadoop便捷數(shù)據(jù)分析的同時逆济,也必須要忍受Hadoop在設計上的許多“痛點”,下面就羅列三方面的問題:

  • 1.何時能進行數(shù)據(jù)查詢磺箕? 對于Hadoop使用的Map/Reduce批處理框架奖慌,數(shù)據(jù)何時能夠查詢沒有性能保證。

  • 2.隨機IO問題松靡。 Map/Reduce批處理框架所處理的數(shù)據(jù)需要存儲在HDFS上简僧,而HDFS是一個以集群硬盤作為存儲資源池的分布式文件系統(tǒng),那么在海量數(shù)據(jù)的處理過程中击困,必然會引起大量的讀寫操作涎劈,此時隨機IO就成為了高并發(fā)場景下的性能瓶頸。

  • 3.數(shù)據(jù)可視化問題阅茶。 HDFS是一個優(yōu)秀的分布式文件系統(tǒng)蛛枚,但是對于數(shù)據(jù)分析以及數(shù)據(jù)的即席查詢,HDFS并不是最優(yōu)的選擇脸哀。

傳統(tǒng)的大數(shù)據(jù)處理架構(gòu)Hadoop更傾向于一種“后臺批處理的數(shù)據(jù)倉庫系統(tǒng)”蹦浦,其作為海量歷史數(shù)據(jù)保存、冷數(shù)據(jù)分析撞蜂,確實是一個優(yōu)秀的通用解決方案盲镶,但是如何保證高并發(fā)環(huán)境下海量數(shù)據(jù)的查詢分析性能侥袜,以及如何實現(xiàn)海量實時數(shù)據(jù)的查詢分析與可視化,Hadoop確實顯得有些無能為力溉贿。

4.Druid直面的痛點

Druid的母公司MetaMarket在2011年以前也是Hadoop的擁躉者枫吧,但是在高并發(fā)環(huán)境下,Hadoop并不能對數(shù)據(jù)可用性以及查詢性能給出產(chǎn)品級別的保證宇色,使得MetaMarket必須去尋找新的解決方案九杂,當嘗試使用了各種關系型數(shù)據(jù)庫以及NoSQL產(chǎn)品后,他們覺得這些已有的工具都不能解決他們的“痛點”宣蠕,所以決定在2011年開始研發(fā)自己的“輪子”Druid例隆,他們將Druid定義為“開源、分布式抢蚀、面向列式存儲的實時分析數(shù)據(jù)存儲系統(tǒng)”镀层,所要解決的“痛點”也是上文中反復提及的“在高并發(fā)環(huán)境下,保證海量數(shù)據(jù)查詢分析性能皿曲,同時又提供海量實時數(shù)據(jù)的查詢唱逢、分析與可視化功能”。

5.什么時候應該使用Druid

  • 1.如果您的用例符合以下幾個描述符谷饿,Druid可能是一個不錯的選擇:

    • 插入率非常高惶我,但更新不常見。

    • 您的大多數(shù)查詢都是聚合和報告查詢(“分組依據(jù)”查詢)博投。您可能還有搜索和掃描查詢绸贡。

    • 您將查詢延遲定位為100毫秒到幾秒鐘。

    • 您的數(shù)據(jù)有一個時間組件(Druid包括與時間特別相關的優(yōu)化和設計選擇)毅哗。

    • 您可能有多個表听怕,但每個查詢只能訪問一個大的分布式表。查詢可能會觸發(fā)多個較小的“查找”表虑绵。

    • 您有高基數(shù)數(shù)據(jù)列(例如URL尿瞭,用戶ID),需要對它們進行快速計數(shù)和排名翅睛。

    • 您希望從Kafka声搁,HDFS,平面文件或?qū)ο蟠鎯Γㄈ鏏mazon S3)加載數(shù)據(jù)捕发。

  • 2.情況下疏旨,您可能會不希望使用Druid包括:

    • 您需要使用主鍵對現(xiàn)有記錄進行低延遲更新。Druid支持流式插入扎酷,但不支持流式更新(使用后臺批處理作業(yè)進行更新)檐涝。

    • 您正在構(gòu)建一個脫機報告系統(tǒng),其中查詢延遲不是很重要。

    • 你想做“大”連接(將一個大事實表連接到另一個大事實表)谁榜。

6.Druid架構(gòu)

Druid擁有一個多進程幅聘,分布式架構(gòu),旨在實現(xiàn)云友好且易于操作窃植。每個Druid流程類型都可以獨立配置和擴展帝蒿,為您的群集提供最大的靈活性。此設計還提供增強的容錯能力:一個組件的中斷不會立即影響其他組件撕瞧。

Druid架構(gòu)

Druid集群包含多種節(jié)點類型陵叽,分別是Historical Node、Coordinator Node丛版、Broker Node、Indexing Service Node(包括Overlord偏序、MiddleManager和Peon)以及Realtime Node(包括Firehose和Plumber)页畦。

Druid將整個集群切分成上述角色,有兩個目的:

  • 第一研儒,劃分Historical Node和Realtime Node豫缨,是將歷史數(shù)據(jù)的加載與實時流數(shù)據(jù)處理切割開來,因為二者都需要占用大量內(nèi)存與CPU端朵;

  • 第二好芭,劃分Coordinator Node和Broker Node,將查詢需求與數(shù)據(jù)如何在集群內(nèi)分布的需求切割開來冲呢,確保用戶的查詢請求不會影響數(shù)據(jù)在集群內(nèi)的分布情況舍败,從而不會造成數(shù)據(jù)“冷熱不均”,局部過熱敬拓,影響查詢性能的問題邻薯。

下圖給出了Druid集群內(nèi)部的實時/批量數(shù)據(jù)流以及查詢請求過程。我們可以看到乘凸,實時數(shù)據(jù)到達Realtime Node厕诡,經(jīng)過Indexing Service,在時間窗口內(nèi)的數(shù)據(jù)會停留在Realtime Node內(nèi)存中营勤,而時間窗口外的數(shù)據(jù)會組織成Segment存儲到Deep Storage中灵嫌;批量數(shù)據(jù)經(jīng)過Indexing Service也會被組織成Segment存儲到DeepStorage中,同時Segment的元信息都會被注冊到元信息庫中葛作,Coordinator Nodes會定期(默認為1分鐘)去同步元信息庫寿羞,感知新生成的Segment,并通知在線的Historical Node去加載Segment进鸠,Zookeeper也會更新整個集群內(nèi)部數(shù)據(jù)分布拓撲圖稠曼。

圖-3.5-實時/批量數(shù)據(jù)流與查詢過程

當用戶需要查詢信息時,會將請求提交給Broker Node,Broker Node會請求Zookeeper獲取集群內(nèi)數(shù)據(jù)分布拓撲圖霞幅,從而知曉請求應該發(fā)給哪些Historical Node以及Realtime Node漠吻,匯總各節(jié)點的返回數(shù)據(jù)并將最終結(jié)果返回給用戶。

7.Druid集群節(jié)點

7.1Historical Node
  • Historical Node的職責單一司恳,就是負責加載Druid中非實時窗口內(nèi)且滿足加載規(guī)則的所有歷史數(shù)據(jù)的Segment途乃。每一個Historical Node只與Zookeeper保持同步,不與其他類型節(jié)點或者其他Historical Node進行通信扔傅。

  • Coordinator Nodes會定期(默認為1分鐘)去同步元信息庫耍共,感知新生成的Segment,將待加載的Segment信息保存在Zookeeper中在線的Historical Nodes的load queue目錄下猎塞,當Historical Node感知到需要加載新的Segment時试读,首先會去本地磁盤目錄下查找該Segment是否已下載,如果沒有荠耽,則會從Zookeeper中下載待加載Segment的元信息钩骇,此元信息包括Segment存儲在何處、如何解壓以及如何如理該Segment铝量。Historical Node使用內(nèi)存文件映射方式將index.zip中的XXXXX.smoosh文件加載到內(nèi)存中倘屹,并在Zookeeper中本節(jié)點的served segments目錄下聲明該Segment已被加載,從而該Segment可以被查詢慢叨。對于重新上線的Historical Node纽匙,在完成啟動后,也會掃描本地存儲路徑拍谐,將所有掃描到的Segment加載如內(nèi)存烛缔,使其能夠被查詢。

7.2Broker Node
  • Broker Node是整個集群查詢的入口赠尾,作為查詢路由角色力穗,Broker Node感知Zookeeper上保存的集群內(nèi)所有已發(fā)布的Segment的元信息,即每個Segment保存在哪些存儲節(jié)點上气嫁,Broker Node為Zookeeper中每個dataSource創(chuàng)建一個timeline当窗,timeline按照時間順序描述了每個Segment的存放位置。我們知道寸宵,每個查詢請求都會包含dataSource以及interval信息崖面,Broker Node根據(jù)這兩項信息去查找timeline中所有滿足條件的Segment所對應的存儲節(jié)點,并將查詢請求發(fā)往對應的節(jié)點.

  • 對于每個節(jié)點返回的數(shù)據(jù)梯影,Broker Node默認使用LRU緩存策略巫员;對于集群中存在多個Broker Node的情況,Druid使用memcached共享緩存甲棍。對于Historical Node返回的結(jié)果简识,Broker Node認為是“可信的”,會緩存下來,而Real-Time Node返回的實時窗口內(nèi)的數(shù)據(jù)七扰,Broker Node認為是可變的奢赂,“不可信的”,故不會緩存颈走。所以對每個查詢請求膳灶,Broker Node都會先查詢本地緩存,如果不存在才會去查找timeline立由,再向相應節(jié)點發(fā)送查詢請求轧钓。

7.3Coordinator Node
  • Coordinator Node主要負責Druid集群中Segment的管理與發(fā)布,包括加載新Segment锐膜、丟棄不符合規(guī)則的Segment毕箍、管理Segment副本以及Segment負載均衡等。如果集群中存在多個Coordinator Node枣耀,則通過選舉算法產(chǎn)生Leader霉晕,其他Follower作為備份。

  • Coordinator會定期(默認一分鐘)同步Zookeeper中整個集群的數(shù)據(jù)拓撲圖捞奕、元信息庫中所有有效的Segment信息以及規(guī)則庫,從而決定下一步應該做什么拄轻。對于有效且未分配的Segment颅围,Coordinator Node首先按照Historical Node的容量進行倒序排序,即最少容量擁有最高優(yōu)先級恨搓,新的Segment會優(yōu)先分配到高優(yōu)先級的Historical Node上院促。由之前介紹我們知道,Coordinator Node不會直接與Historical Node打交道斧抱,而是在Zookeeper中Historical Node對應的load queue目錄下創(chuàng)建待加載Segment的臨時信息常拓,等待Historical Node去加載該Segment。

  • Coordinator在每次啟動后都會對比Zookeeper中保存的當前數(shù)據(jù)拓撲圖以及元信息庫中保存的數(shù)據(jù)信息辉浦,所有在集群中已被加載的弄抬、卻在元信息庫中標記為失效或者不存在的Segment會被Coordinator Node記錄在remove list中,同一Segment對應的新舊version宪郊,舊version的Segments同樣也會被放入到remove list中掂恕,最終被邏輯丟棄。

  • 對于離線的Historical Node弛槐,Coordinator Node會默認該Historical Node上所有的Segment已失效懊亡,從而通知集群內(nèi)的其他Historical Node去加載該Segment。但是乎串,在生產(chǎn)環(huán)境中店枣,我們會遇到機器臨時下線,Historical Node在很短時間內(nèi)恢復服務的情況,那么如此“簡單粗暴”的策略勢必會加重整個集群內(nèi)的網(wǎng)絡負載鸯两。對于這種場景闷旧,Coordinator會為集群內(nèi)所有已丟棄的Segment保存一個生存時間(lifetime),這個生存時間表示Coordinator Node在該Segment被標記為丟棄后甩卓,允許不被重新分配最長等待時間鸠匀,如果該Historical Node在該時間內(nèi)重新上線,則Segment會被重新置為有效逾柿,如果超過該時間則會按照加載規(guī)則重新分配到其他Historical Node上缀棍。

  • 考慮一種最極端的情況,如果集群內(nèi)所有的Coordinator Node都停止服務机错,整個集群對外依然有效爬范,不過新Segment不會被加載,過期的Segment也不會被丟棄弱匪,即整個集群內(nèi)的數(shù)據(jù)拓撲會一直保持不變青瀑,直到新的Coordinator Node服務上線。

7.4Indexing Service

Indexing Service是負責“生產(chǎn)”Segment的高可用萧诫、分布式斥难、Master/Slave架構(gòu)服務。主要由三類組件構(gòu)成:負責運行索引任務(indexing task)的Peon帘饶,負責控制Peon的MiddleManager哑诊,負責任務分發(fā)給MiddleManager的Overlord;三者的關系可以解釋為:Overlord是MiddleManager的Master及刻,而MiddleManager又是Peon的Master镀裤。其中,Overlord和MiddleManager可以分布式部署缴饭,但是Peon和MiddleManager默認在同一臺機器上暑劝。圖-3.5給出了Indexing Service的整體架構(gòu)。

圖-3.6-indexing Service整體架構(gòu)
  • Overlord

    • Overlord負責接受任務颗搂、協(xié)調(diào)任務的分配担猛、創(chuàng)建任務鎖以及收集、返回任務運行狀態(tài)給調(diào)用者峭火。當集群中有多個Overlord時毁习,則通過選舉算法產(chǎn)生Leader,其他Follower作為備份卖丸。

    • Overlord可以運行在local(默認)和remote兩種模式下纺且,如果運行在local模式下,則Overlord也負責Peon的創(chuàng)建與運行工作稍浆,當運行在remote模式下時载碌,Overlord和MiddleManager各司其職猜嘱,根據(jù)圖3.6所示,Overlord接受實時/批量數(shù)據(jù)流產(chǎn)生的索引任務嫁艇,將任務信息注冊到Zookeeper的/task目錄下所有在線的MiddleManager對應的目錄中朗伶,由MiddleManager去感知產(chǎn)生的新任務,同時每個索引任務的狀態(tài)又會由Peon定期同步到Zookeeper中/Status目錄步咪,供Overlord感知當前所有索引任務的運行狀況论皆。

    • Overlord對外提供可視化界面,通過訪問http://ip/console.html猾漫,我們可以觀察到集群內(nèi)目前正在運行的所有索引任務点晴、可用的Peon以及近期Peon完成的所有成功或者失敗的索引任務。

  • MiddleManager

    • MiddleManager負責接收Overlord分配的索引任務悯周,同時創(chuàng)建新的進程用于啟動Peon來執(zhí)行索引任務粒督,每一個MiddleManager可以運行多個Peon實例。

    • 在運行MiddleManager實例的機器上禽翼,我們可以在${ java.io.tmpdir}目錄下觀察到以XXX_index_XXX開頭的目錄屠橄,每一個目錄都對應一個Peon實例;同時restore.json文件中保存著當前所有運行著的索引任務信息闰挡,一方面用于記錄任務狀態(tài)锐墙,另一方面如果MiddleManager崩潰,可以利用該文件重啟索引任務长酗。

  • Peon

    • Peon是Indexing Service的最小工作單元贮匕,也是索引任務的具體執(zhí)行者,所有當前正在運行的Peon任務都可以通過Overlord提供的web可視化界面進行訪問花枫。
7.5Real-Time Node

在流式處理領域,有兩種數(shù)據(jù)處理模式掏膏,一種為Stream Push劳翰,另一種為Stream Pull。

  • Stream Pull 如果Druid以Stream Pull方式自主地從外部數(shù)據(jù)源拉取數(shù)據(jù)從而生成Indexing Service Tasks馒疹,我們則需要建立Real-Time Node佳簸。Real-Time Node主要包含兩大“工廠”:一個是連接流式數(shù)據(jù)源、負責數(shù)據(jù)接入的Firehose(中文翻譯為水管颖变,很形象地描述了該組件的職責)生均;另一個是負責Segment發(fā)布與轉(zhuǎn)移的Plumber(中文翻譯為搬運工,同樣也十分形象地描述了該組件的職責)腥刹。在Druid源代碼中马胧,這兩個組件都是抽象工廠方法,使用者可以根據(jù)自己的需求創(chuàng)建不同類型的Firehose或者Plumber衔峰。Firehose和Plumber給我的感覺佩脊,更類似于Kafka_0.9.0版本后發(fā)布的Kafka Connect框架蛙粘,F(xiàn)irehose類似于Kafka Connect Source,定義了數(shù)據(jù)的入口威彰,但并不關心接入數(shù)據(jù)源的類型出牧;而Plumber類似于Kafka Connect Sink,定義了數(shù)據(jù)的出口歇盼,也不關心最終輸出到哪里舔痕。

  • Stream Push 如果采用Stream Push策略,我們需要建立一個“copy service”豹缀,負責從數(shù)據(jù)源中拉取數(shù)據(jù)并生成Indexing Service Tasks伯复,從而將數(shù)據(jù)“推入”到Druid中,我們在druid_0.9.1版本之前一直使用的是這種模式耿眉,不過這種模式需要外部服務Tranquility边翼,Tranquility組件可以連接多種流式數(shù)據(jù)源,比如Spark-Streaming鸣剪、Storm以及Kafka等组底,所以也產(chǎn)生了Tranquility-Storm、Tranquility-Kafka等外部組件筐骇。

8.外部拓展

Druid集群依賴一些外部組件债鸡,與其說依賴,不如說正是由于Druid開放的架構(gòu)铛纬,所以用戶可以根據(jù)自己的需求厌均,使用不同的外部組件。

  • Deep Storage Druid目前支持使用本地磁盤(單機模式)告唆、NFS掛載磁盤棺弊、HDFS、Amazon S3等存儲方式保存Segments以及索引任務日志擒悬。

  • Zookeeper Druid使用Zookeeper作為分布式集群內(nèi)部的通信組件模她,各類節(jié)點通過Curator Framework將實例與服務注冊到Zookeeper上,同時將集群內(nèi)需要共享的信息也存儲在Zookeeper目錄下懂牧,從而簡化集群內(nèi)部自動連接管理侈净、leader選舉、分布式鎖僧凤、path緩存以及分布式隊列等復雜邏輯畜侦。

  • Metadata Storage Druid集群元信息使用MySQL 或者PostgreSQL存儲,單機版使用derby躯保。在Druid_0.9.1.1版本中旋膳,元信息庫druid主要包含十張表,均以“druid_”開頭吻氧,如圖-3.7所示溺忧。

圖-3.7-Druid元信息庫中的十張表

(1) Load/Drop Segments規(guī)則表 druid_rules

圖-3.8-Druid_ruleschema
圖-3.9-Druid_rules樣例數(shù)據(jù)

我們通過訪問http://<coordinator>:<port>對不同datasource配置不同的Load/Drop規(guī)則咏连,規(guī)則保存在表druid_rules中,由Coordinator定期獲取鲁森,通知在線的HistoricalNode去加載或者丟棄相應的Segment祟滴。Load/Drop規(guī)則均有三類,分別是Forever Load/Drop Rule歌溉,IntervalLoad/Drop Rule以及Period Load/Drop Rule垄懂。圖-3.9給出的是一條loadforever規(guī)則。
在生產(chǎn)環(huán)境中痛垛,我們建議大家草慧,不要直接在表中操作規(guī)則,以免出現(xiàn)各種未知問題匙头。

(2)規(guī)則審計表druid_audit漫谷。記錄Load/Drop Segment規(guī)則的審計信息

圖-3.10-Druid_audit schema
圖-3.11-Druid_audit 樣例數(shù)據(jù)

(3)Index Service配置表 druid_config

圖-3.12-Druid_config schema
圖-3.13-動態(tài)改變的worker工作配置

Overload作為Indexing Service的Master節(jié)點,可以動態(tài)改變Peon運行配置蹂析。舉例說明舔示,如圖3.13所示。我們在使用Druid時电抚,通過JSON over HTTP的方式向http://<overload ip>:<port>/druid/indexer/v1/worker變更Peon工作模式為"equalDistribution",表示MiddleManager在Remote模式下均勻分發(fā)任務給集群內(nèi)所有Peon節(jié)點惕稻,使集群在高負載的情況下,不會出現(xiàn)問題蝙叛。

(4)數(shù)據(jù)源表druid_dataSource

圖-3.14-druid_dataSource

如果使用druid_0.9.1.1新特性Kafka IndexingService俺祠,如圖3.14所示,那么該表會保存每個datasource對應的Kafka Topic信息借帘,一級改Topic下所有Partitions已被消費的offset蜘渣。

(5)Segment元信息表druid_segments

圖-3.15-druid_segmentschema

該表中有一個used字段,是用來標識此segment是否被使用肺然,如果某個datasource配置了規(guī)則宋梧,那么Druid只會采用邏輯刪除,即應把對應的segment的used置為0狰挡,而不是物理刪除。

(6)任務表druid_tasks释涛。其中加叁,圖3.18是druid_0.9.1.1版本新增的kafka indexing service tasks。
(5)Segment元信息表druid_segments

圖-3.18-druid_takssschema
圖-3.19-druid_takssschema

(7)任務鎖表druid_tasklocks

圖-3.20-druid_taksblockssschema

(8)等待隊列中的索引任務表druid_pendingSegments

圖-3.22-druid_pendingSegmentsschema

(9)索引任務日志信息表druid_tasklogs

圖-3.24-druid_tasklogsschema

(10)KafkaIndexingService對應supervise表 druid_supervisors

圖-3.26-druid_superviseschema

9.加載數(shù)據(jù)

對于加載外部數(shù)據(jù)唇撬,Druid支持兩種模式:實時流(real-time ingestion)和批量導入(batch ingestion)它匕。

  • Real-Time Ingestion 實時流過程可以采用Apache Storm、Apache Spark Streaming等流式處理框架產(chǎn)生數(shù)據(jù)窖认,再經(jīng)過pipeline工具豫柬,比如Apache Kafka告希、ActiveMQ、RabbitMQ等消息總線類組件烧给,使用Stream Pull 或者Stream Push模式生成Indexing Service Tasks燕偶,最終存儲在Druid中。

  • Batch Ingestion 批量導入模式可以采用結(jié)構(gòu)化信息作為數(shù)據(jù)源础嫡,比如JSON指么、Avro、Parquet格式的文本榴鼎,Druid內(nèi)部使用Map/Reduce批處理框架導入數(shù)據(jù)伯诬。

10.高可用性

Druid高可用性可以總結(jié)以下幾點:

  • Historical Node 如前所述,如果某個Historical Node離線時長超過一定閾值巫财,Coordinator Node會將該節(jié)點上已加載的Segments重新分配到其他在線的Historical Nodes上盗似,保證滿足加載規(guī)則的所有Segments不丟失且可查詢。

  • Coordinator Node 集群可配置多個Coordinator Node實例平项,工作模式為主從同步赫舒,采用選舉算法產(chǎn)生Leader,其他Follower作為備份葵礼。當Leader宕機時号阿,其他Follower能夠迅速failover。
    即使當所有Coordinator Node均失效鸳粉,整個集群對外依然有效扔涧,不過新Segments不會被加載,過期的Segments也不會被丟棄届谈,即整個集群內(nèi)的數(shù)據(jù)拓撲會一直保持不變枯夜,直到新的Coordinator Node服務上線。

  • Broker Node Broker Node與Coordinator Node在HA部署方面一致艰山。

  • Indexing Service Druid可以為同一個Segment配置多個Indexing Service Tasks副本保證數(shù)據(jù)完整性湖雹。

  • Real-Time Real-Time過程的數(shù)據(jù)完整性主要由接入的實時流語義(semantics)決定。我們在0.9.1.1版本前使用Tranquility-Kafka組件接入實時數(shù)據(jù)曙搬,由于存在時間窗口摔吏,即在時間窗口內(nèi)的數(shù)據(jù)會被提交給Firehose,時間窗口外的數(shù)據(jù)則會被丟棄纵装;如果Tranquility-Kafka臨時下線征讲,會導致Kafka中數(shù)據(jù)“過期”從而被丟棄,無法保證數(shù)據(jù)完整性橡娄,同時這種“copy service”的使用模式不僅占用大量CPU與內(nèi)存诗箍,又不滿足原子操作,所以在0.9.1.1版本后挽唉,我們使用Druid的新特性Kafka Indexing Service滤祖,Druid內(nèi)部使用Kafka高級Consumer API保證exactly-once semantics筷狼,盡最大可能保證數(shù)據(jù)完整性。不過我們在使用中匠童,依然發(fā)現(xiàn)有數(shù)據(jù)丟失問題埂材。

  • Metadata Storage 如果Metadata Storage失效,Coordinator則無法感知新Segment的生成俏让,整個集群中數(shù)據(jù)拓撲亦不會改變楞遏,不過不會影響老數(shù)據(jù)的訪問。

  • Zookeeper 如果Zookeeper失效首昔,整個集群的數(shù)據(jù)拓撲不會改變寡喝,由于Broker Node緩存的存在,所以在緩存中的數(shù)據(jù)依然可以被查詢勒奇。

參考:

http://druid.io/docs/latest/design/index.html

https://blog.csdn.net/paicmis/article/details/72625404

https://blog.csdn.net/njpjsoftdev/article/details/52955676

https://blog.csdn.net/njpjsoftdev/article/details/52955937

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末预鬓,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子赊颠,更是在濱河造成了極大的恐慌格二,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竣蹦,死亡現(xiàn)場離奇詭異顶猜,居然都是意外死亡,警方通過查閱死者的電腦和手機痘括,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門长窄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人纲菌,你說我怎么就攤上這事挠日。” “怎么了翰舌?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵嚣潜,是天一觀的道長。 經(jīng)常有香客問我椅贱,道長懂算,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任庇麦,我火速辦了婚禮犯犁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘女器。我一直安慰自己,他們只是感情好住诸,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布驾胆。 她就那樣靜靜地躺著涣澡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪丧诺。 梳的紋絲不亂的頭發(fā)上入桂,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機與錄音驳阎,去河邊找鬼抗愁。 笑死,一個胖子當著我的面吹牛呵晚,可吹牛的內(nèi)容都是我干的蜘腌。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼饵隙,長吁一口氣:“原來是場噩夢啊……” “哼撮珠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起金矛,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤芯急,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后驶俊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體娶耍,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年饼酿,在試婚紗的時候發(fā)現(xiàn)自己被綠了榕酒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡嗜湃,死狀恐怖奈应,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情购披,我是刑警寧澤杖挣,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站刚陡,受9級特大地震影響惩妇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜筐乳,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一歌殃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蝙云,春花似錦氓皱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽股淡。三九已至,卻和暖如春廷区,著一層夾襖步出監(jiān)牢的瞬間唯灵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工隙轻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留埠帕,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓玖绿,卻偏偏與公主長得像敛瓷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子镰矿,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Druid.io(以下簡稱Druid)是面向海量數(shù)據(jù)的琐驴、用于實時查詢與分析的OLAP存儲系統(tǒng)。Druid的四大關鍵...
    大詩兄_zl閱讀 6,449評論 0 9
  • #refer1:http://www.cnblogs.com/xd502djj/p/6408979.html#re...
    liuzx32閱讀 1,903評論 0 1
  • 概述 設計原則 快速查詢:部分數(shù)據(jù)的聚合 + 內(nèi)存化 + 索引 水平擴展能力:分布式數(shù)據(jù) + 并行化處理 實時分析...
    zfylin閱讀 2,650評論 0 1
  • 一個用于實時分析的開源數(shù)據(jù)存儲 摘要 Druid是專用于基于大數(shù)據(jù)集的實時探索分析的開源數(shù)據(jù)存儲秤标。該系統(tǒng)包括列式存...
    Sisyphus秋居拾遺閱讀 3,006評論 1 5
  • 1. 我買了個自認為很好看的吉他包苍姜,從武漢跋山涉水把吉他背回家牢酵。前兩天拿出來撥弄了幾根弦,發(fā)現(xiàn)調(diào)不對了衙猪,用調(diào)音器怎...
    一只萍萍牛閱讀 159評論 0 0