Mesos在更新版本后将slave改名为agent,所以本文中的agent与mesos-slave完全等同。

本文将讨论的问题:

  • Mesos checkpoint 机制的作用
  • Mesos master 与 agent连接检查的机制
  • Mesos master 与 agent连接断开后的状态变化

Usage of Mesos Checkpoint Feature

Mesos的checkpoint功能主要能起到3个作用:

Agent disconnect with executor
  • 当agent线程挂掉,或者与executor无法连接时,如果framework没有使用checkpoint,executor一旦发现与agent断开,立即自动退出。
  • 如果framework使用了checkpoint,executor将在一段时间内(MESOS_RECOVERY_TIMEOUT)尝试重连,超出timeout之后才会自动退出。这个时间的设置可以通过--recovery_timeout标签来设置,默认15分钟。
Agent disconnect with master
  • 当agent线程挂掉,或者与master连接断开时,如果没有checkpoint,master会立即为此agent管理的所有task发送TASK_LOST状态变更的信息,然后等待一段时间,给agent重连的机会(这段时间为mesos health check的时间,可以通过--agent_ping_timeout--max_agent_ping_timeouts标签来设置),如果agent重连成功,master会kill掉之前发送TASK_LOST的所有task。
  • 如果使用了checkpoint,master不会发送TASK_LOST,而是直接等待,如果重连成功了,也不会kill任何task,就像什么也没有发生一样。
Agent recovery
  • 当agent重启后,如果没有checkpoint,agent管理的还存活着的task会被立即重启。
  • 如果使用了checkpoint,agent会将一些信息(Task Info, Executor Info, etc.)写入本地磁盘,重启后可以根据设置来进行恢复。 这些设置有3个:
    • strict: 若为true,恢复时出现的所有error将被视为fatal,恢复中断;若为false,忽略所有error,以最大的可能去恢复;默认为true
    • recover:若为reconnect,重连所有存活的executor;若为cleanup,kill所有存活的executor并退出;默认为reconnect
    • recovery_timeout,前面也有所提到,这是给agent预留的恢复时间,如果超过这个时间后还有executor没有连到,那么那些executor将会自动退出,默认时间为15分钟。

Dealing with Partitioned or Failed Agents

2 mechanisms to track availability and health

Mesos master用两种方法来检测跟踪agent的可靠性:

  • Master 与 agent之间tcp连接的状态
  • Health check:通过master间断性地给agent发ping来检测,如果agent连续几次都响应失败,就判定为失联。health check的时间可以通过这两个标签来控制:
    • --agent_ping_timeout(--slave_ping_timeout):agent响应ping的时间限制,超出时间还未响应则为失败,默认为15秒。
    • --max_agent_ping_timeouts (--max_slave_ping_timeouts):master可容忍的响应失败次数,默认为5。

所以默认的health check timeout为15*5=75秒。重启的agent需要在这个时间之内re-register master,不然master将shutdown 这个agent,而收到shutdown信号的agent会kill它管理的所有executortask并退出。

值的注意的是,这个时间设置需要大于ZooKeeper session timeout以避免无用的re-register尝试。

Steps to remove disconnected agent

当master检测到agent失联后,会采取步骤从列表中删掉失联的agent,这其中的步骤也会分有checkpoint和没有checkpoint,这在前面也有所提及。

可以看以下图示:

若没有开启checkpoint,master会立即发送TASK_LOST message,只有如果重连成功,会kill掉这些task。

如果在health check timeout时间内重连失败,master会从注册agent列表里移除这个agent,并且发送SLAVE_LOST的callback和相应的TASK_LOST的信息。

而值得注意的是,不管SLAVE_LOST callback还是TASK_LOST status update message,mesos都不保证发送的信息是可靠的,即使因为网络原因中途丢失了,也只会发一次。

被移除列表的agent依然会持续尝试重连master,它所管理的executortask也会继续运行,如果重连成功了的话(比如网络问题修复了),master会要求agent shutdown,agent会shutdown所有task并退出。官方建议使用process supervisor(e.g. systemd)来自动启动mesos-slave。

这个过程中有几个配置项值得考虑:

  • --agent_removal_rate_limit(--slave_removal_rate_limit): 当agents health check失败后,从master注册列表中被移除的速度(如1/10mins2/3hrs等),默认为立即移除。
  • --recovery_agent_removal_limit(--recovery_slave_removal_limit): 限制agent被master从注册列表中移除的和shutdown的比例,如果超过这个比例,master将不会移除agent,而是自身failover,通过这个设置可能增加生产环境的安全性,默认为100%
  • agent_reregister_timeout(--slave_reregister_timeout): agent重连master的时间限制。agent与master断开连接或有新的master被选为leader时,会尝试re-register,默认设置时间10分钟,设置必须大于或等于10分钟。

Dealing with Partitioned or Failed Masters

由于大部分的master state只存在内存中,当master failover,新的master被选出时,新master对集群的状态将一无所知,直到有agent re-register这个新的master。在这期间如果去询问某台agent的task状态,将没有任何回应。

如果agent没有在--agent_reregister_timeout时间内重连新的master,master将标记这个agent为失败并执行前面提到过的步骤。唯一不同的是,agent被允许连接新的master即使已经超过了timeout。这表示framework可能会看到TASK_LOST状态更新,之后却发现task正在运行(因为agent被允许连入)。