一个 HA 相关的问题

2014-08-26 13:27:49 +08:00
 uleone
数据库中有一张任务表,每条任务有三种状态:未执行,正在执行,已执行。
多台服务器定期从此表中取未执行任务来执行,执行开始时将状态改为正在执行,执行完成时将状态改为已执行。
问题: 如果某台服务器正在执行任务时挂掉,如何让其他服务器继续执行未完成的任务?有什么比较好的方案?
2820 次点击
所在节点    问与答
6 条回复
nybux
2014-08-26 15:03:48 +08:00
1.正在执行在附加一个服务器id信息
2.服务器重启后,把库中所有id=自己,状态等于正在执行的都更新成未执行
lucky2touch
2014-08-26 17:37:19 +08:00
应该需要一个类似的仲裁程序,监控正在执行的任务状态,如果检测到服务器挂了,则将任务状态重置,或者任务出现超时的情况,强制转移任务之类的。
uleone
2014-08-27 09:33:00 +08:00
@lucky2touch 这样的仲裁程序有没有已有的实现?可以直接拿来用的。不知道Zookeeper能不能做到?不太熟
songco
2014-08-27 09:50:45 +08:00
@uleone Zookeeper 是可以的, 你们目前多个服务器访问同一张表怎么做任务dispatch的?
实现方法有很多, 你们的任务实时性要求高吗? 任务执行的时间一般有多长?
cxxrocks
2014-08-27 17:44:31 +08:00
我提一个方案,可以把队列放在每个节点上。
如果某个节点空闲,可以从其他节点队列的尾巴上取走任务。
lambdaT
2014-09-01 14:20:29 +08:00
同意楼上, 设置一个队列, 数据库是用来记录 任务日志的(开始, running, failure, success);

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/129962

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX