李榮輝1,楊志龍
(1.南瑞集團有限公司,江蘇 南京211000;2.南京基石數據有限責任公司,江蘇 南京210093)
任務平臺通過admin來管理executor,任務經客戶端觸發,由admin進行分發,executor負責執行。admin和executor通過jetty進行通信,executor根據配置的admin信息,每隔30 s向admin中注冊一次,如果admin在3個周期中沒有收到executor的消息,則認為executor不可用。由于任務需要經過的admin分發,可能出現單點故障。另外,executor分布在不同的機器上,如果executor出現故障,需要手動去恢復。功能整體架構如圖1所示。

圖1 功能整體架構圖
Tomcat的manager可以管理項目,通過不同的URL來對項目進行啟動、停止、重啟等操作。Zookeeper,下面簡稱為zk,可以作為文件系統使用,其提供包括持久化目錄節點、持久化順序標號目錄節點、臨時目錄節點以及臨時順序目錄節點等4種節點類型。在應用啟動時,往zk中注冊一個臨時節點,當某個節點出現故障時,與zk連接的session會中斷,通過監控節點的變化可以獲取故障節點的信息,解析出節點的catalina地址以及webApp等唯一性信息,之后可以根據tomcat manager進行相應的恢復操作。
2.1.1 運行環境
Tomcat版本為tomcat-7.0.77,zk的版本為Zookeeper-3.4.12,JDK版本為1.8。
2.1.2 架構設計
架構設計如圖2所示。

圖2 技術架構圖
新增了冗余的admin節點,另外使用zk進行協調管理,在主admin發生故障時,可以迅速切換到從admin節點中,避免單點故障。
2.1.3 配置說明
manager是tomcat自帶的用于項目部署和管理的應用,需要在tomcat-user.xml中增加 manager-gui和 manager-script配置,角色說明如下[2]:
manager-gui:訪問html接口。
manager-script:提供了純文本訪問形式,可以訪問服務器狀態頁面。配置此項主要是可以在代碼中封裝相應的操作接口,可以直接對應用進行操作。啟動、停止和重啟的文本訪問格式如下所示:
啟動:catalina/manager/text/start?path=/;
停止:catalina/manager/text/stop?path=/;
重啟:catalina/manager/text/reload?path=/;
其中,catalina為 http://ip:port,port只tomcat的端口。
程序在啟動時,對應的每一個節點都需要向zk中注冊一個臨時節點,創建臨時節點時向節點中寫入如下信息:
ip:對應節點的ip信息;
catalina:對應節點的catalina信息;
webApp:項目的webApp信息。
用catalina+webApp作為唯一標識identity。
2.1.4 實現以及應用的啟動和恢復過程
(1)在zk中創建永久節點/ha,本項目使用curator中間件,通過創建NodeCache來監聽/ha子節點的情況。每一個應用在啟動時,則在/ha節點中創建一個臨時子節點,寫入ip、catalina和webApp信息。在所有節點都成功啟動之后,從zk的/ha節點中就可以獲取到集群中所有節點的信息。
(2)創建一個/board永久節點來保存節點的恢復信息,即每次節點需要恢復時,先往/board節點中寫入節點的ip、catalina和webApp信息,這條信息只有在節點正常啟動時自身可以刪除。設置這個廣播信息是為了節點不被重復恢復。
2.1.4.1 啟動過程
(1)admin在啟動時,發現沒有同名的identity,說明集群中沒有此節點,先到/board節點中查看是否包含該identity信息。如果有,則刪除相應的identity信息;沒有則直接創建/ha的臨時子節點/ha/a-ip,a是admin節點的標識。
(2)admin在啟動時,如果發現有同名的identity信息,說明該節點已經存在,屬于重復啟動,這時可以直接退出。
(3)executor在啟動時,直接創建/ha/ip臨時有序節點。同時查找/board看是否存在自身的唯一標識,如果有則刪除。
2.1.4.2 恢復過程
(1)如果是executor宕機,集群中的所有節點通過競爭分布式鎖來進行節點的恢復操作。節點獲取鎖后,先遍歷/ha節點中所有的子節點,比較節點的identity與需要被恢復節點的identity時候相同。如果有相同信息,說明該節點已經被恢復,不再進行恢復操作;如果沒有,說明該節點還未被恢復,則查看/board中是否包含該節點信息。如果包含,說明已經有其他節點在進行恢復操作,不再進行恢復操作;不包含,通過發送tomcat manager的管理命令來對節點進行恢復操作。
(2)如果是admin宕機,先遍歷/ha中所有的子節點,看是否有冗余的admin節點,如果有,則選取任一一個,executor將注冊信息注冊到新的admin中,從而實現admin的切換。如果沒有冗余的admin。則集群中其他所有節點需要競爭分布式鎖,先將admin的identity寫入/board中,在通過發送tomcat manager的管理命令來對節點進行恢復操作。
雖然這種機制需要依賴tomcat進程的存活以及zk的可用性。但是通過tomcat manager以及Zookeeper實現應用的自動喚醒機制以及服務的高可用性,同時,通過tomcat manager的純文本訪問形式,可以相應減少人工維護,提高系統的可用時間。