创建应用一致性快照

如果您对数据一致性有严格要求,可以在创建一致性快照组时开启应用一致性快照功能,应用一致性快照会确保应用程序内部的数据一致并将其包含在快照中。本文介绍如何通过ECS控制台或Go SDK创建Linux和Windows的应用一致性快照。

背景信息

如果您在创建一致性快照组时开启应用一致性快照功能,系统将根据实际情况为您创建应用一致性快照或文件系统一致性快照。

快照类型

说明

应用场景

应用一致性快照

  • 在创建应用一致性快照时,会暂时暂停应用程序的写操作,确保写操作结果同步到云盘中。不仅确保存储在云盘上的数据是一致的,而且应用程序内部(如数据库)的数据也是一致的。

  • 应用一致性快照通过标签APPConsistent:True标识。

  • 根据操作系统类型,实现方式如下:

    • Linux:通过执行自定义Shell脚本(需要您根据应用自行编写脚本)实现。应用一致性的效果,由您自己编写的脚本负责保证。

    • Windows:通过Windows自带的相关功能实现,例如卷影复制服务VSS(Volume Shadow Copy Service)。

对数据一致性有严格要求的应用,特别是数据库和关键业务系统,确保在灾难恢复时能够立即恢复到一个逻辑上正确的状态。

文件系统一致性快照

  • 在创建应用一致性快照时,如果未设置脚本或脚本设置错误,最终创建的快照为文件系统一致性快照。文件系统一致性快照着重于确保文件系统数据的一致性,确保在快照创建时刻文件系统处于一致的状态。

  • 文件系统一致性快照通过标签FsConsistent:True标识。

  • 根据操作系统类型,实现方式如下:

    • Linux:如果无对应的应用脚本,默认创建文件系统一致性快照。

    • Windows:如果没有包含Writer,默认创建文件系统一致性快照。

适用于需要确保文件系统整体一致性的场景,比如文件服务器、文档管理系统等,特别适合那些关注文件层次结构完整性的备份需求。

使用限制

  • 目前仅ESSD类型的云盘支持创建应用一致性快照,且云盘未开启多重挂载功能

  • 不支持跨实例创建应用一致性快照,仅支持为单台ECS实例的云盘创建应用一致性快照。

前提条件

  • 确保ECS实例的操作系统在以下范围内:

    • Windows:Windows Server2012 R2及以上操作系统。

    • Linux:CentOS 7.6及以上版本、Ubuntu 18.04及以上版本或Alibaba Cloud Linux 2。

  • ECS实例已安装云助手Agent。具体操作,请参见安装云助手Agent

  • 如果您需要通过Go SDK创建应用一致性快照,需确保:

操作步骤

通过控制台创建

步骤一:为ECS实例配置RAM角色

  1. 登录RAM控制台

  2. 创建应用一致性快照相关的RAM角色、为RAM角色授权并授予ECS实例。具体操作,请参见创建ECS实例RAM角色并授予给ECS。其中:

    • RAM角色:示例名称为AppSnapshotRoleName

    • 可信实体类型:阿里云服务

    • 自定义权限策略:示例名称为AppSnapshotPolicy,内容如下:

      {
          "Version": "1",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "ecs:DescribeSnapshot*",
                      "ecs:CreateSnapshot*",
                      "ecs:TagResources",
                      "ecs:DescribeDisks"
                  ],
                  "Resource": [
                      "*"
                  ],
                  "Condition": {}
              }
          ]
      }

      该策略具有查询快照相关信息、创建快照、设置标签和查询云盘信息等权限。

步骤二:为实例创建应用一致性快照

Linux实例

在Linux实例中,您需要根据ECS实例上的应用程序自定义Shell脚本(prescript.sh和postscript.sh)实现应用一致性。本节介绍如何为Linux实例创建应用一致性快照。

  1. 根据ECS实例上的应用,准备对应的脚本,并提前上传到ECS实例。

    脚本

    说明

    上传路径

    脚本类型

    脚本权限

    脚本内容

    prescript.sh

    用于在执行可能影响应用程序的操作之前,暂停应用程序的所有写操作,确保当前的数据状态不会因操作过程中新产生的数据而不一致。

    /tmp/prescript.sh

    Shell

    仅root用户具有读、写和执行权限

    需根据实际业务制定,例如为MySQL创建应用一致性快照最佳实践(Linux)

    postscript.sh

    一旦完成了可能影响应用的操作(如备份完成),postscript.sh脚本会被用于恢复应用程序到正常工作状态,允许写操作继续进行。

    /tmp/postscript.sh

    如何将文件上传至ECS实例,请参见使用Workbench上传或下载文件

    说明

    如果脚本设置错误(例如权限、上传路径或脚本名称设置错误等),最终创建的快照为文件系统一致性快照。

  2. 进入ECS实例列表页面。

    1. 登录ECS管理控制台

    2. 在左侧导航栏,选择实例与镜像 > 实例

    3. 在顶部菜单栏处,选择目标ECS实例所在地域。image.png

  3. 找到目标实例,在操作列选择更多 > 云盘与镜像 > 创建快照一致性组

  4. 创建快照一致性组对话框中,设置快照一致性组参数。

    1. 选择需要创建快照一致性组的云盘并设置其他快照参数。

    2. 设置应用一致性快照。

      • 如果选中启用应用一致性快照启用文件系统IO暂停与恢复,并正确设置脚本,则创建应用一致性快照。

      • 如果选中启用应用一致性快照启用文件系统IO暂停与恢复,但未设置脚本或未正确设置脚本,则创建文件系统一致性快照。

      说明

      如果实例未安装云助手,选中启用应用一致性快照后,ECS实例将自动安装云助手插件。

  5. 单击确定

    创建后会返回云助手命令ID和命令执行ID,您可以根据命令执行ID查看创建结果。命令执行id

Windows实例

在Windows实例中,主要是通过Windows操作系统的卷影复制服务VSS实现应用一致性。本节介绍如何为Windows实例开启应用一致性快照。

  1. 进入ECS实例列表页面。

    1. 登录ECS管理控制台

    2. 在左侧导航栏,选择实例与镜像 > 实例

    3. 在顶部菜单栏处,选择目标ECS实例所在地域。image.png

  2. 找到目标实例,在操作列中选择更多 > 云盘与镜像 > 创建快照一致性组

  3. 创建快照一致性组对话框中,设置快照一致性组参数。

    1. 选择需要创建快照一致性组的云盘并设置其他快照参数。

    2. 设置应用一致性快照。

      • 如果同时选中启用应用一致性快照是否默认包含Writer,则创建应用一致性快照。

      • 如果只选中启用应用一致性快照,则创建文件系统一致性快照。

      说明

      选中启用应用一致性快照后,ECS实例将自动安装云助手插件。

  4. 单击确定

    创建后会返回云助手命令ID和命令执行ID,您可以根据命令执行ID查看创建结果。命令执行id

步骤三:检查快照创建结果

创建应用一致性快照后,您可以在云助手页面查看是否创建成功,并在快照页面查看创建的快照一致性组和快照信息。

  1. 云助手页面,查看应用一致性快照是否成功创建。

    1. 登录ECS管理控制台

    2. 在左侧导航栏,选择运维与监控 > 云助手

    3. 单击命令执行结果页签。

    4. 单击目标命令执行ID,查看执行结果。

      image.png

      如上图所示,ExitCode返回值为0,表示云助手上创建应用一致性快照执行成功,此时回显信息中会显示快照一致性组ID。

      说明

      如果ExitCode返回值不为0,请根据ExitCode错误码信息排查相关问题。更多信息,请参见错误码信息

  2. 快照页面查看创建的快照一致性组和快照信息。

    1. 在左侧导航栏,选择存储与快照 > 快照

    2. 单击快照一致性组页签,找到已创建的快照一致性组,单击快照一致性组ID查看快照详情。

    3. 快照信息区域,根据快照的标签信息,查看创建的快照是应用一致性快照还是文件系统一致性快照。

      • 如果显示APPConsistent:True标签,表示创建的是应用一致性快照

        image.png

      • 如果显示FsConsistent: True标签,表示创建的是文件系统一致性快照

        image.png

通过Go SDK创建

步骤一:为ECS实例配置RAM角色

通过调用接口AttachInstanceRamRole为目标ECS实例设置RAM角色(示例为AppSnapshotRoleName)。

以下为Go SDK代码示例:

package main
import (
    "fmt"
    "os"
    "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs"
)

func main() {
		// 请确保代码运行环境设置了环境变量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
    // 工程代码泄露可能会导致AccessKey泄露,并威胁账号下所有资源的安全性。以下代码示例使用环境变量获取AccessKey的方式进行调用,建议使用更安全的STS方式。
    client, err := ecs.NewClientWithAccessKey(
        "cn-hangzhou",       
        os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),     
        os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")) 

    //调用AttachInstanceRamRole为实例绑定RAM角色
    request := ecs.CreateAttachInstanceRamRoleRequest()
    request.Scheme = "https"

    request.RamRoleName = "AppSnapshotRoleName"          //设置RAM角色名称
    request.InstanceIds = "[\"i-bp17r83nppqf141v****\"]" //设置实例ID

    response, err := client.AttachInstanceRamRole(request)
    if err != nil {
        fmt.Print(err.Error())
    }

    fmt.Println(response.String())
}

调用结果示例如下所示,返回参数说明,请参见AttachInstanceRamRole调用结果

步骤二:调用RunCommand为实例创建应用一致性快照

Linux实例

通过调用云助手接口RunCommand为一台或多台Linux实例创建应用一致性快照。

以下为Go SDK代码示例:

package main

import (
    "fmt"
    "os"
    "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs"
)

func main() {
		// 请确保代码运行环境设置了环境变量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
    // 工程代码泄露可能会导致AccessKey泄露,并威胁账号下所有资源的安全性。以下代码示例使用环境变量获取AccessKey的方式进行调用,建议使用更安全的STS方式。
    client, err := ecs.NewClientWithAccessKey(
        "cn-hangzhou",    //设置实例所在地域
        os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),     
        os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))

    //调用RunCommand为实例创建应用一致性快照。
    request := ecs.CreateRunCommandRequest()
    request.Scheme = "https"

    request.Type = "RunShellScript"
    //创建应用一致性快照的命令,具体信息,请参见CommandContent内容说明。
    request.CommandContent = "acs-plugin-manager --exec --plugin app-snapshot-plugin --params=-RamRoleName=\"AppSnapshotRoleName\",-EnableFsFreeze=true,-TimeoutInSeconds=30,-PreScriptPath=\"/tmp/prescript.sh\",-PostScriptPath=\"/tmp/postscript.sh\",-ExcludeDiskId=\"\",-Name=\"LinuxApp1\""
    request.InstanceId = &[]string{"i-bp17r83nppqf141v****"} //设置实例ID

    response, err := client.RunCommand(request)
    if err != nil {
        fmt.Print(err.Error())
    }
    fmt.Printf("response is %#v\n", response)
}

CommandContent参数中内容说明:

  • acs-plugin-manager --exec --plugin app-snapshot-plugin:表示执行云助手插件app-snapshot-plugin

  • --params=表示插件的配置参数,具体参数说明,如下表所示。

    参数

    类型

    是否必传

    描述

    ExcludeDiskId

    String

    ECS实例中不需要创建快照的云盘。

    Name

    String

    快照一致性组名称。

    Description

    String

    快照一致性组描述信息。

    RamRoleName

    String

    ECS实例绑定的RAM角色,取值请参见步骤一:为ECS实例配置RAM角色

    PreScriptPath

    String

    prescript.sh脚本路径(/tmp/prescript.sh)。prescript.sh脚本需要符合以下条件:

    • 在权限上,仅root作为owner用户具有读、写、执行权限,即700权限。

    • 在内容上,脚本内容需要根据应用自行定制。

    重要

    Linux实例创建应用一致性快照时必须设置此参数。如果脚本设置错误(例如权限、保存路径或文件名设置错误等),最终创建的快照将是文件系统一致性快照。

    PostScriptPath

    String

    postscript.sh脚本路径(/tmp/postscript.sh)。postscript.sh脚本需要符合以下条件:

    • 在权限上,仅root作为owner用户具有读、写、执行权限,即700权限。

    • 在内容上,脚本内容需要根据应用自行定制。

    重要

    Linux实例创建应用一致性快照时必须设置此参数。如果脚本设置错误(例如权限、保存路径或文件名设置错误等),最终创建的快照将是文件系统一致性快照。

    EnableFsFreeze

    Boolean

    是否在创建存储快照前使用Linux的FsFreeze机制确保文件系统处于只读一致性。

    默认为True。

    TimeoutInSeconds

    Integer

    IO超时时间。

    默认为30秒。

    ScriptTimeoutInSeconds

    Integer

    脚本执行超时时间。

    默认值为1800秒。

调用结果示例如下所示,返回参数说明,请参见RunCommandlinux

Windows实例

通过调用云助手API接口RunCommand为一台或多台Windows实例创建应用一致性快照。

以下为Go SDK示例:

package main

import (
    "fmt"
  	"os"
    "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs"
)

func main() {
    // 请确保代码运行环境设置了环境变量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
    // 工程代码泄露可能会导致AccessKey泄露,并威胁账号下所有资源的安全性。以下代码示例使用环境变量获取AccessKey的方式进行调用,建议使用更安全的STS方式。
    client, err := ecs.NewClientWithAccessKey(
        "cn-hangzhou",       //设置实例所在地域
        os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),     
        os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))

    request := ecs.CreateRunCommandRequest()
    request.Scheme = "https"

    request.Type = "RunBatScript"
    //创建应用一致性快照的命令,具体信息,请参见CommandContent内容说明。
    request.CommandContent = "acs-plugin-manager --exec --plugin app-snapshot-plugin-win --params=-RamRoleName=\"AppSnapshotRoleName\",-EnableWriters=true,-Description=\"AppSnapshot\",-ExcludeDiskId=\"\",-Name=\"APPSnapshot-1\""
    request.InstanceId = &[]string{"i-bp11vqwgh574****"} //设置实例ID
    request.Timeout = "1800"

    response, err := client.RunCommand(request)
    if err != nil {
        fmt.Print(err.Error())
    }
    fmt.Printf("response is %#v\n", response)
}

CommandContent参数中内容说明:

  • acs-plugin-manager --exec --plugin app-snapshot-plugin-win:表示执行云助手插件app-snapshot-plugin-win

  • --params=表示插件的配置参数,具体参数说明,如下表所示。

    参数

    类型

    是否必传

    描述

    ExcludeDiskId

    String

    ECS实例中不需要创建快照的云盘。

    Name

    String

    快照一致性组名称。

    Description

    String

    快照一致性组描述信息。

    RamRoleName

    String

    ECS实例绑定的RAM角色,取值请参见步骤一:为ECS实例配置RAM角色

    EnableWriters

    Boolen

    是否设置应用一致性快照。取值如下:

    • true:创建应用一致性快照

    • false:创建文件系统一致性快照

    默认值为true。

调用结果示例如下所示,返回参数说明,请参见RunCommandwin查询结果

步骤三:调用DescribeInvocationResults查看快照创建结果

通过调用接口DescribeInvocationResults查看是否执行成功。

以下为Go SDK示例:

package main

import (
    "fmt"
    "os"
    "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs"
)

func main() {
    // 请确保代码运行环境设置了环境变量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
    // 工程代码泄露可能会导致AccessKey泄露,并威胁账号下所有资源的安全性。以下代码示例使用环境变量获取AccessKey的方式进行调用,建议使用更安全的STS方式。
    client, err := ecs.NewClientWithAccessKey(
        "cn-hangzhou",    //设置实例所在地域
        os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),     
        os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")) 

    //通过DescribeInvocationResults查询结果
    request := ecs.CreateDescribeInvocationResultsRequest()
    request.Scheme = "https"

    request.InvokeId = "t-hz01qsegaxi****"        //命令执行ID,可在上一步骤的执行结果中查看。
    request.InstanceId = "i-bp17r83nppqf141v****" //实例ID
    request.CommandId = "c-hz01qsegaxd****"       //命令ID,可在上一步骤的执行结果中查看。

    response, err := client.DescribeInvocationResults(request)
    if err != nil {
        fmt.Print(err.Error())
    }
    fmt.Printf("response is %#v\n", response)
}

调用结果示例如下,返回参数说明,请参见DescribeInvocationResults查看结果

  • ExitCode返回错误码信息,取值为0表示执行成功;如果取值不为0,请根据错误码信息排查问题。更多信息,请参见错误码信息

  • Output为命令执行后的输出信息,内容通过Base64编码。

    如果执行成功,Output内容经过Base64解码后会包含创建的快照一致性组ID,如下所示。

    [snapshotgroup="ssg-bp170v57ca9j01jb****"][message="Finish whole Processes of Snapshot successfully"]

错误码信息

错误码(ExitCode)

说明

0

表示创建成功。

1

条件检查错误。可能错误如下:

  • 云盘类型不支持。

  • 快照名称不符合要求。

  • 网络不通。

  • ECS实例没有RAM角色授权。

  • 操作系统版本不支持。

2

--params后设置的参数类型或个数错误。

3

可能错误如下:

  • ECS实例没有挂载ESSD云盘。

  • ECS实例的RAM角色未设置快照接口的访问权限。

4

创建快照一致性组失败。

5

快照一致性组状态错误。

6

创建快照一致性组超时。

7

快照一致性组内单个云盘快照的状态不符合预期。

8

为快照设置标签失败。

9

执行postscript.sh脚本失败。

10

执行postscript.sh脚本失败。

11

暂停IO失败。

12

恢复IO失败。

13

ECS实例没有RAM角色授权。

14

快照个数超过限制。

15

快照状态错误。

16

在没有启动快照及时可用功能的情况下,前一个快照正在创建中。

255

未知失败。

相关文档

您可以为MySQL数据库或SQL Server数据库创建应用一致性快照,请参见为MySQL创建应用一致性快照最佳实践(Linux)为SQL Server创建应用一致性快照最佳实践(Windows)