计划备份

Trove 目前没有计划实例备份的方式。本文档建议通过利用 Mistral 工作流来实现计划备份。

Launchpad 蓝图:https://blueprints.launchpad.net/trove/+spec/scheduled-backup

问题描述

Trove 不支持计划备份。

提议的变更

将通过利用 Mistral 工作流来支持计划备份 1。Trove python API 将被扩展,以提供一个以 Trove 为中心的 Mistral 工作流接口。

一个 Trove 工作簿将被加载到 Mistral 中,以支持通过计划调用 trove.backup_create python API。将添加 Trove python API 方法以支持计划备份以及列出计划备份及其执行。使用这些 Trove 命令,用户将能够管理备份计划(创建/删除/列出等)并查看所述计划的执行情况。然而,就像 Nova flavors 一样,Trove 本身不会实际执行任何命令,只是将它们传递给 Mistral。任何发生的错误都将在查看执行情况时可见,但将仅限于 Mistral 暴露的内容。

所有更改都将在 python-troveclient 模块中进行,工作簿除外。如果启用了 Mistral,它将可在 Trove 仓库中提供,以便(可能)被 devstack 插件加载。

请参阅 附录 以获取 Trove 工作簿示例。

配置

没有配置更改。

数据库

没有数据库更改。

公共 API

没有 REST API 更改。

公共 API 安全

没有安全影响。

Python API

注意:引用的“cron 模式”是标准的 cron 表达式。2

def schedule_create(self, instance, pattern, name,
                    description=None, parent_id=None,
                    mistral_client=None):
    """Create a new schedule to backup the given instance.

    :param instance: instance to backup.
    :param pattern: cron pattern for schedule.
    :param name: name for backup.
    :param description: (optional).
    :param parent_id: base for incremental backup (optional).
    :returns: :class:`Backups`
    """

def schedule_list(self, instance, mistral_client=None):
    """Get a list of all backup schedules for an instance.

    :param: instance for which to list schedules.
    :rtype: list of :class:`Schedule`.
    """

def schedule_show(self, schedule, mistral_client=None):
    """Get details of a backup schedule.

    :param: schedule to show.
    :rtype: :class:`Schedule`.
    """

def schedule_delete(self, schedule, mistral_client=None):
    """Remove a given backup schedule.

    :param schedule: schedule to delete.
    """

def execution_list(self, schedule, mistral_client=None,
                   marker='', limit=None):
    """Get a list of all executions of a scheduled backup.

    :param: schedule for which to list executions.
    :rtype: list of :class:`ScheduleExecution`.
    """

def execution_delete(self, execution, mistral_client=None):
    """Remove a given schedule execution.

    :param execution: id of execution to remove.
    """

CLI (python-troveclient)

加载 Trove 工作簿

$ mistral workbook-create ~/mwj/mistral/trove.yaml

创建计划

$ trove schedule-create m "*/2 * * * *" myback
+---------------------+----------------------------------------------------------------------------------------------------------------+
| Property            | Value                                                                                                          |
+---------------------+----------------------------------------------------------------------------------------------------------------+
| created_at          | 2016-06-14 14:47:16.865731                                                                                     |
| id                  | fb149a29-be9b-49c1-a2f7-ca6c1213896f                                                                           |
| input               | {"instance": "5328f62a-d999-4be3-90bb-83cc6af4469c", "description": null, "parent_id": null, "name": "myback"} |
| instance            | 5328f62a-d999-4be3-90bb-83cc6af4469c                                                                           |
| name                | myback                                                                                                         |
| next_execution_time | 2016-06-14 07:48:00                                                                                            |
| parent_id           | None                                                                                                           |
| pattern             | */2 * * * *                                                                                                    |
+---------------------+----------------------------------------------------------------------------------------------------------------+

列出计划

$ trove schedule-list m
+--------------------------------------+--------+-------------+---------------------+
| ID                                   | Name   | Pattern     | Next Execution Time |
+--------------------------------------+--------+-------------+---------------------+
| fb149a29-be9b-49c1-a2f7-ca6c1213896f | myback | */2 * * * * | 2016-06-14 07:50:00 |
+--------------------------------------+--------+-------------+---------------------+

显示计划

trove schedule-show fb149a29-be9b-49c1-a2f7-ca6c1213896f
+---------------------+----------------------------------------------------------------------------------------------------------------+
| Property            | Value                                                                                                          |
+---------------------+----------------------------------------------------------------------------------------------------------------+
| created_at          | 2016-06-14 14:47:16                                                                                            |
| id                  | fb149a29-be9b-49c1-a2f7-ca6c1213896f                                                                           |
| input               | {"instance": "5328f62a-d999-4be3-90bb-83cc6af4469c", "description": null, "parent_id": null, "name": "myback"} |
| instance            | 5328f62a-d999-4be3-90bb-83cc6af4469c                                                                           |
| name                | myback                                                                                                         |
| next_execution_time | 2016-06-14 07:52:00                                                                                            |
| parent_id           | None                                                                                                           |
| pattern             | */2 * * * *                                                                                                    |
| updated_at          | 2016-06-14 14:49:59                                                                                            |
+---------------------+----------------------------------------------------------------------------------------------------------------+

删除计划

$ trove schedule-delete fb149a29-be9b-49c1-a2f7-ca6c1213896f

列出执行

trove execution-list fb149a29-be9b-49c1-a2f7-ca6c1213896f
+--------------------------------------+---------------------+---------+-------------------------------+
| ID                                   | Execution Time      | State   | Output                        |
+--------------------------------------+---------------------+---------+-------------------------------+
| 38ef2289-4330-4554-8574-4b5351f69713 | 2016-06-14 14:49:59 | SUCCESS | {"status": "Backup complete"} |
| 3713355a-b65e-44e0-ac43-150b863a6e6e | 2016-06-14 14:51:59 | SUCCESS | {"status": "Backup complete"} |
+--------------------------------------+---------------------+---------+-------------------------------+

删除执行

$ trove execution-delete 3713355a-b65e-44e0-ac43-150b863a6e6e

内部 API

没有内部 API 更改。

Guest Agent

没有客户机更改。

备选方案

另一种选择是让 Trove 实现自己的调度机制。

Dashboard 影响 (UX)

将向实例操作下拉菜单添加一个操作,以显示实例的计划备份。这将导向一系列面板,用于显示计划备份、计划的详细信息以及计划的执行情况。计划备份列表将有一个选项来创建新的计划。列出计划和执行情况的面板将有一个操作来删除相应的资源。

实现

负责人

主要负责人

6-morgan

Dashboard 指定人

duktesora

里程碑

完成目标里程碑

Newton

工作项

  • 已经原型化 3

  • 实现单元测试

升级影响

没有升级影响。

依赖项

n/a

测试

如果我们在场景测试中添加支持(通过 python API),这意味着我们需要安装 Mistral。因此,不会创建任何场景测试。

文档影响

需要记录新的 python API 方法和 CLI 命令。

附录

这是 Mistral 的 Trove 工作簿的样子

---
version: '2.0'

name: trove

description: Trove Workflows

workflows:

  backup_create:
    input: [instance, name, description, parent_id]
    output:
      status: <% $.message %>

    tasks:
      backup_create:
        action: trove.backups_create instance=<% $.instance %> name=<% $.name %> description=<% $.description %> parent_id=<% $.parent_id %>
        publish:
          message: <% 'Backup complete' %>