焦點精選!初識Druid分布式存儲系統

2022-12-08 18:19:39 來源:51CTO博客


(資料圖)

Druid是一個用于大數據實時查詢與分析的分布式列式數據存儲系統。為了應對海量數據的實時查詢和多維分析,Druid應運而生。 Druid誕生于MetaMarkets公司,而互聯網廣告分析正是MetaMarkets最重要的業務之一,基于同樣的業務需求背景,微博廣告也開始嘗試將 Druid 作為監控平臺后端數據引擎的技術方案之一。

一、Druid特性

Druid的特性如下:

支持部分嵌套數據結構的列式存儲。 進行剪枝的分布式層級查詢。 通過索引快速過濾。 數據的實時攝入和查詢。 容錯分布式架構確保數據不丟失。 水平擴展。

二、Druid架構

1、Druid節點組成

Druid 是一個分布式系統,由多個角色的節點組合而成,每個節點都只關心自己的工作。Druid架構示意圖如下。

實時節點:實時節點提供實時的索引服務,通過這些節點索引的數據可以立即用于查詢。實時節點將在一定時間內收集到的數據生成一個 Segment 數據文件,并將這個Segment數據文件發送到歷史節點中。通過ZooKeeper監控傳輸和元數據庫來存儲被發送的 Segment 數據文件的元數據。發送完成后,實時節點就會丟棄被發送的 Segment數據文件。歷史節點:存儲和查詢歷史數據。歷史節點不與其他節點直接通信,而是通過與ZooKeeper保持一個長連接,實時觀察指定路徑下的新Segment數據文件信息。當歷史節點注意到 ZooKeeper 指定隊列路徑下有一個條目時,首先它會檢查本地緩存中是否存在該Segment數據文件的元信息,如果本地緩存中不存在新Segment數據文件的元信息,那么歷史節點將從ZooKeeper中讀取新Segment數據文件的元信息到本地,并根據下載到本地的Segment數據文件的元信息去Deep Storage中拉取Segment數據文件。最后,歷史節點會通過ZooKeeper向集群宣布,它將提供該Segment數據文件的查詢服務。協調節點:主要負責Segment數據文件的加載、刪除,管理Segment數據文件副本和平衡各歷史節點的Segment數據文件。協調節點根據配置文件中指定的參數定期運行,每次運行,它都會監測集群狀態,并采取相關的動作。協調節點通過 ZooKeeper 來獲取集群信息,同時還會保持與存儲可用段表和規則表的數據庫的連接。協調節點不會直接與歷史節點通信,它會根據規則、容量等信息指定歷史節點,并在 ZooKeeper 中該歷史節點的隊列路徑下生成關于 Segment 數據文件的臨時信息。歷史節點看到這些臨時信息,就會去拉取Segment數據文件。代理節點:接收客戶端的查詢請求,并路由請求到實時節點或歷史節點。代理節點通過ZooKeeper知道每個Segment數據文件存在于哪個節點上。代理節點還用于聚合每個節點返回的結果,再將聚合后的結果集返回給客戶端。代理節點還可以通過配置緩存來存儲歷史節點查詢的結果,提高了相同查詢的效率。索引服務節點:索引服務是一個高可用的分布式服務,運行與索引相關的任務。索引服務是一個主/從架構。索引服務由三個組件組成,即運行一個任務的peon組件、管理peon的Middle Manager組件和管理任務分配給Middle Manager的Overlord組件。其中Middle Manager和peon組件必須在同一個節點上。
2、外部依賴
ZooKeeper集群:用于集群服務的發現和當前數據拓撲的維護。 Metadata Storage:用于存儲數據文件的元數據,但是不存儲實際的數據。可以使用MySQL或者PostgreSQL作為Metadata Storage。Metadata Storage一般會存儲以下幾個表。 Segments Table:Segment數據文件的元信息表。 Rule Table:Segment數據文件的存儲規則表。 Config Table:配置表,用于存儲運行時的配置對象。 Task-related Table:索引服務創建并使用到的表。 Audit Table:審計表,用于存儲配置變化的審計歷史記錄。 Deep Storage:用于存儲Segment數據文件。
3、Segment傳輸過程

Segment傳輸過程如下圖。

實時數據寫入后的Segment傳輸流程如下:

實時節點將在一定時間內收集到的數據生成一個 Segment 數據文件,并發送到 Deep Storage,同時將該Segment數據文件的元信息發送到元數據庫中。 協調節點從元數據庫中獲取新的Segment數據文件的元信息,根據規則分配該Segment數據文件存儲的歷史節點,并將元數據寫入在ZooKeeper上創建的一個臨時節點中。 歷史節點從ZooKeeper的臨時節點中讀取元數據,去Deep Storage中拉取指定的Segment數據文件,并刪除在ZooKeeper上創建的臨時節點。
4、DataSource

在Druid中,數據是存儲在每個DataSource中的,而一個DataSource就相當于MySQL的一個總表。每個DataSource都會包含下面三部分信息。

Timestamp:存儲指標的UTC時間列,可以精確到毫秒。 Dimension:存儲指標的維度列。 Metric:指標列,用來聚合計算。
5、Segment

DataSource 描述的是數據的邏輯結構,而 Segment 則體現了數據的物理存儲方式。Druid通過segmentGranularity參數來設置Segment劃分的時間范圍,而Druid查詢也正是通過指定的時間范圍來確認需要查詢的Segment數據文件的,減小了查詢的數據量,提高了查詢的效率。

標簽: 數據文件 元數據庫

上一篇:python django-user模型(登陸,注冊,密碼修改,注銷)
下一篇:環球速訊:【深入分析java線程池的實現原理】