跳转到: 导航, 搜索

事务任务管理

  • 创建时间: 2011年12月21日
  • 贡献者: Yun Mao <maoy AT research.att.com>

这是正在进行中的工作

高可用事务任务管理

问题

Nova中的任务,例如启动实例,由于以下原因,往往复杂且容易出错

  • 每个任务可能包含多个步骤,并且执行时间较长。
  • 一个任务涉及多个节点,并且容易受到意外错误、节点故障和瞬态网络分区的影响。当发生意外错误时(虽然这种情况不常见),清理过程通常没有经过充分测试。例如,参见bug 837687和839910。
  • 多个任务可以操作相同的资源(例如,虚拟机、磁盘卷),从而导致竞争条件。例如,虚拟机可能正在迁移,而用户点击了终止按钮,或者后台仲裁进程(参见instance-state-arbiter蓝图)可能正在尝试修复不一致的状态。

目前没有系统化、可重用的方法来跟踪分布式任务的执行情况。也没有机制来了解当前哪些任务正在使用哪些资源。任务管理被隐式地假定为虚拟机状态管理。

目标

此蓝图建议构建一个高可用服务,以提供一流的任务和资源锁管理API。有了该服务,操作员将具备以下能力:

  • 监控每个任务的进度,包括任务正在执行的步骤、运行的节点以及持有的资源锁
  • 自动原子回滚:使用撤销函数来处理执行期间的意外错误,以避免不一致的状态。
  • 轻松重试失败的任务,或中止(杀死)任务。应适当获取和释放资源锁。
  • 无忧的并发控制,以自动避免任务之间的竞争条件和死锁

设计

  • 存储:任务状态,包括资源锁,是硬状态,应存储在高度可用且轻量级的组件中,例如ZooKeeper。MySQL可能可以接受,但不是理想选择。
  • 任务内容
  - task_id, owner
  - shared and exclusive locks. e.g. ["instance-deadbeef", "volume-1234"]
  - task execution logs for rollback and retry
  - last_updated timestamp
  - state: e.g. [running on node X, waiting on lock Y, aborting, ended]
  - opaque, task-specific information: e.g. imaging, booting, migrating


  • 更改任务数据结构的API
  - task_id = create_task()
  - send_signal(task_id, ...) # kill, terminate, etc
  - aquire_locks( tid, type, resource_objects)
  - release_locks(tid, ..)
  - update_task(tid, ...) # execution log, task specific state
  - end_task()


实现

  • 更改调度器以利用API来创建、中止或重试任务。
  • 更改工作者(计算、网络)以更新任务状态、执行日志并检查中止信号。
  • 通过添加撤销声明来更改工作者,以便于自动原子回滚。
  • 构建命令行工具,通过查询任务状态进行管理,秉承“ps、kill、top、lsof、strace”的精神

目标:essex发布之后

此蓝图与以下内容相关

https://blueprints.launchpad.net/nova/+spec/instance-state-arbiter

https://blueprints.launchpad.net/nova/+spec/transaction-orchestration

https://blueprints.launchpad.net/nova/+spec/rpc-improvements

http://etherpad.openstack.org/vmstatemachine

https://blueprints.launchpad.net/nova/+spec/fail-gracefully-on-resource-overcommit