leolong00 2016-10-20
mesos agent 在升级完成后,将会 start mesos agent service, 会打印出一些 (flags, resources, attributes, hostname etc), 然后从目录 /data/mesos/meta
中恢复 mesos agent 状态。与此同时,Group 进程会连接到 ZooKeeper 上,并同步一些 group 操作(比如:joins, cancels, datas 的队列大小等)。然后采用消息摘要算法完成与 ZooKeeper 的认证。
之后,开始恢复运行在其上的框架(frameworks ) 信息。先恢复框架的 executors ,(与此同时,垃圾回收会启动定时任务(比如在多少天之后回收)以回收该 executor 的资源,这个部分可能会执行。)
即 recovering executors -> recovering Docker containers -> Recovering containerizer -> provisioner recovery complete .
恢复 docker container 原理是:会将之前的 container 信息 (container id, slaveId, container state, executorcontainer, pid etc ) 先保留下来, 以创建一个新 container 的方式复制保存。
之后把之前的老的 container 销毁。销毁的顺序是: 先让该container 中的 executor 退出,然后 destroy container.
这时,group 会在 zookeeper 中创建一个数据存储的目录。detector 会侦测 leading master
在 slave 这边,slave 开始从 checkpoint 恢复,同时会回调 container termination 操作,如果设置了重连接 flag, 则会发送重连接 executor 请求 。
slave 将 framework 的 task 状态更新成 TASK_FAILED
,并更新该 task 对应的 container resources 信息。
status_update_manager.cpp
会接收 TASK_FAILED
的状态更新并更新检查点
如果该 slave 正处在 RECOVERING 状态,slave 会丢弃 TASK_FAILED
状态更新。
最后,slave 会清除所有未重新注册的 executors 。此时,mesos agent 完成 recovery 操作了。
status_update_manager.cpp
会 Resuming sending status updates, 并发送两次 Resending status update TASK_FAILED
给 slave 。然后 slave.cpp 会将该 task 的 TASK_FAILED 状态 forward 给 mesos master .
之后,status_update_manager.cpp
会收到 Received status update acknowledgement
并且会 Checkpointing ACK for status update TASK_FAILED
由于 TASK_FAILED
,此时 slave 会清掉该 task 对应的 executor。gc.cpp
也开始对该 task 的资源进行垃圾回收。
因此,最后在该 agent 上跑的 task 的 executor 都会被清除并将所有的资源回收,该 task 的 FAILED 的状态会由 该 agent 汇报给 master ,所以 该失败 task 如果不在当前 agent 上重新注册执行就会在另外一个 agent 上重新执行。。。
如果是在当前 agent 上执行,则 slave 会接收到该任务,并加入到 queue 队列并准备执行, docker 会为其准备启动 container 并检查 checkpoint , systemd 会分配一个 pid 给 mesos_executors.slice
。slave 此时,会得到 executors 重新注册的消息,并将在队列中的 task 发给那个 executor , 并更新成 TASK_RUNNING 状态,slave 也会将该状态转发给 master , 此时 task 恢复执行了。
http://blog.csdn.net/yeasy/article/details/46683297
http://blog.csdn.net/qianggezhishen/article/details/51783705