通过tomcat manager和Zookeeper实现服务的高可用
2018-11-19李荣辉1杨志龙
李荣辉1,杨志龙
(1.南瑞集团有限公司,江苏 南京211000;2.南京基石数据有限责任公司,江苏 南京210093)
1 概 述
任务平台通过admin来管理executor,任务经客户端触发,由admin进行分发,executor负责执行。admin和executor通过jetty进行通信,executor根据配置的admin信息,每隔30 s向admin中注册一次,如果admin在3个周期中没有收到executor的消息,则认为executor不可用。由于任务需要经过的admin分发,可能出现单点故障。另外,executor分布在不同的机器上,如果executor出现故障,需要手动去恢复。功能整体架构如图1所示。
图1 功能整体架构图
2 可行性分析
Tomcat的manager可以管理项目,通过不同的URL来对项目进行启动、停止、重启等操作。Zookeeper,下面简称为zk,可以作为文件系统使用,其提供包括持久化目录节点、持久化顺序标号目录节点、临时目录节点以及临时顺序目录节点等4种节点类型。在应用启动时,往zk中注册一个临时节点,当某个节点出现故障时,与zk连接的session会中断,通过监控节点的变化可以获取故障节点的信息,解析出节点的catalina地址以及webApp等唯一性信息,之后可以根据tomcat manager进行相应的恢复操作。
2.1 技术架构与实现
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的管理命令来对节点进行恢复操作。
3 结束语
虽然这种机制需要依赖tomcat进程的存活以及zk的可用性。但是通过tomcat manager以及Zookeeper实现应用的自动唤醒机制以及服务的高可用性,同时,通过tomcat manager的纯文本访问形式,可以相应减少人工维护,提高系统的可用时间。