目录
现有技术
很多时候我们都需要使用调度任务,按照指定周期执行对应的应用程序,简单的可以借助Spring的定时任务完成,复杂的可以借助一些通用的调度任务框架,例如XXL-JOB。使用Spring调度任务时,需要考虑分布式加锁机制,防止不同的服务器同时运行对应的调度任务,同时,当相关机器有问题时,要完成程序的自动切换。对于XXL-JOB架构的使用,需要搭建对应的服务,当我们简单的程序应用时,投入成本就比较大了。
解决方案
本发明提供一种通用的调度任务实现方式,一方面可以完成调度任务单机计算,另一方面当主机器有问题时,可以自动切换到从节点,实现应用的热备。当然,主从机器可以根据配置实现不同的功能运行,充分提升服务器的利用率。
方案详情
整体方案底层使用spring实现,相关可变动的参数配置在配置文件中
1、配置文件初始化
初始化配置文件中的参数信息,完成HaConfig公共配置的赋值,对应相关的配置信息如下:
a)、clusterName:集群名称,不同的集群名称确定一个集群分组,用来部署不同的分组信息
b)、masterPackage:主集群需要执行的package列表
c)、slavePackage:备集群需要执行的package列表
d)、clusterType:集群分发执行组建类别 (可以选择Redis、Zookeeper等技术作为实现方式),假设我们设置redis,那么对应相关的分发都是通过redis来实现的
e)、heartbeatInterval:心跳监测时间间隔(秒)
f)、switchMasterSlaveTime :主备集群切换时间间隔(秒)
2、注册运行具体的代码信息
a)、初始化实体类
初始化运行的实体类,主要是根据配置文件中获取对应的clusterName参数,组装完成分布式锁的key值的划分,相关的参数如下:
heartbeatKey:心跳检测存储的key值,使用clusterName做为前缀关键字
masterKey:主节点key值,使用clusterName做为前缀关键字
localAddress:当前服务器IP
b)、HA分发监测机制执行
i、实例初始化
根据clusterType字段设置的类型,完成对应执行实例的初始化,该实例主要是为了完成心跳检测、主从节点的写入以及主从轮询监控的相关功能选择的技术,可以通过redis、zookeeper等实现
ii、心跳轮询注册监控
1、清除历史已经注册的当前的服务器IP,防止上一次发布对当前的操作有影响
2、重新注册当前的服务器IP,写入到分布式系统中,例如使用redis,采用hset的方式,注册field为当前的服务器IP,值为当前获取的系统时间
3、初始化内置调度任务,按照heartbeatInterval设置的时间点,周期更新当前的服务器IP到分布式系统中。例如redis,按照周期时间,更新对应IP写入的系统时间
iii、主从节点标识写入
1.判断主节点标识是否写入,如果没有写入,设置当前的服务器为主节点,更新当前服务的标识为master,主节点存储在分布式系统中。例如redis,可以key-value的形式,存储主节点的值为当前的服务器IP
2.如果主节点标识已经写入,那么更新当前的节点为从节点
c)、节点应用服务运行
i、主节点解析对应运行的实例
基于配置文件中masterPackage配置的信息,扫描该包下的所有class文件,生成对应class实例,多个包时使用逗号分隔。当然也可以是单个文件信息,在扫描解析的时候根据类型判断是文件还是文件夹,来完成对应class的解析。
ii、从节点解析对应运行的实例
基于配置文件中slavePackage配置的包信息,扫描该包下的所有class文件,生成对应class实例,多个包时使用逗号分隔。当然也可以是单个文件信息,在扫描解析的时候根据类型判断是文件还是文件夹,来完成对应class的解析。
iii、调度任务运行
完成对应包下面所有的类的解析,基于Quartz技术,创建Scheduler调度实例,运行该类scheduleJob
d)、主从节点轮询监控
节点的轮询监控主要是监控主从节点是否正常运行,当主节点有问题时,可以直接切换从节点转换成主节点,从而防止程序异常无法运行,完成自动切换的功能,另一方面,当从节点有问题时,可以直接移除有问题的节点
i、主节点调度任务监控
使用调度任务轮询监控主节点,如果主节点存储的IP和本机获取的IP不一致,变更本机状态为从节点
ii、从节点调度任务监控
1、获取全部心跳轮询注册的IP列表
2、循环IP列表,查看是否存在主节点IP,如果不存在主节点IP,删除主节点对应的标识,变更本机为主节点,更新状态
3、如果循环IP列表中包含主节点IP
比对IP写入的时间,如果当前时间剪去上次注册时间大于集群切换时间间隔,删除主节点标识,更新本机为主节点,存储本机IP为主节点的值
iii、应用任务重启
主从上面调度任务有相关状态变更之后,重复执行 c)中的步骤,完成对应应用任务的重启
本方案主要是提供一种通用的服务器调度任务实现方式,可以自动完成总从节点切换,同时在主从节点中设置配置主从机器对应的运行功能,实现主从节点功能的分离与切换