Mesos Checkpoint Feature & Master Agent Connection
Contents
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重连的机会(这段时间为mesoshealth 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它管理的所有executor和task并退出。
值的注意的是,这个时间设置需要大于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,它所管理的executor和task也会继续运行,如果重连成功了的话(比如网络问题修复了),master会要求agent shutdown,agent会shutdown所有task并退出。官方建议使用process supervisor(e.g. systemd)来自动启动mesos-slave。
这个过程中有几个配置项值得考虑:
--agent_removal_rate_limit(--slave_removal_rate_limit): 当agentshealth check失败后,从master注册列表中被移除的速度(如1/10mins,2/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被允许连入)。
Author Wenfeng
LastMod 2017-05-18