- 基于apache-druid-0.17
概述
- 如果希望運行分布式集群,Broker是查詢路由的流程。Broker可以讀取并理解zookeeper集群上的元數(shù)據(jù),這些元數(shù)據(jù)是關(guān)于哪些進程和路由查詢上存在哪些段,以便它們能夠訪問正確的進程。此過程還將來自所有單個過程的結(jié)果集合并在一起。當啟動的時候,Historical進程會在zookeeper中聲明自己和他們所服務(wù)的Segment。
運行命令
org.apache.druid.cli.Main server broker
轉(zhuǎn)發(fā)查詢
- 大多數(shù)的Druid查詢都包含一個Interval對象,它表示請求數(shù)據(jù)的時間段。Druid的Segments被切割成一定時間間隔的數(shù)據(jù),分布在一個集群中。假設(shè)一個簡單的datasource包含7個Segment,其中每個Segment包含一周中某一天的數(shù)據(jù)?,F(xiàn)在,向datasource中查詢超過一天的數(shù)據(jù),這會查詢多個Segment。這些Segment可能會分布在多個進程中,因此,查詢可能涉及多個進程。
- 為了確定將查詢轉(zhuǎn)發(fā)給某個具體的進程,Broker進程首先會總zookeeper的元數(shù)據(jù)中讀取相關(guān)信息。zookeeper中維護這關(guān)于Historical進程 、流式提取Peon進程、和他們服務(wù)的Segments信息。對于zookeeper中的每一個datasource,Broker會創(chuàng)建一個包含哪些Segment和服務(wù)哪些Segments的時間軸。當接收到特定datasource和時間間隔的查詢時,Broker會在時間軸上查詢時間間隔相關(guān)的datasource,并查詢數(shù)據(jù)的進程。然后Broker會將查詢轉(zhuǎn)發(fā)給所選的進程中。
緩存
- Broker進程會使用帶有LRU緩存失效策略的緩存機制。Broker緩存存儲Segment結(jié)果,緩存可以是每個Broker進程的本地緩存,也可以使用外部分布式緩存(如memcached)在多個進程之間共享。當Broker進程接收到一個查詢
query時,首先將查詢映射到一組Segment。這一組Segment的一部分已經(jīng)存在緩存中,并且可以直接從緩存中讀取結(jié)果。對于不在緩存中Segment,Broker進程將查詢轉(zhuǎn)發(fā)給Historical進程。一旦Historical進程將查詢結(jié)果返回,Broker進程會將結(jié)果緩存。Real-time segments 永遠不會被緩存,因此對real-time數(shù)據(jù)的請求總是被轉(zhuǎn)發(fā)給real-time進程。real-time數(shù)據(jù)是不斷變化的,所以緩存的結(jié)果是不可靠的。