Tomcat做负载均衡后,定时任务重复执行问题如何解决?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tomcat做负载均衡后,定时任务重复执行问题如何解决?相关的知识,希望对你有一定的参考价值。

windows2008平台下做的Tomcat负载均衡后,发现定时任务重复执行,有方法可以解决吗?请告诉指教!

两个job一起跑是为了提高执行效率是吧?那就要考虑并发的问题了。
建议在你们的业务数据里找一个比较特别的字段,做分组,两个job分别取不同分组的执行,这样就不会乱了。
打个比方,假如你们有个业务字段是电话号码(没有数字的可以直接取hashcode),那么就可以取电话号码末位,看是奇数还是偶数,job再来个入参,一个配只跑奇数,一个配只跑偶数。
当然为了扩展性,可以考虑按10/100/1000取模,分号段执行,抢完一个号段,再抢下一个号段。这个如果感兴趣可以再细聊。
参考技术A 能否说的具体点,软件分布情况 和 定时任务类型!!追问

不好意思,太忙了,回复晚了。
我这有2台服务器都是Windows2008R2系统,每台机器上面分别跑了1个Tomcat,使用Win系统自带的网络负载均衡管理器做了负载均衡。之前没考虑到Tomcat上做了定时任务,结果每次一到定时任务,2个Tomcat都往数据库里里插数据,造成同一时间点都有2条数据。定时任务类型是Spring Quartz。

追答

那这个就和你的负载均衡没关系了,是你的定时任务设计的有问题。 不清楚你们的业务需求,究竟这个定时任务有什么用? 考虑到这两个tomcat是一样的,是否可以考虑将一个定时任务删除。

使用 Nginx + Tomcat 搭建负载均衡

负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

1、环境规划
计划是采用三台机器进行部署,其中一台作为ngix服务器,另外两台作为tomcat服务器(以下仅作示例说明,具体环境规划请以实际情况而定)。
技术图片

2、Tomcat集群架构说明
技术图片
多个客户端发送请求访问系统,由nginx对请求进行分发,由不同的tomcat服务器进行处理,最终实现负载均衡,减轻服务器压力,提高服务性能和工作效率。
3、环境安装配置说明
3.1 Nginx安装简介
3.1.1 环境准备(因为ngix需要编译安装,所以需要先准备以下环境)
安装make:
yum -y install gcc automake autoconf libtool make
安装g++:
yum install gcc gcc-c++
安装pcre和pcre-devel:
yum install -y pcre pcre-devel
安装zlib zlib提供了很多压缩和解方式,nginx需要zlib对http进行gzip:
yum install -y zlib zlib-devel
安装openssl openssl是一个安全套接字层密码库,nginx要支持https,需要使用openssl:
yum install -y openssl openssl-devel

3.1.2下载 nginx
(1)方式一:通过访问ngix官网直接下载
nginx下载地址:http://nginx.org/en/download.html
nginx官网提供了三个类型的版本
a. Mainline version:Mainline 是 Nginx 目前主力在做的版本,可以说是开发版
b.Stable version:最新稳定版,生产环境上建议使用的版本
c. Legacy versions:遗留的老版本的稳定版
此处为了稳妥起见,我下载的是nginx-1.14.2?
(2)方式二:如果服务器上可以联网,直接下载,如下所示(下载路径:/usr/soft/nginx-1.14.2):
wget http://nginx.org/download/nginx-1.14.2.tar.gz
3.1.3 安装 nginx1.14.2
#解压 nginx1.14.2
tar zxf nginx-1.14.2.tar.gz
#cd到文件路径
cd nginx-1.14.2
#编译
./configure?--prefix=/usr/soft/nginx-1.14.2 --conf-path=/usr/local/nginx/nginx.conf ?
#安装
make && make install

3.1.4对外开放 80 端口

sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
sudo firewall-cmd --reload

3.1.5启动nginx
cd /usr/soft/nginx-1.14.2
sudo ./sbin/nginx
其它命令
sudo ./sbin/nginx -s stop : 停止 nginx;
sudo ./sbin/nginx -s reload: 配置文件修改,重新加载配置文件;
sudo ./sbin/nginx -t: 查看nginx是否启动成功;
sudo ./sbin/nginx -v: 查看nginx版本;

3.1.6 Nginx访问
浏览器访问:http://192.168.7.231:80/,出现nginx首页表示安装启动成功
技术图片

3.2tomcat 安装、配置简介
3.2.1 tomcat下载
到tomcat官网下载apache-tomcat-8.5.37
3.2.2 拷贝安装包
将安装包拷贝到221服务器上,解压 tomcat?至相应的目录(本人目录:/usr/soft/apache-tomcat-8.5.37);
3.2.3配置tomcat
  修改 tomcat 端口为 18080 的 server.xml 文件(目录:apache-tomcat-8.5.37/conf)为以下内容,为避免启动程序出现错误,共修改了三处位置:
(1)修改8005为18005
技术图片
(2)修改8080为18080
技术图片
(3)修改8009为18009
技术图片
(4)区别tomcat
为了区别两个 tomcat 的差别,切换到apache-tomcat-8.5.37/webapps/ROOT 目录下,修改 index.jsp ,<body>标签中添加内容?<h1>Tomcat 221:18080</h1>,启动 tomcat 服务输入 http://192.168.7.221:18080,如果成功则出现以下页面
  技术图片
(5)配置另外一台tomcat服务器
将安装包拷贝到222服务器上解压安装,修改 tomcat 端口为28005、 28080、28009 的 server.xml 文件,和index.jsp文件;
4、配置 nginx 来实现负载均衡,
4.1配置nginx服务器
打开目录?/usr/soft/nginx-1.14.2找到 nginx.conf 文件并进行如下修改:
(1)修改nginx.conf 前建议先备份文件
cp nginx.conf nginx.conf.bak
(2)修改nginx.conf文件
技术图片
如果为域名访问则需要修改server_name后面的值为当前服务域名,如下所示:
技术图片
(3)重新加载nginx服务器
sudo ./sbin/nginx -s reload
4.2测试通过nginx代理访问
(1)启动两个Tomcat实例
(2)使用浏览器进行访问,验证nginx的负载均衡是否已成功生效
在第一台客户机上访问http://192.168.7.231:80,效果如下所示:
技术图片
在另外一台客户机上访问http://192.168.7.231:80,效果如下所示:
技术图片
至此实现负载均衡,验证成功!

同时也欢迎各位看官关注本人公众号,在公众号上面本人将相关学习资料上传到上面,供大家一起学习讨论:
技术图片

以上是关于Tomcat做负载均衡后,定时任务重复执行问题如何解决?的主要内容,如果未能解决你的问题,请参考以下文章

spring中定时器每周执行两次

nginx做负载均衡,怎么在有宕机情况出现时保证网站的响应速度

集群环境下如何防止定时任务重复执行?

nginx做负载均衡时,nginx宕机怎么办

tomcat集群

集群环境下定时任务调度问题与方案探讨