歷史節(jié)點(diǎn)負(fù)責(zé)加載歷史segment,使segment數(shù)據(jù)能夠被查詢拨脉。
Running
io.druid.cli.Main server historical
Loading and Serving Segments
每一個(gè)歷史節(jié)點(diǎn)維護(hù)著一個(gè)與ZK的長(zhǎng)連接,監(jiān)控著新segment加入的消息宣增。歷史節(jié)點(diǎn)彼此之間以及與協(xié)調(diào)節(jié)點(diǎn)(coordinator nodes)之間不會(huì)直接通信玫膀,所有的通信過(guò)程只依賴于ZK。
協(xié)調(diào)節(jié)點(diǎn)負(fù)責(zé)分配新的segment給歷史節(jié)點(diǎn)爹脾,分配的過(guò)程是通過(guò)在ZK中對(duì)應(yīng)某個(gè)歷史節(jié)點(diǎn)的加載隊(duì)列路徑下創(chuàng)建臨時(shí)znode完成的帖旨。
當(dāng)某個(gè)歷史節(jié)點(diǎn)在ZK中屬于自身的加載隊(duì)列路徑下發(fā)現(xiàn)一個(gè)新的segment分配信息時(shí)箕昭,它首先會(huì)去本地cache中檢查是否有該segment的信息。如果確認(rèn)本地cache中不存在該segment的信息解阅,即從ZK中下載該segment的元數(shù)據(jù)信息到本地落竹。segment的元數(shù)據(jù)信息中包含該segment在底層存儲(chǔ)的路徑以及解壓縮和處理該segment的方法。一旦某個(gè)歷史節(jié)點(diǎn)完成對(duì)一個(gè)新segment的處理货抄,歷史節(jié)點(diǎn)會(huì)通知ZK將該segment以“已服務(wù)”的狀態(tài)標(biāo)記在該歷史節(jié)點(diǎn)對(duì)應(yīng)的已服務(wù)segment列表中述召。至此,我們就可以從這個(gè)新的segment中查詢到數(shù)據(jù)了蟹地。
Loading and Serving Segments From Cache
回想一下上一節(jié)提到的當(dāng)歷史節(jié)點(diǎn)發(fā)現(xiàn)一個(gè)需要加載的新segment信息時(shí)积暖,首先會(huì)去自身本地cache中檢查該segment是否存在。如果該segment已在本地cache中存在時(shí)怪与,歷史節(jié)點(diǎn)會(huì)直接讀取該segment的二進(jìn)制文件并加載夺刑。
在重新啟動(dòng)時(shí),歷史節(jié)點(diǎn)會(huì)查詢本地cache目錄分别,加載它查詢到的segment遍愿。這個(gè)機(jī)制能夠保證歷史節(jié)點(diǎn)上線時(shí)可以盡早地服務(wù)于查詢。
歷史節(jié)點(diǎn)能夠通過(guò)配置對(duì)它服務(wù)的每個(gè)查詢請(qǐng)求記錄日志和上報(bào)metrics信息耘斩。
HTTP Endpoints
歷史節(jié)點(diǎn)提供的接口:
GET
- /status
返回Druid的版本信息沼填、加載擴(kuò)展、使用內(nèi)存煌往、全部?jī)?nèi)存和該節(jié)點(diǎn)其他有用的信息 - /druid/historical/v1/loadstatus
返回歷史節(jié)點(diǎn)是否已經(jīng)加載本地cache中全部segment的標(biāo)記倾哺。該接口可以用來(lái)確認(rèn)在歷史節(jié)點(diǎn)重啟后是否能夠提供查詢服務(wù)。