确保mesos任务在任务丢失状态更新后没有运行

0s0u357o  于 2021-06-21  发布在  Mesos
关注(0)|答案(2)|浏览(371)

我正在尝试编写一个简单的mesos框架,可以重新启动失败的任务。
基本的算法,似乎大部分是工作的,是读入一个任务列表(例如shell命令),然后启动执行器,等待收到状态消息。如果我得到 TASK_FINISHED ,特定任务完成。如果我得到 TASK_FAILED/TASK_KILLED ,我可以在其他地方重试该任务(或者放弃)。
我不确定的是 TASK_LOST (甚至奴隶丢失)。我希望确保不会启动已在运行的任务的另一个副本。得到之后 TASK_LOST ,是否可能执行器仍在某处运行,但网络问题已断开从机与主机的连接?mesos是否以某种方式处理了这个问题,比如让执行者在无法联系到主程序时自杀(以及任务)?
更一般地说,如何确保没有两个相同的任务在此上下文中运行?

nhaq1z21

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/

k75qkfdt

k75qkfdt2#

你可以假设 TASK_LOST 这意味着您的任务已丢失,您只能启动另一个示例。
但要记住两件事:
您的框架可能会注册故障转移超时,这意味着如果您的框架由于任何原因(网络不稳定、从机死机、调度程序死机等)无法与从机通信,那么mesos将在该框架的任务无法在该超时内恢复后终止该框架的任务。你会得到 TASK_LOST 任务实际被视为已死亡后的状态(例如,故障转移超时过期时)。
不使用故障转移超时时,如果由于任何原因失去连接,任务将立即终止。

相关问题