今天小編給大家分享的是Apache中Druid多進(jìn)程架構(gòu)的詳細(xì)介紹,相信大部分人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,話不多說,一起往下看吧。
成都創(chuàng)新互聯(lián)是一家專注于做網(wǎng)站、成都網(wǎng)站制作與策劃設(shè)計(jì),扎賚特網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:扎賚特等地區(qū)。扎賚特做網(wǎng)站價(jià)格咨詢:13518219792
Druid 是多進(jìn)程架構(gòu),每種進(jìn)程類型都可以獨(dú)立配置,獨(dú)立擴(kuò)展。這樣可以為集群提供最大的靈活度。這種設(shè)計(jì)還提供了強(qiáng)失效容忍:一個(gè)失效的組件不會(huì)立即影響另外的組件。
下面我們來深入了解 Druid 有哪些進(jìn)程類型,每種進(jìn)程又在整個(gè)集群中扮演什么角色。
Druid 有多種進(jìn)程類型,如下:
你可以以任何方式來部署上面的進(jìn)程。但是為了易于運(yùn)維,官方建議以下面三種服務(wù)類型來組織進(jìn)程:Master、Query 和 Data。
除了內(nèi)置的進(jìn)程類型,Druid 還有三個(gè)外部依賴項(xiàng)。
共享文件存儲,只要配置成允許 Druid 訪問即可。在集群部署中,通常使用分布式存儲(如 S3 或 HDFS)或掛載網(wǎng)絡(luò)文件系統(tǒng)。在單機(jī)部署中,通常使用本地磁盤。Druid 使用 Deep Storage 存儲寫入集群的數(shù)據(jù)。
Druid 僅將 Deep Storage 用作數(shù)據(jù)的備份,并作為 Druid進(jìn)程間在后臺的數(shù)據(jù)傳輸方式。要響應(yīng)查詢,Historical 進(jìn)程并不從 Deep Storage 上讀取數(shù)據(jù),在任何查詢之前,先從本地磁盤查詢已經(jīng)存在的數(shù)據(jù)。這意味著,Druid 在查詢時(shí)并不需要訪問 Deep Storage,這樣就可以得到最優(yōu)的查詢延遲。這也意味著,在 Deep Storage 和 Historical 進(jìn)程間你必須有足夠的磁盤空間來存儲你計(jì)劃加載的數(shù)據(jù)。
Deep Storage 是 Druid 彈性、容錯(cuò)設(shè)計(jì)的重要組成部分。如果 Druid 單機(jī)進(jìn)程本地?cái)?shù)據(jù)丟失,可以從 Deep Storage 恢復(fù)數(shù)據(jù)。
元數(shù)據(jù)存儲,存儲各種共享的系統(tǒng)元數(shù)據(jù),如 segment 可用性信息和 task 信息。在集群部署中,通常使用傳統(tǒng)的 RDBMS,如 PostgreSQL 或 MySQL。在單機(jī)部署中,通常使用本地存儲,如 Apache Derby 數(shù)據(jù)庫。
用來進(jìn)行內(nèi)部服務(wù)發(fā)現(xiàn),協(xié)調(diào),和主選舉。
下圖可以看出使用官方建議的 Master/Query/Data 服務(wù)部署方式,查詢和寫入數(shù)據(jù)是如何進(jìn)行的:
Druid 數(shù)據(jù)存儲在"datasources"中,它就像 RDBMS 中的 table。每一個(gè) datasources 通過時(shí)間分區(qū),或通過其他屬性進(jìn)行分區(qū)。每一個(gè)時(shí)間范圍稱之為"chunk"(比如,一天一個(gè),如果你的 datasource 使用 day 分區(qū))。在 chunk 中,數(shù)據(jù)被分區(qū)進(jìn)一個(gè)或多個(gè)"segments"中。每一個(gè) segment 是一個(gè)單獨(dú)的文件,通常包含數(shù)百萬行數(shù)據(jù)。一旦 segment 被存儲進(jìn) chunks,其組織方式將如以下時(shí)間線所示:
一個(gè) datasource 也許只有一個(gè),也可能有數(shù)十萬甚至上百萬個(gè) segment。每個(gè) segment 生命周期開始于 MiddleManager 創(chuàng)建時(shí),剛被創(chuàng)建時(shí),segment 是可變和未提交的。segment 構(gòu)建過程包含以下幾步,旨在生成結(jié)構(gòu)緊湊并支持快速查詢的數(shù)據(jù)文件。
segment 定時(shí)提交和發(fā)布。此時(shí),數(shù)據(jù)被寫入 Deep Storage,并且再不可變,并從 MiddleManagers 進(jìn)程遷移至 Historical 進(jìn)程中。一個(gè)關(guān)于 segment 的 entry 將寫入 metadata storage。這個(gè) entry 是關(guān)于 segment 的元數(shù)據(jù)的自描述信息,包含如 segment 的數(shù)據(jù)模式,大小,Deep Storage 地址等信息。這些信息讓 Coordinator 知道集群中哪些數(shù)據(jù)是可用的。
indexing 是每個(gè) segment 創(chuàng)建的機(jī)制。handoff 是數(shù)據(jù)被發(fā)布并開始可以被 Historical 進(jìn)程處理的機(jī)制。這機(jī)制在 indexing 側(cè)的工作順序如下:
這機(jī)制在 Coordinator/Historical 側(cè)的工作如下:
數(shù)據(jù)寫入(indexing)和移交(handoff):
Segment 標(biāo)識由下面四部分組成:
segmentGranularity
指定參數(shù))。例如,這是 datasource 為clarity-cloud0
,時(shí)間段為2018-05-21T16:00:00.000Z/2018-05-21T17:00:00.000Z
,版本號為2018-05-21T15:56:09.909Z
,分區(qū)號為 1 的標(biāo)識符:
clarity-cloud0_2018-05-21T16:00:00.000Z_2018-05-21T17:00:00.000Z_2018-05-21T15:56:09.909Z_1
分區(qū)號為 0(塊中的第一個(gè)分區(qū))的 segment 省略了分區(qū)號,如以下示例所示,它是與前一個(gè)分區(qū)在同一時(shí)間塊中的 segment,但分區(qū)號為 0 而不是 1:
clarity-cloud0_2018-05-21T16:00:00.000Z_2018-05-21T17:00:00.000Z_2018-05-21T15:56:09.909Z
你可能想知道上一節(jié)中描述的“版本號”是什么。
Druid 支持批處理模式覆寫。在 Driud 中,如果你要做的只是追加數(shù)據(jù),那么每個(gè)時(shí)間塊只有一個(gè)版本。但是,當(dāng)你覆蓋數(shù)據(jù)時(shí),在幕后發(fā)生的事情是使用相同的數(shù)據(jù)源,相同的時(shí)間間隔,但版本號更高的方式創(chuàng)建了一組新的 segment。這向 Druid 系統(tǒng)的其余部分發(fā)出信號,表明應(yīng)從群集中刪除較舊的版本,而應(yīng)使用新版本替換它。
對于用戶而言,切換似乎是瞬間發(fā)生的,因?yàn)?Druid 通過先加載新數(shù)據(jù)(但不允許對其進(jìn)行查詢)來處理此問題,然后在所有新數(shù)據(jù)加載完畢后,立即將新查詢切換到新 segment。然后,它在幾分鐘后刪除舊 segment。
每個(gè) segment 的生命周期都涉及以下三個(gè)主要領(lǐng)域:
元數(shù)據(jù)存儲區(qū)
中。將 segmnet 的記錄插入元數(shù)據(jù)存儲的操作稱為發(fā)布。然后將元數(shù)據(jù)中的use
布爾值設(shè)置成可用
。由實(shí)時(shí)任務(wù)創(chuàng)建的 segment 將在發(fā)布之前可用,因?yàn)樗鼈儍H在 segment 完成時(shí)才發(fā)布,并且不接受任何其他數(shù)據(jù)。你可以使用 Druid SQL sys.segments
表檢查當(dāng)前 segment 的狀態(tài) 。它包括以下標(biāo)志:
is_published
:如果 segment 元數(shù)據(jù)已發(fā)布到存儲的元數(shù)據(jù)中,used
則為 true,此值也為 true。is_available
:如果該 segment 當(dāng)前可用于實(shí)時(shí)任務(wù)或Historical查詢,則為 True。is_realtime
:如果 segment 在實(shí)時(shí)任務(wù)上可用,則為 true 。對于使用實(shí)時(shí)寫入的數(shù)據(jù)源,通常會(huì)先設(shè)置成true
,然后隨著 segment 的發(fā)布和移交而變成false
。is_overshadowed
:如果該 segment 已發(fā)布(used
設(shè)置為 true)并且被其他一些已發(fā)布的 segment 完全覆蓋,則為 true。通常,這是一個(gè)過渡狀態(tài),處于此狀態(tài)的 segment 很快就會(huì)將其used
標(biāo)志自動(dòng)設(shè)置為 false。查詢首先進(jìn)入Broker
進(jìn)程,Broker
將得出哪些 segment 具有與該查詢有關(guān)的數(shù)據(jù)(segment 列表始終按時(shí)間規(guī)劃,也可以根據(jù)其他屬性來規(guī)劃,這取決于數(shù)據(jù)源的分區(qū)方式),然后,Broker
將確定哪些 Historical
和 MiddleManager
正在為這些 segment 提供服務(wù),并將重寫的子查詢發(fā)送給每個(gè)進(jìn)程。Historical
/ MiddleManager
進(jìn)程將接受查詢,對其進(jìn)行處理并返回結(jié)果。Broker
接收結(jié)果并將它們合并在一起以得到最終答案,并將其返回給客戶端。
Broker
會(huì)分析每個(gè)請求,優(yōu)化查詢,盡可能的減少每個(gè)查詢必須掃描的數(shù)據(jù)量。相比于 Broker 過濾器做的優(yōu)化,每個(gè) segment 內(nèi)的索引結(jié)構(gòu)允許 Druid 在查看任何數(shù)據(jù)行之前先找出哪些行(如果有)與過濾器集匹配。一旦 Druid 知道哪些行與特定查詢匹配,它就只會(huì)訪問該查詢所需的特定列。在這些列中,Druid 可以在行與行之間跳過,從而避免讀取與查詢過濾器不匹配的數(shù)據(jù)。
因此,Druid 使用三種不同的技術(shù)來優(yōu)化查詢性能:
檢索每個(gè)查詢需訪問的 segment。
在每個(gè) segment 中,使用索引來標(biāo)識查詢的行。
關(guān)于Apache中Druid多進(jìn)程架構(gòu)就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果喜歡這篇文章,不如把它分享出去讓更多的人看到。
文章題目:Apache中Druid多進(jìn)程架構(gòu)介紹
標(biāo)題來源:http://jinyejixie.com/article32/jjhssc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、品牌網(wǎng)站制作、電子商務(wù)、網(wǎng)站設(shè)計(jì)、云服務(wù)器、網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)