论坛首页 Java版

集群的困惑

浏览 4470 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
时间:2008-03-27 关键字: 集群
最近做了一个应用,里面定义了一个TimerTask,设置每天24:00处理一些事情
后来应用放在集群环境中了
我的困惑是:
假如集群环境中有3台服务器,但每一台服务器的时间都不一致,那么这些服务器会分别在24:00执行应用的任务吗?如果是这样的话,那事情岂不是做了三次?有方法限制他们只能做一次吗?如果不是,那这些服务器是怎样解决这个问题的呢?
因水平有限,对集群了解的不多,可能描述不清楚,恳请各位帮帮忙
   
时间:2008-03-27
看你这个timertask是干什么具体事情的了.

如果你的应用虽然有3台服务器,但是db还是单点的,而TimerTask又是对db中的数据取出来运算完毕再存入,那不就没有必要在3台机器上都run这个task了 ,在一台上run就行了.

如果要是3台独立的,那么它们分别执行,又会有什么问题呢?

还是请把具体任务描述一下,看大家帮你出谋划策吧.
   
0 请登录后投票
时间:2008-03-27
为什么就不能只在其中一台上布置TimerTask而另外两台不布置呢?
或者db表上设上标志位,执行过的就不再执行。
   
0 请登录后投票
时间:2008-03-27
定时同步三台服务器时间就没有问题

可能的话,把这个任务分解成为3个独立子任务,让集群中的三台分别并行执行。
如果不能分解任务的话,集群意义就不大了。
   
0 请登录后投票
时间:2008-03-27
yyjn12 写道

还是请把具体任务描述一下,看大家帮你出谋划策吧.
嗯,db是单点的...
任务的具体情况是这样的:
每天24:00获取由一台固定的服务器同步过来的数据,然后将数据存入固定的数据库中
我所担心的是会不会三台机器都run这个task,使得数据库中有三条相同的数据...
   
0 请登录后投票
时间:2008-03-27
db是单点的话,就在数据库中做标识呗
不过谁先执行执行完了其他2台就不再执行任务了

如果时间差不多是同时的话,
任务本身执行的过程对数据库的标识表做一个db锁即可,防止集群下的同步执行.

这样保证只有一个任务是可以正常执行下去的。
   
0 请登录后投票
时间:2008-03-27
定时任务是不适合放到集群里的
   
0 请登录后投票
时间:2008-03-27
hyhongyong 写道
db表上设上标志位,执行过的就不再执行。
moogle 写道
db是单点的话,就在数据库中做标识呗
标志位我这里是有设的,但应用的数据库操作是用jdo实现的,存在缓存。
假如其中一台机器执行任务的时候将标志位修改为锁定状态,但这时候存在缓存,实际上没有及时的更新数据库的标志位。
而同时另外一台机器到24:00开始执行任务的时候发现数据库的标志位为未锁定状态,那问题是不是依旧没解决呢?
godson_2003 写道
定时任务是不适合放到集群里的
为什么呢?
现在的情况是我把应用上传到一台服务器后
另外的服务器会自动把应用同步过去了
   
0 请登录后投票
时间:2008-03-27
我猜你的三台机器是做负载均衡的

你可以看一下这个连接,具体说的也不详细
http://edocs.bea.com.cn/wls/docs92/cluster/overview.html#wp1017056
据说Quartz可以做cluster,你可以查一下。

另外,“我把应用上传到一台服务器后
另外的服务器会自动把应用同步过去了” 这个你是怎么做到的?
   
0 请登录后投票
时间:2008-03-27
引用

标志位我这里是有设的,但应用的数据库操作是用jdo实现的,存在缓存。
假如其中一台机器执行任务的时候将标志位修改为锁定状态,但这时候存在缓存,实际上没有及时的更新数据库的标志位。
而同时另外一台机器到24:00开始执行任务的时候发现数据库的标志位为未锁定状态,那问题是不是依旧没解决呢?


你在修改标识的时候要求实时写入数据库,当正确返回数据库写入并且加上db锁以后才开始启动定时任务,这个也不会对你的服务器造成多大的压力。

--

另外,“我把应用上传到一台服务器后
另外的服务器会自动把应用同步过去了” 这个你是怎么做到的? 


这个我不知道楼主怎么实现的,不过linux下可以对多台服务器公用一套内容可以通过link方式实现
   
0 请登录后投票
论坛首页 Java版

跳转论坛:
JavaEye推荐