应用一致性快照是一种确保在创建快照时应用程序的数据处于一致状态的技术,它不仅捕获了存储在云盘上的原始数据,还确保了任何正在进行的事务都已完成,内存中的数据被写入磁盘,并且应用程序的状态是一致的。当您使用应用一致性快照进行回滚时,可以直接恢复到一个一致的应用状态,避免了复杂的日志回滚过程,确保快速稳定的应用启动。本文介绍如何通过ECS控制台或Go SDK创建Linux和Windows的应用一致性快照。
前提条件
ECS实例的操作系统在以下范围内:
Windows:Windows Server 2022/2019/2016/2012 R2。
Linux:CentOS 7.6及以上版本、Ubuntu 18.04及以上版本和Alibaba Cloud Linux 2/3。
ECS实例中的云盘必须是ESSD PL0/1/2/3或者ESSD AutoPL类型,且文件系统为EXT3、EXT4、XFS或NTFS。同时,不支持网络文件系统和共享文件系统。
ECS实例已安装云助手Agent。具体操作,请参见安装云助手Agent。
说明2017年12月01日之后使用公共镜像创建的ECS实例,已默认预装云助手Agent。
已经安装Go运行环境。
具体操作,请参见下载和安装Golang。
已经下载和安装阿里云Go SDK。
具体操作,请参见开始使用。
背景信息
默认情况下,您创建的快照为崩溃一致性快照。如果您在创建快照时开启应用一致性快照功能,系统将根据实际情况为您创建应用一致性快照或者文件系统一致性快照。
类型 | 说明 | 实现方式 |
应用一致性快照 | 应用一致性快照在快照创建时刻备份内存数据及正在进行中的数据库事务,保证应用系统数据和数据库事务的一致性。通过应用一致性快照,没有数据的损坏及丢失,避免数据库启动时日志回滚,确保应用处于一致性的启动状态。 应用一致性快照以标签 | 根据操作系统类型,实现方式如下:
|
文件系统一致性快照 | 如果开启应用一致性功能,但不满足相关条件,系统将会为您创建文件系统一致性快照。 文件系统一致性确保在快照创建时刻同步文件系统内存和磁盘信息,冻结文件系统写操作,使得文件系统处于一致性的状态。通过文件系统一致性快照,可以避免操作系统在重启后进行chkdsk或fsck等磁盘检查修复操作。 文件系统一致性快照以标签 | 根据操作系统类型,实现方式如下:
|
操作步骤
通过控制台创建
步骤一:为ECS实例配置RAM角色
使用阿里云账号登录RAM控制台。
创建应用一致性快照相关的RAM角色。具体操作,请参见创建可信实体为阿里云服务的RAM角色。
示例为创建一个AppSnapshotRoleName的RAM角色。
创建应用一致性快照相关权限策略。具体操作,请参见创建自定义权限策略。
创建一个AppSnapshotPolicy权限策略,具有查询快照相关信息、创建快照、设置标签和查询云盘信息等相关权限。您可以直接使用以下策略内容。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "ecs:DescribeSnapshot*", "ecs:CreateSnapshot*", "ecs:TagResources", "ecs:DescribeDisks" ], "Resource": [ "*" ], "Condition": {} } ] }
为RAM角色(AppSnapshotRoleName)设置自定义权限(AppSnapshotPolicy)。具体操作,请参见为RAM角色授权。
为目标实例设置RAM角色(AppSnapshotRoleName)。具体操作,请参见配置ECS实例RAM角色。
步骤二:为实例开启应用一致性快照
Linux实例
在Linux实例中,您需要根据ECS实例上的应用程序定制Shell脚本(应用冻结脚本和应用解冻脚本)实现应用一致性。本节介绍如何为Linux实例开启应用一致性快照。
根据ECS实例上的应用,准备对应的应用冻结脚本和应用解冻脚本,并上传到ECS实例。
您可以通过FTP或云助手将应用冻结脚本和应用解冻脚本上传到ECS实例。
应用冻结脚本:权限设置为仅root用户具有读、写和执行权限,保存路径为/tmp/prescript.sh。
应用解冻脚本:权限设置为仅root用户具有读、写和执行权限,保存路径为/tmp/postscript.sh。
重要如果脚本设置错误(例如权限、保存路径或文件名设置错误等),最终创建的快照为文件系统一致性快照。
进入ECS实例列表页面。
登录ECS管理控制台。
在左侧导航栏,选择 。
在顶部菜单栏处,选择目标ECS实例所在地域。
找到目标实例,在操作列中选择
。在创建快照一致性组对话框中,设置快照一致性组参数。
选择需要创建快照一致性组的云盘并设置其他快照参数。
设置应用一致性快照。
如果选中启用应用一致性快照和启用文件系统IO冻结及解冻,并正确设置脚本,则创建应用一致性快照。
如果选中启用应用一致性快照和启用文件系统IO冻结及解冻,但未设置脚本或未正确设置脚本,则创建文件系统一致性快照。
说明选中启用应用一致性快照后,ECS实例将自动安装云助手插件。
单击确定。
创建后会返回云助手命令ID和命令执行ID,您可以根据命令执行ID查看创建结果。
Windows实例
在Windows实例中,主要是通过Windows操作系统的卷影复制服务实现应用一致性。本节介绍如何为Windows实例开启应用一致性快照。
进入ECS实例列表页面。
登录ECS管理控制台。
在左侧导航栏,选择 。
在顶部菜单栏处,选择目标ECS实例所在地域。
找到目标实例,在操作列中选择
。在创建快照一致性组对话框中,设置快照一致性组参数。
选择需要创建快照一致性组的云盘并设置其他快照参数。
设置应用一致性快照。
如果同时选中启用应用一致性快照和是否默认包含Writer,则创建应用一致性快照。
如果只选中启用应用一致性快照,则创建文件系统一致性快照。
说明选中启用应用一致性快照后,ECS实例将自动安装云助手插件。
单击确定。
创建后会返回云助手命令ID和命令执行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\",-InstantAccess=true,-EnableFsFreeze=true,-TimeoutInSeconds=30,-PreScriptPath=\"/tmp/prescript.sh\",-PostScriptPath=\"/tmp/postscript.sh\",-InstantAccessRentationDays=1,-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实例中不需要创建快照的云盘。
InstantAccess
Boolean
否
是否开启快照极速可用功能。取值如下:
true:开启
false:关闭
说明自2023年10月12日11:00起,快照极速可用能力升级,ESSD PL0/1/2/3及ESSD AutoPL云盘新建的快照将默认为创建后极速可用,无需额外配置该参数。更多信息,请参见快照极速可用能力。
InstantAccessRentationDays
Integer
否
快照极速可用功能保留天数,到期后自动关闭。
取值范围:1~65536。默认值:1
Name
String
是
快照一致性组名称。
Description
String
否
快照一致性组描述信息。
RamRoleName
String
是
ECS实例绑定的RAM角色,取值请参见步骤一:为ECS实例配置RAM角色。
PreScriptPath
String
否
应用冻结脚本路径(/tmp/prescript.sh)。prescript.sh脚本需要符合以下条件:
在权限上,仅root作为owner用户具有读、写、执行权限,即700权限。
在内容上,脚本内容需要根据应用自己定制。
说明Linux实例创建应用一致性快照时必须设置此参数。如果脚本设置错误(例如权限、保存路径或文件名设置错误等),最终创建的快照为文件系统一致性快照。
PostScriptPath
String
否
应用解冻脚本路径(/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\",-InstantAccess=true,-EnableWriters=true,-Description=\"AppSnapshot\",-InstantAccessRentationDays=1,-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实例中不需要创建快照的云盘。
InstantAccess
Boolean
否
是否开启快照极速可用功能。取值如下:
true:开启
false:关闭
说明自2023年10月12日11:00起,快照极速可用能力升级,ESSD PL0/1/2/3及ESSD AutoPL云盘新建的快照将默认为创建后极速可用,无需额外配置该参数。更多信息,请参见快照极速可用能力。
InstantAccessRentationDays
Integer
否
快照极速可用功能保留天数,到期后自动关闭。
取值范围:1~65536。默认值:1
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)。如果创建失败,您可以根据错误码信息排查问题。
错误码(ExitCode) | 说明 |
0 | 表示创建成功。 |
1 | 条件检查错误。可能错误如下:
|
2 |
|
3 | 可能错误如下:
|
4 | 创建快照一致性组失败。 |
5 | 快照一致性组状态错误。 |
6 | 创建快照一致性组超时。 |
7 | 快照一致性组内单个云盘快照的状态不符合预期。 |
8 | 为快照设置标签失败。 |
9 | 执行应用冻结脚本失败。 |
10 | 执行应用解冻脚本失败。 |
11 | 冻结IO失败。 |
12 | 解冻IO失败。 |
13 | ECS实例没有RAM角色授权。 |
14 | 快照个数超过限制。 |
15 | 快照状态错误。 |
16 | 在没有启动快照及时可用功能的情况下,前一个快照正在创建中。 |
255 | 未知失败。 |
相关文档
您可以为MySQL数据库或SQL Server数据库创建应用一致性快照,请参见为MySQL创建应用一致性快照最佳实践(Linux)和为SQL Server创建应用一致性快照最佳实践(Windows)。
- 本页导读 (1)