为什么需要集群?
1、防止单点故障,减少对业务的影响
2、减少节点的压力,例如在 10点要触发 1000个任务,如果有 10个节点,则每个节点之需要执行 100个任务
集群需要解决的问题?
1、任务重跑,因为节点部署的内容是一样的,到 10点的时候,每个节点都会执行相同的操作,引起数据混乱。比如跑批,绝对不能执行多次。
2、任务漏跑,假如任务是平均分配的,本来应该在某个节点上执行的任务,因为节点故障,一直没有得到执行。
3、水平集群需要注意时间同步问题
4、Quartz使用的是随机的负载均衡算法,不能指定节点执行
所以必须要有一种共享数据或者通信的机制。在分布式系统的不同节点中,我们可以采用什么样的方式,实现数据共享?两两通信,或者基于分布式的服务,实现数据共享。例如:ZK、Redis、DB。在 Quartz中,提供了一种简单的方式,基于数据库共享任务执行信息。也就是说,一个节点执行任务的时候,会操作数据库,其他的节点查询数据库,便可以感知到了。同样的问题:建什么表?哪些字段?依旧使用系统自带的 11张表。
集群配置与验证
quartz.properties配置。
四个配置:集群实例 ID、集群开关、数据库持久化、数据源信息
注意先清空 quartz所有表、改端口、两个任务频率改成一样
验证 1:先后启动 2个节点,任务是否重跑
验证 2:停掉一个节点,任务是否漏跑