Druid協(xié)調(diào)節(jié)點主要負(fù)責(zé)segment的管理和分配,它基于配置信息通知歷史節(jié)點加載和刪除segments。具體來說,協(xié)調(diào)節(jié)點的工作主要包括以下幾個方面:加載新segments信息,刪除過期segments信息,管理segment的復(fù)制操作和segment的負(fù)載均衡。
協(xié)調(diào)節(jié)點周期性的執(zhí)行操作,執(zhí)行間隔通過配置參數(shù)指定。與Broker和Historical節(jié)點類似,協(xié)調(diào)節(jié)點也會與ZK維持一個長連接,在執(zhí)行相應(yīng)的動作之前,協(xié)調(diào)節(jié)點會從ZK獲取集群當(dāng)前的狀態(tài)。同時協(xié)調(diào)節(jié)點也維持著與一個數(shù)據(jù)庫的鏈接,其中存儲著可用segments和規(guī)則的信息。可用segments信息存儲在segment表里,其中列除了所有在集群中加載的segments。規(guī)則信息存儲在規(guī)則表中,它指明了segments應(yīng)該被怎樣處理。
在一個新segment被分配至歷史節(jié)點前,所有可用的歷史節(jié)點會根據(jù)已存儲數(shù)據(jù)的大小進(jìn)行排序,存儲數(shù)據(jù)最少的節(jié)點有最高的優(yōu)先級被分配到新segment,這種機(jī)制是為了節(jié)點之間存儲的均衡。協(xié)調(diào)節(jié)點不會直接同歷史節(jié)點進(jìn)行通信,分配segment的過程是通過在ZK中相應(yīng)的歷史節(jié)點路徑下創(chuàng)建臨時segment信息節(jié)點完成的。一旦該動作被歷史節(jié)點獲知,該segment就會被歷史節(jié)點加載,并使其可查詢。
Running
io.druid.cli.Main server coordinator
Rules
Segments基于一組機(jī)制能夠?qū)崿F(xiàn)從集群中動態(tài)的加載和刪除
Cleaning Up Segments
每一次執(zhí)行時,協(xié)調(diào)節(jié)點將會對數(shù)據(jù)庫中存儲的可用segment信息和集群中當(dāng)前可用的segment信息做比較。集群中存在但數(shù)據(jù)庫中不存在的segments將會被標(biāo)記并加入待刪除隊列。對于那些版本已過期并且數(shù)據(jù)已被新的segments覆蓋的segments也會被刪除。注意,如果數(shù)據(jù)庫中所有的segments都被刪除了(或者被標(biāo)記為不可用),協(xié)調(diào)節(jié)點這時不會從集群中刪除segments。
Segment Availability
如果一個歷史節(jié)點由于重啟或者其他原因處于不可用狀態(tài),協(xié)調(diào)節(jié)點會通知一個歷史節(jié)點丟失,并將該歷史節(jié)點服務(wù)的segments全部置為dropped。在一段時間后,這些segments會被重新分配給集群中的其它節(jié)點。但是,并不是每個被刪除的segments信息馬上就會被集群清理,會有一個數(shù)據(jù)結(jié)構(gòu)來存儲刪除的segments和它們對應(yīng)的生命周期。在這個周期時間內(nèi),協(xié)調(diào)節(jié)點不會重新分配這個刪除的segments。因此,當(dāng)一個歷史節(jié)點在很短的時間內(nèi)轉(zhuǎn)變?yōu)榭捎脿顟B(tài)時,它就能馬上啟動并使本地cache中的segments可用,同時避免了segments在集群節(jié)點中的從新分配過程。
Balancing Segment Load
為了保證segments在集群中盡可能地均勻分布,協(xié)調(diào)節(jié)點在每次運行時會計算每個歷史節(jié)點所服務(wù)的所有segments的數(shù)據(jù)量情況。在集群每一層的歷史節(jié)點中,協(xié)調(diào)節(jié)點會選出存儲利用率最高和最低的歷史節(jié)點,如果兩個節(jié)點之間的利用率差值超過了一定的閾值,協(xié)調(diào)節(jié)點就會將一部分segments從最高利用率節(jié)點遷移到最低利用率節(jié)點,能夠遷移的segments數(shù)量上限通過一個參數(shù)來限制。對于需要遷移Segments的選擇是隨機(jī)的,并且只有遷移動作真正能使利用率降低的情況下segments才會被遷移。
HTTP Endpoints
協(xié)調(diào)節(jié)點提供的接口(協(xié)調(diào)節(jié)點提供的接口很多,這里列舉幾個,詳情請參考官網(wǎng) 【HTTP Endpoints】小節(jié)):
GET
- /status
返回Druid的版本信息、加載擴(kuò)展、使用內(nèi)存、全部內(nèi)存和該節(jié)點其他有用的信息
Coordinator information
- /druid/coordinator/v1/leader
返回當(dāng)前集群主協(xié)調(diào)節(jié)點 - /druid/coordinator/v1/loadstatus
返回已加載在集群中的segments和所有應(yīng)加載segments的比率 - /druid/coordinator/v1/loadstatus?simple
返回未加載的segments和所有應(yīng)加載segments的比率,不包括segments副本 - /druid/coordinator/v1/loadstatus?full
返回未加載的segments和所有應(yīng)加載segments的比率,包括segments副本 - /druid/coordinator/v1/loadqueue
返回每個歷史節(jié)點加載和刪除segments的ID - /druid/coordinator/v1/loadqueue?simple
返回每個歷史節(jié)點加載和刪除segments的數(shù)目和及其加載和刪除的數(shù)據(jù)總量。 - /druid/coordinator/v1/loadqueue?full
返回每個歷史節(jié)點加載和刪除segments的json序列化信息。
Metadata store information
- /druid/coordinator/v1/metadata/datasources
返回集群中所有可用的datasources列表 - /druid/coordinator/v1/metadata/datasources?includeDisabled
返回集群中所有可用的和不可用的datasources列表 - /druid/coordinator/v1/metadata/datasources?full
返回集群中所有可用的datasources列表及其存儲的meta信息。 - /druid/coordinator/v1/metadata/datasources/{dataSourceName}
返回給定的datasource及其存儲的meta信息。 - /druid/coordinator/v1/metadata/datasources/{dataSourceName}/segments
返回一個給定datasource中的所有segments列表 - /druid/coordinator/v1/metadata/datasources/{dataSourceName}/segments?full
返回一個給定datasource中的所有segments列表及其meta信息
Datasources information
- /druid/coordinator/v1/datasources
返回集群中查詢到的datasources列表 - /druid/coordinator/v1/datasources?simple
返回一個包括datasource名稱及其配置信息的json對象,對象中包含segments數(shù)量,segments數(shù)據(jù)總大小、最小時間和最大時間
Rules
以json對象的形式返回集群中所有datasource包括默認(rèn)datasource包含的rules信息。
Intervals
- /druid/coordinator/v1/intervals
返回所有datasource的intervals信息,包括總大小和數(shù)量
DELETE
- /druid/coordinator/v1/datasources/{dataSourceName}
disable 一個給定的datasource