如果您对数据一致性有严格要求,可以在创建一致性快照组时开启应用一致性快照功能,应用一致性快照会确保应用程序内部的数据一致并将其包含在快照中。本文介绍如何通过ECS控制台或Go SDK创建Linux和Windows的应用一致性快照。
背景信息
如果您在创建一致性快照组时开启应用一致性快照功能,系统将根据实际情况为您创建应用一致性快照或文件系统一致性快照。
快照类型 | 说明 | 应用场景 |
应用一致性快照 |
| 对数据一致性有严格要求的应用,特别是数据库和关键业务系统,确保在灾难恢复时能够立即恢复到一个逻辑上正确的状态。 |
文件系统一致性快照 |
| 适用于需要确保文件系统整体一致性的场景,比如文件服务器、文档管理系统等,特别适合那些关注文件层次结构完整性的备份需求。 |
使用限制
目前仅ESSD类型的云盘支持创建应用一致性快照,且云盘未开启多重挂载功能。
不支持跨实例创建应用一致性快照,仅支持为单台ECS实例的云盘创建应用一致性快照。
前提条件
确保ECS实例的操作系统在以下范围内:
Windows:Windows Server2012 R2及以上操作系统。
Linux:CentOS 7.6及以上版本、Ubuntu 18.04及以上版本或Alibaba Cloud Linux 2。
ECS实例已安装云助手Agent。具体操作,请参见安装云助手Agent。
如果您需要通过Go SDK创建应用一致性快照,需确保:
已经安装Go运行环境。具体操作,请参见下载和安装Golang。
已经下载并安装阿里云Go SDK。具体操作,请参见开始使用。
操作步骤
通过控制台创建
步骤一:为ECS实例配置RAM角色
登录RAM控制台。
创建应用一致性快照相关的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实例创建应用一致性快照。
根据ECS实例上的应用,准备对应的脚本,并提前上传到ECS实例。
脚本
说明
上传路径
脚本类型
脚本权限
脚本内容
prescript.sh
用于在执行可能影响应用程序的操作之前,暂停应用程序的所有写操作,确保当前的数据状态不会因操作过程中新产生的数据而不一致。
/tmp/prescript.sh
Shell
仅root用户具有读、写和执行权限
需根据实际业务制定,例如为MySQL创建应用一致性快照最佳实践(Linux)
postscript.sh
一旦完成了可能影响应用的操作(如备份完成),postscript.sh脚本会被用于恢复应用程序到正常工作状态,允许写操作继续进行。
/tmp/postscript.sh
如何将文件上传至ECS实例,请参见使用Workbench上传或下载文件。
说明如果脚本设置错误(例如权限、上传路径或脚本名称设置错误等),最终创建的快照为文件系统一致性快照。
进入ECS实例列表页面。
登录ECS管理控制台。
在左侧导航栏,选择 。
在顶部菜单栏处,选择目标ECS实例所在地域。
找到目标实例,在操作列选择
。在创建快照一致性组对话框中,设置快照一致性组参数。
选择需要创建快照一致性组的云盘并设置其他快照参数。
设置应用一致性快照。
如果选中启用应用一致性快照和启用文件系统IO暂停与恢复,并正确设置脚本,则创建应用一致性快照。
如果选中启用应用一致性快照和启用文件系统IO暂停与恢复,但未设置脚本或未正确设置脚本,则创建文件系统一致性快照。
说明如果实例未安装云助手,选中启用应用一致性快照后,ECS实例将自动安装云助手插件。
单击确定。
创建后会返回云助手命令ID和命令执行ID,您可以根据命令执行ID查看创建结果。
Windows实例
在Windows实例中,主要是通过Windows操作系统的卷影复制服务VSS实现应用一致性。本节介绍如何为Windows实例开启应用一致性快照。
进入ECS实例列表页面。
登录ECS管理控制台。
在左侧导航栏,选择 。
在顶部菜单栏处,选择目标ECS实例所在地域。
找到目标实例,在操作列中选择
。在创建快照一致性组对话框中,设置快照一致性组参数。
选择需要创建快照一致性组的云盘并设置其他快照参数。
设置应用一致性快照。
如果同时选中启用应用一致性快照和是否默认包含Writer,则创建应用一致性快照。
如果只选中启用应用一致性快照,则创建文件系统一致性快照。
说明选中启用应用一致性快照后,ECS实例将自动安装云助手插件。
单击确定。
创建后会返回云助手命令ID和命令执行ID,您可以根据命令执行ID查看创建结果。
步骤三:检查快照创建结果
创建应用一致性快照后,您可以在云助手页面查看是否创建成功,并在快照页面查看创建的快照一致性组和快照信息。
在云助手页面,查看应用一致性快照是否成功创建。
在快照页面查看创建的快照一致性组和快照信息。
在左侧导航栏,选择 。
单击快照一致性组页签,找到已创建的快照一致性组,单击快照一致性组ID查看快照详情。
在快照信息区域,根据快照的标签信息,查看创建的快照是应用一致性快照还是文件系统一致性快照。
如果显示
APPConsistent:True
标签,表示创建的是应用一致性快照如果显示
FsConsistent: True
标签,表示创建的是文件系统一致性快照
通过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秒。
调用结果示例如下所示,返回参数说明,请参见RunCommand。
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。
调用结果示例如下所示,返回参数说明,请参见RunCommand。
步骤三:调用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 | 条件检查错误。可能错误如下:
|
2 |
|
3 | 可能错误如下:
|
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)。