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