确保在TASK_LOST状态更新后{em}任务未运行

时间:2015-07-29 01:54:55

标签: mesos

我正在尝试编写一个简单的Mesos框架,可以重新启动不成功的任务。

基本算法似乎主要是工作,是读入任务列表(例如shell命令),然后启动执行程序,等待收听状态消息。如果我得到TASK_FINISHED,则完成该特定任务。如果我得到TASK_FAILED/TASK_KILLED,我可以在别处重试(或者可能放弃)。

我不确定的情况是TASK_LOST(甚至奴隶丢失)。我希望确保我不启动已经运行的任务的另一个副本。获得TASK_LOST后,执行程序是否仍然可以在某处运行,但网络问题是否已将主服务器与主服务器断开连接? Mesos是否以某种方式处理此案例,可能是因为执行程序在无法联系主服务器时会自行终止(和任务)?

更一般地说,如何确保在此上下文中没有运行两个相同的任务?

2 个答案:

答案 0 :(得分:4)

让我首先提供一些背景知识然后尝试回答你的问题。

1)TASK_LOST和其他终端不成功状态之间的区别在于重新启动丢失的任务可能会以TASK_FINISHED结束,而失败或被杀的情况很可能不会。

2)在你得到TASK_LOST之前,你应该假设你的任务正在运行。想象一下,Mesos Agent(Slave)会死一段时间,但是任务可能仍在运行并且会成功协调,即使连接暂时丢失。

3)现在回答你原来的问题。问题是完全一次运行实例是非常困难的(参见例如[1]和[2])。如果您丢失了与任务的连接,则可能意味着(临时)网络分区或您的任务已经死亡。您基本上必须在两种选择之间进行选择:要么可能同时运行多个实例,要么可能有没有实例运行的时间段。

4)保证两个任务不同时运行并不容易。当您从Mesos获得TASK_LOST更新时,这意味着您的任务已经死亡或孤立(一旦协调就会被杀死)。现在想象一下当你的任务的奴隶与Mesos Master断开连接时(由于网络分区):当你得到TASK_LOST更新时,Master会确保在恢复连接后任务被终止,你的在此之前,任务将在断开连接的从站上运行,这违反了保证,因为一旦获得TASK_LOST更新,您已经启动了另一个实例。

5)你可能想看的东西:

    对于Mesos奴隶的
  • recovery_timeout,如果mesos-slave进程死亡,任务自杀则会进行调整
  • Mesos Master上的
  • slave_reregister_timeout指定了奴隶必须多少时间重新注册Mesos Master并让他们的任务得到协调(基本上,当你得到TASK_LOST无法访问任务的更新时。)

[1] http://antirez.com/news/78

[2] http://bravenewgeek.com/you-cannot-have-exactly-once-delivery/

答案 1 :(得分:1)

您可以假设TASK_LOST确实意味着您的任务丢失,除了启动另一个实例之外,您无法做任何事情。

但要记住两件事:

  1. 您的框架可能会注册故障转移超时,这意味着如果您的框架由于任何原因无法与从服务器通信(网络不稳定,从服务器死亡,调度程序死亡等),那么Mesos将在该超时内无法恢复后终止该框架的任务。在任务实际被视为死亡后(例如,当故障转移超时到期时),您将获得TASK_LOST状态。
  2. 当不使用故障转移超时时,由于任何原因连接丢失,将立即终止任务。