我正在尝试编写一个简单的Mesos框架,可以重新启动不成功的任务。
基本算法似乎主要是工作,是读入任务列表(例如shell命令),然后启动执行程序,等待收听状态消息。如果我得到TASK_FINISHED
,则完成该特定任务。如果我得到TASK_FAILED/TASK_KILLED
,我可以在别处重试(或者可能放弃)。
我不确定的情况是TASK_LOST
(甚至奴隶丢失)。我希望确保我不启动已经运行的任务的另一个副本。获得TASK_LOST
后,执行程序是否仍然可以在某处运行,但网络问题是否已将主服务器与主服务器断开连接? Mesos是否以某种方式处理此案例,可能是因为执行程序在无法联系主服务器时会自行终止(和任务)?
更一般地说,如何确保在此上下文中没有运行两个相同的任务?
答案 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)你可能想看的东西:
recovery_timeout
,如果mesos-slave
进程死亡,任务自杀则会进行调整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
确实意味着您的任务丢失,除了启动另一个实例之外,您无法做任何事情。
但要记住两件事:
TASK_LOST
状态。