李榮輝1,楊志龍
(1.南瑞集團(tuán)有限公司,江蘇 南京211000;2.南京基石數(shù)據(jù)有限責(zé)任公司,江蘇 南京210093)
任務(wù)平臺(tái)通過admin來管理executor,任務(wù)經(jīng)客戶端觸發(fā),由admin進(jìn)行分發(fā),executor負(fù)責(zé)執(zhí)行。admin和executor通過jetty進(jìn)行通信,executor根據(jù)配置的admin信息,每隔30 s向admin中注冊(cè)一次,如果admin在3個(gè)周期中沒有收到executor的消息,則認(rèn)為executor不可用。由于任務(wù)需要經(jīng)過的admin分發(fā),可能出現(xiàn)單點(diǎn)故障。另外,executor分布在不同的機(jī)器上,如果executor出現(xiàn)故障,需要手動(dòng)去恢復(fù)。功能整體架構(gòu)如圖1所示。
圖1 功能整體架構(gòu)圖
Tomcat的manager可以管理項(xiàng)目,通過不同的URL來對(duì)項(xiàng)目進(jìn)行啟動(dòng)、停止、重啟等操作。Zookeeper,下面簡稱為zk,可以作為文件系統(tǒng)使用,其提供包括持久化目錄節(jié)點(diǎn)、持久化順序標(biāo)號(hào)目錄節(jié)點(diǎn)、臨時(shí)目錄節(jié)點(diǎn)以及臨時(shí)順序目錄節(jié)點(diǎn)等4種節(jié)點(diǎn)類型。在應(yīng)用啟動(dòng)時(shí),往zk中注冊(cè)一個(gè)臨時(shí)節(jié)點(diǎn),當(dāng)某個(gè)節(jié)點(diǎn)出現(xiàn)故障時(shí),與zk連接的session會(huì)中斷,通過監(jiān)控節(jié)點(diǎn)的變化可以獲取故障節(jié)點(diǎn)的信息,解析出節(jié)點(diǎn)的catalina地址以及webApp等唯一性信息,之后可以根據(jù)tomcat manager進(jìn)行相應(yīng)的恢復(fù)操作。
2.1.1 運(yùn)行環(huán)境
Tomcat版本為tomcat-7.0.77,zk的版本為Zookeeper-3.4.12,JDK版本為1.8。
2.1.2 架構(gòu)設(shè)計(jì)
架構(gòu)設(shè)計(jì)如圖2所示。
圖2 技術(shù)架構(gòu)圖
新增了冗余的admin節(jié)點(diǎn),另外使用zk進(jìn)行協(xié)調(diào)管理,在主admin發(fā)生故障時(shí),可以迅速切換到從admin節(jié)點(diǎn)中,避免單點(diǎn)故障。
2.1.3 配置說明
manager是tomcat自帶的用于項(xiàng)目部署和管理的應(yīng)用,需要在tomcat-user.xml中增加 manager-gui和 manager-script配置,角色說明如下[2]:
manager-gui:訪問html接口。
manager-script:提供了純文本訪問形式,可以訪問服務(wù)器狀態(tài)頁面。配置此項(xiàng)主要是可以在代碼中封裝相應(yīng)的操作接口,可以直接對(duì)應(yīng)用進(jìn)行操作。啟動(dòng)、停止和重啟的文本訪問格式如下所示:
啟動(dòng):catalina/manager/text/start?path=/;
停止:catalina/manager/text/stop?path=/;
重啟:catalina/manager/text/reload?path=/;
其中,catalina為 http://ip:port,port只tomcat的端口。
程序在啟動(dòng)時(shí),對(duì)應(yīng)的每一個(gè)節(jié)點(diǎn)都需要向zk中注冊(cè)一個(gè)臨時(shí)節(jié)點(diǎn),創(chuàng)建臨時(shí)節(jié)點(diǎn)時(shí)向節(jié)點(diǎn)中寫入如下信息:
ip:對(duì)應(yīng)節(jié)點(diǎn)的ip信息;
catalina:對(duì)應(yīng)節(jié)點(diǎn)的catalina信息;
webApp:項(xiàng)目的webApp信息。
用catalina+webApp作為唯一標(biāo)識(shí)identity。
2.1.4 實(shí)現(xiàn)以及應(yīng)用的啟動(dòng)和恢復(fù)過程
(1)在zk中創(chuàng)建永久節(jié)點(diǎn)/ha,本項(xiàng)目使用curator中間件,通過創(chuàng)建NodeCache來監(jiān)聽/ha子節(jié)點(diǎn)的情況。每一個(gè)應(yīng)用在啟動(dòng)時(shí),則在/ha節(jié)點(diǎn)中創(chuàng)建一個(gè)臨時(shí)子節(jié)點(diǎn),寫入ip、catalina和webApp信息。在所有節(jié)點(diǎn)都成功啟動(dòng)之后,從zk的/ha節(jié)點(diǎn)中就可以獲取到集群中所有節(jié)點(diǎn)的信息。
(2)創(chuàng)建一個(gè)/board永久節(jié)點(diǎn)來保存節(jié)點(diǎn)的恢復(fù)信息,即每次節(jié)點(diǎn)需要恢復(fù)時(shí),先往/board節(jié)點(diǎn)中寫入節(jié)點(diǎn)的ip、catalina和webApp信息,這條信息只有在節(jié)點(diǎn)正常啟動(dòng)時(shí)自身可以刪除。設(shè)置這個(gè)廣播信息是為了節(jié)點(diǎn)不被重復(fù)恢復(fù)。
2.1.4.1 啟動(dòng)過程
(1)admin在啟動(dòng)時(shí),發(fā)現(xiàn)沒有同名的identity,說明集群中沒有此節(jié)點(diǎn),先到/board節(jié)點(diǎn)中查看是否包含該identity信息。如果有,則刪除相應(yīng)的identity信息;沒有則直接創(chuàng)建/ha的臨時(shí)子節(jié)點(diǎn)/ha/a-ip,a是admin節(jié)點(diǎn)的標(biāo)識(shí)。
(2)admin在啟動(dòng)時(shí),如果發(fā)現(xiàn)有同名的identity信息,說明該節(jié)點(diǎn)已經(jīng)存在,屬于重復(fù)啟動(dòng),這時(shí)可以直接退出。
(3)executor在啟動(dòng)時(shí),直接創(chuàng)建/ha/ip臨時(shí)有序節(jié)點(diǎn)。同時(shí)查找/board看是否存在自身的唯一標(biāo)識(shí),如果有則刪除。
2.1.4.2 恢復(fù)過程
(1)如果是executor宕機(jī),集群中的所有節(jié)點(diǎn)通過競爭分布式鎖來進(jìn)行節(jié)點(diǎn)的恢復(fù)操作。節(jié)點(diǎn)獲取鎖后,先遍歷/ha節(jié)點(diǎn)中所有的子節(jié)點(diǎn),比較節(jié)點(diǎn)的identity與需要被恢復(fù)節(jié)點(diǎn)的identity時(shí)候相同。如果有相同信息,說明該節(jié)點(diǎn)已經(jīng)被恢復(fù),不再進(jìn)行恢復(fù)操作;如果沒有,說明該節(jié)點(diǎn)還未被恢復(fù),則查看/board中是否包含該節(jié)點(diǎn)信息。如果包含,說明已經(jīng)有其他節(jié)點(diǎn)在進(jìn)行恢復(fù)操作,不再進(jìn)行恢復(fù)操作;不包含,通過發(fā)送tomcat manager的管理命令來對(duì)節(jié)點(diǎn)進(jìn)行恢復(fù)操作。
(2)如果是admin宕機(jī),先遍歷/ha中所有的子節(jié)點(diǎn),看是否有冗余的admin節(jié)點(diǎn),如果有,則選取任一一個(gè),executor將注冊(cè)信息注冊(cè)到新的admin中,從而實(shí)現(xiàn)admin的切換。如果沒有冗余的admin。則集群中其他所有節(jié)點(diǎn)需要競爭分布式鎖,先將admin的identity寫入/board中,在通過發(fā)送tomcat manager的管理命令來對(duì)節(jié)點(diǎn)進(jìn)行恢復(fù)操作。
雖然這種機(jī)制需要依賴tomcat進(jìn)程的存活以及zk的可用性。但是通過tomcat manager以及Zookeeper實(shí)現(xiàn)應(yīng)用的自動(dòng)喚醒機(jī)制以及服務(wù)的高可用性,同時(shí),通過tomcat manager的純文本訪問形式,可以相應(yīng)減少人工維護(hù),提高系統(tǒng)的可用時(shí)間。