V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
uleone
V2EX  ›  问与答

一个 HA 相关的问题

  •  
  •   uleone · 2014-08-26 13:27:49 +08:00 · 2948 次点击
    这是一个创建于 3721 天前的主题,其中的信息可能已经有所发展或是发生改变。
    数据库中有一张任务表,每条任务有三种状态:未执行,正在执行,已执行。
    多台服务器定期从此表中取未执行任务来执行,执行开始时将状态改为正在执行,执行完成时将状态改为已执行。
    问题: 如果某台服务器正在执行任务时挂掉,如何让其他服务器继续执行未完成的任务?有什么比较好的方案?
    6 条回复    2014-09-01 14:20:29 +08:00
    nybux
        1
    nybux  
       2014-08-26 15:03:48 +08:00   ❤️ 2
    1.正在执行在附加一个服务器id信息
    2.服务器重启后,把库中所有id=自己,状态等于正在执行的都更新成未执行
    lucky2touch
        2
    lucky2touch  
       2014-08-26 17:37:19 +08:00   ❤️ 1
    应该需要一个类似的仲裁程序,监控正在执行的任务状态,如果检测到服务器挂了,则将任务状态重置,或者任务出现超时的情况,强制转移任务之类的。
    uleone
        3
    uleone  
    OP
       2014-08-27 09:33:00 +08:00
    @lucky2touch 这样的仲裁程序有没有已有的实现?可以直接拿来用的。不知道Zookeeper能不能做到?不太熟
    songco
        4
    songco  
       2014-08-27 09:50:45 +08:00   ❤️ 1
    @uleone Zookeeper 是可以的, 你们目前多个服务器访问同一张表怎么做任务dispatch的?
    实现方法有很多, 你们的任务实时性要求高吗? 任务执行的时间一般有多长?
    cxxrocks
        5
    cxxrocks  
       2014-08-27 17:44:31 +08:00
    我提一个方案,可以把队列放在每个节点上。
    如果某个节点空闲,可以从其他节点队列的尾巴上取走任务。
    lambdaT
        6
    lambdaT  
       2014-09-01 14:20:29 +08:00
    同意楼上, 设置一个队列, 数据库是用来记录 任务日志的(开始, running, failure, success);
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   987 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 20:14 · PVG 04:14 · LAX 13:14 · JFK 16:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.