020601-Crane 架構(gòu)設(shè)計(jì)

1 Crane 架構(gòu)圖

Crane在部署上根據(jù)BG進(jìn)行隔離,共拆成7個(gè)BG,包含部署在上海側(cè)的默認(rèn)集群和點(diǎn)綜集群、部署在北京側(cè)的外賣集群、酒旅集群、金融集群、貓眼集群和餐飲集群。

通過appKey決定任務(wù)所歸屬調(diào)度集群。

每個(gè)模塊都是可水平擴(kuò)展,采用3機(jī)房部署實(shí)現(xiàn)高可用。

2 Crane 最小部署圖

最小部署圖是Crane從BG粒度水平擴(kuò)容的最小單位,新增一個(gè)BG集群,只需要部署對(duì)應(yīng)BG所需的各內(nèi)部模塊即可,對(duì)其他BG無影響,實(shí)現(xiàn)BG級(jí)別的隔離。

3 Crane 內(nèi)部模塊

3.1 Portal 模塊

Portal提供統(tǒng)一的UI操作界面以及HTTP服務(wù)接口,可以任意水平擴(kuò)展,北上2地4機(jī)房部署。

對(duì)于用戶針對(duì)任務(wù)的請(qǐng)求,Portal端通過HTTP與調(diào)度器進(jìn)行交互,此時(shí)Portal端會(huì)根據(jù)appKey確定請(qǐng)求應(yīng)該分發(fā)到哪個(gè)BG集群,然后根據(jù)任務(wù)名定位BG內(nèi)部所屬調(diào)度器IP。

3.2 Scheduler 模塊

任務(wù)調(diào)度模塊,負(fù)責(zé)對(duì)任務(wù)進(jìn)行周期性調(diào)度。

3.2.1 調(diào)度模型

采用原生Java提供的延遲隊(duì)列,對(duì)于每個(gè)任務(wù),預(yù)先生成下一次調(diào)度實(shí)例放入延遲隊(duì)列,當(dāng)調(diào)度實(shí)例被消費(fèi)后,隨即生成下一次實(shí)例重新放入隊(duì)列,如此循環(huán),驅(qū)動(dòng)任務(wù)周期性調(diào)度。

3.2.2 基于租約的分布式調(diào)度器

對(duì)于每個(gè)BG內(nèi)部,調(diào)度器單側(cè)3機(jī)房部署,可以任意水平擴(kuò)展。

調(diào)度器下線時(shí),主動(dòng)從Zookeeper中刪除注冊節(jié)點(diǎn),上線時(shí),主動(dòng)注冊節(jié)點(diǎn)到Zookeeper中,Manager通過監(jiān)聽Zookeeper,實(shí)時(shí)感知調(diào)度器上下線。

Manager通過引入虛擬Slots層,在調(diào)度器上下線時(shí),重新為每個(gè)調(diào)度器分配Slots。調(diào)度器通過分配到的Slots,通過對(duì)任務(wù)名取hash,判斷某個(gè)任務(wù)是否由自己調(diào)度,從而實(shí)現(xiàn)了一個(gè)任務(wù)只由一個(gè)調(diào)度負(fù)責(zé)調(diào)度。

當(dāng)調(diào)度器出現(xiàn)宕機(jī),無法主動(dòng)從Zookeeper中刪除自身注冊的節(jié)點(diǎn)時(shí),就需要Manager進(jìn)行被動(dòng)刪除。Manager通過對(duì)調(diào)度器進(jìn)行心跳檢測,從而摘除宕機(jī)節(jié)點(diǎn),進(jìn)而進(jìn)行任務(wù)重新分配。

心跳檢測解決了調(diào)度器宕機(jī)時(shí)摘除節(jié)點(diǎn)的目的,但是如果調(diào)度器出現(xiàn)網(wǎng)絡(luò)不通,此時(shí)會(huì)出現(xiàn)Manager認(rèn)為調(diào)度器宕機(jī),但調(diào)度器任務(wù)自己正常的不一致判斷,從而導(dǎo)致任務(wù)被重復(fù)調(diào)度;解決這一問題的方法就是調(diào)度器基于租約進(jìn)行調(diào)度,Manager對(duì)調(diào)度器發(fā)放租約,如果調(diào)度器沒有響應(yīng),就無法續(xù)租,當(dāng)租約到期時(shí),Manager認(rèn)為調(diào)度器宕機(jī),調(diào)度器由于自身沒有租約也不會(huì)再進(jìn)行調(diào)度,從而實(shí)現(xiàn)狀態(tài)判斷的一致性。

3.3 Zookeeper 模塊

Crane 注冊中心,單側(cè)5節(jié)點(diǎn)3機(jī)房部署。

客戶端啟動(dòng)時(shí)會(huì)注冊自身信息,包含該節(jié)點(diǎn)下注冊的任務(wù)、appKey已經(jīng)泳道和Set信息。

調(diào)度器啟動(dòng)時(shí)會(huì)注冊自身節(jié)點(diǎn),供Manager管理,從而進(jìn)行任務(wù)分配;調(diào)度器從注冊中心讀取客戶端信息,從而進(jìn)行調(diào)度。

Monitor啟動(dòng)時(shí)會(huì)注冊自身節(jié)點(diǎn),從而各Monitor可以平均分配客戶端,從而對(duì)客戶端進(jìn)行心跳檢測。

3.4 Manager 模塊

Manager負(fù)責(zé)管理調(diào)度器,從而實(shí)現(xiàn)任務(wù)的動(dòng)態(tài)遷移,單側(cè)3機(jī)房部署。

Manager 通過Zookeeper進(jìn)行選主,主節(jié)點(diǎn)對(duì)調(diào)度進(jìn)行租約發(fā)放。

當(dāng)主節(jié)點(diǎn)宕機(jī)時(shí),會(huì)在6s后進(jìn)行切換,選舉出新的主節(jié)點(diǎn),繼續(xù)對(duì)調(diào)度器進(jìn)行租約發(fā)放。

每個(gè)Manager會(huì)定時(shí)去檢測Zookeeper上是否存在主節(jié)點(diǎn),在Zookeeper不可用時(shí),無法通過Zookeeper選出主節(jié)點(diǎn),此時(shí)所有Manager都會(huì)對(duì)調(diào)度器進(jìn)行心跳檢測,避免由于調(diào)度器租約到期,自動(dòng)中止調(diào)度。

3.5 Monitor 模塊

Monitor負(fù)責(zé)管理客戶端,單側(cè)3機(jī)房部署。

Monitor啟動(dòng)后會(huì)注冊自己節(jié)點(diǎn),并且定時(shí)更新時(shí)間戳。所有存活的Monitor都會(huì)對(duì)客戶端進(jìn)行心跳檢測,N個(gè)Monitor理論上每個(gè)Monitor會(huì)負(fù)責(zé)的1/N的客戶端。當(dāng)某個(gè)Monitor宕機(jī)時(shí),其他Monitor檢測到時(shí)間戳1分鐘未更新,會(huì)自動(dòng)刪除注冊節(jié)點(diǎn),從而將其所負(fù)責(zé)的客戶端接管過來。

Monitor會(huì)每隔10s對(duì)客戶端進(jìn)行心跳檢測,連續(xù)6次不通后,會(huì)認(rèn)為客戶端宕機(jī),從而將節(jié)點(diǎn)從Zookeeper中摘除。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容