我正在尝试编写一个简单的mesos框架,可以重新启动失败的任务。
基本的算法,似乎大部分是工作的,是读入一个任务列表(例如shell命令),然后启动执行器,等待收到状态消息。如果我得到 TASK_FINISHED
,特定任务完成。如果我得到 TASK_FAILED/TASK_KILLED
,我可以在其他地方重试该任务(或者放弃)。
我不确定的是 TASK_LOST
(甚至奴隶丢失)。我希望确保不会启动已在运行的任务的另一个副本。得到之后 TASK_LOST
,是否可能执行器仍在某处运行,但网络问题已断开从机与主机的连接?mesos是否以某种方式处理了这个问题,比如让执行者在无法联系到主程序时自杀(以及任务)?
更一般地说,如何确保没有两个相同的任务在此上下文中运行?
2条答案
按热度按时间nhaq1z211#
让我先提供一些背景资料,然后试着回答你的问题。
1) 两者的区别
TASK_LOST
另一种终端不成功的状态是,重新启动丢失的任务可能会以失败告终TASK_FINISHED
,而失败或被杀则很可能不会。2) 直到你得到一个
TASK_LOST
你应该假设你的任务正在运行。假设一个mesos代理(slave)死了一段时间,但是任务可能仍然在运行,并且将成功地协调,即使连接暂时丢失。3) 现在回到你原来的问题。问题是要让示例只运行一次是非常困难的(参见[1]和[2])。如果与任务失去连接,则可能意味着(临时)网络分区或任务已终止。基本上,您必须在两个备选方案中进行选择:要么有可能同时运行多个示例,要么有可能在没有示例运行的情况下运行时段。
4) 要保证两个任务不同时运行并不容易。当你得到一个
TASK_LOST
从mesos更新它意味着要么你的任务是死的,要么是孤立的(一旦协调,它将被杀死)。现在想象一下这样一种情况:当一个执行任务的从设备与mesos主设备断开连接时(由于网络分区),您将得到一个TASK_LOST
更新并且主服务器确保任务被终止一旦连接被恢复,您的任务将在断开连接的从属服务器上运行直到那时,这违反了保证,因为您已经在获得连接后启动了另一个示例TASK_LOST
更新。5) 你可能想看的东西:
recovery_timeout
关于mesos,当任务自杀时,如果mesos-slave
工艺模具slave_reregister_timeout
在mesos master上指定从机需要多少时间来重新注册mesos master并协调它们的任务(基本上,当您TASK_LOST
无法访问的任务的更新)。[1] http://antirez.com/news/78
[2] http://bravenewgeek.com/you-cannot-have-exactly-once-delivery/
k75qkfdt2#
你可以假设
TASK_LOST
这意味着您的任务已丢失,您只能启动另一个示例。但要记住两件事:
您的框架可能会注册故障转移超时,这意味着如果您的框架由于任何原因(网络不稳定、从机死机、调度程序死机等)无法与从机通信,那么mesos将在该框架的任务无法在该超时内恢复后终止该框架的任务。你会得到
TASK_LOST
任务实际被视为已死亡后的状态(例如,故障转移超时过期时)。不使用故障转移超时时,如果由于任何原因失去连接,任务将立即终止。