在ECS实例运行状态下,数据库等应用程序的部分数据可能仍保存在内存中或处于待写入存储的阶段。由于快照无法直接捕获这些未落盘的数据,因此通过快照恢复数据时,可能会导致应用数据丢失或不一致。阿里云快照服务结合云助手,提供了应用一致性快照功能,通过该功能,您通过快照恢复数据时可以确保应用程序内部数据的一致性。
背景信息
如果您在创建一致性快照组时开启应用一致性快照功能,系统将根据实际情况为您创建应用一致性快照或文件系统一致性快照。两者区别如下:
特性 | 应用一致性快照 | 文件系统一致性快照 |
特性 | 应用一致性快照 | 文件系统一致性快照 |
关注点 | 确保存储数据和应用程序内部(例如数据库)的数据一致性。 | 文件系统层面的数据一致性。 |
实现方式 |
|
|
适用场景 | 适用于对数据一致性有严格要求的应用,特别是数据库和关键业务系统。 | 适用于需要确保文件系统整体一致性的场景,比如文件服务器、文档管理系统等。 |
快照标签 | APPConsistent:True | FsConsistent:True |
工作原理
应用一致性快照的工作原理如下。
Linux实例启用应用一致性快照功能后,系统默认处于文件系统一致性状态。如果您上传事先准备好的Shell脚本(prescript.sh脚本和postscript.sh脚本)后,系统根据脚本执行应用一致性检查,如果执行成功,将快照标记为应用一致性快照,否则标记为文件系统一致性快照。
prescript.sh脚本和postscript.sh脚本说明如下:
脚本名称 | 作用 | 脚本类型 | 上传路径 | 脚本权限 | 脚本内容 |
prescript.sh | 用于在执行可能影响应用程序的操作之前,暂停应用程序的所有写操作,确保当前的数据状态不会因操作过程中新产生的数据而不一致。 | Shell | /tmp/prescript.sh | 仅root用户具有读、写和执行权限 | 需根据实际业务自行编写,例如步骤一:创建prescript.sh和postscript.sh脚本。 |
postscript.sh | 一旦完成了可能影响应用的操作(如备份完成),postscript.sh脚本会被用于恢复应用程序到正常工作状态,允许写操作继续进行。 | Shell | /tmp/postscript.sh |
创建应用一致性快照的脚本名称、脚本类型以及上传路径是固定的,您自定义脚本时请保持一致,否则可能会导致脚本运行失败。
针对需要创建快照的ECS实例,开启应用一致性快照功能,并判断实例是否安装云助手。
如果实例未安装云助手,启用应用一致性快照后,ECS实例将自动安装云助手插件。
云助手访问ECS实例自动执行相关命令,运行prescript.sh脚本,暂停、恢复I/O操作,创建快照等。
脚本正确并运行成功,创建应用一致性快照。
脚本错误(例如权限、上传路径或脚本名称设置错误等)或运行失败,创建文件系统一致性快照。
运行postscript.sh脚本,恢复I/O操作。
Windows实例启用应用一致性快照功能后,云助手结合Windows自带的卷影复制服务VSS执行应用一致性检查,如果执行成功,将快照标记为应用一致性快照,否则标记为文件系统一致性快照。
针对需要创建快照的ECS实例,开启应用一致性快照功能,并判断实例是否安装云助手。
如果实例未安装云助手,启用应用一致性快照后,ECS实例将自动安装云助手插件。
云助手访问ECS实例自动执行相关命令,暂停、恢复I/O操作,创建快照等。
云助手调用VSS服务并暂停所有I/O操作。
判断系统是否包含默认的Writer。
如果包含,创建应用一致性快照。
如果不包含,创建文件系统一致性快照。
恢复I/O操作。
使用限制
目前仅ESSD类型的云盘支持创建应用一致性快照,且云盘未开启多重挂载功能。
ECS控制台不支持跨实例创建应用一致性快照,仅支持为单台ECS实例的云盘创建应用一致性快照。
前提条件
确保ECS实例的操作系统在以下范围内:
Windows:Windows Server2012 R2及以上操作系统。
Linux:CentOS 7.6及以上版本、Ubuntu 18.04及以上版本或Alibaba Cloud Linux 2。
ECS实例处于运行中且云助手运行正常。如何查看云助手状态请参见查看云助手状态及异常状态处理。
已为ECS实例配置应用一致性快照相关的RAM角色以及自定义权限策略。具体操作,请参见创建RAM角色并授予给ECS实例。
创建应用一致性快照时,需要调用云助手访问ECS实例并执行命令,因此需要通过RAM角色授予云助手相应的权限。
RAM角色:自定义,例如AppSnapshotRoleName。
自定义权限策略:策略内容如下,表示在创建快照过程中具有查询快照、创建快照、设置标签和查询云盘信息等相关权限。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "ecs:DescribeSnapshot*", "ecs:CreateSnapshot*", "ecs:TagResources", "ecs:DescribeDisks" ], "Resource": [ "*" ], "Condition": {} } ] }
操作步骤
通过控制台
将准备好的prescript.sh和postscript.sh脚本提前上传到ECS实例。
具体操作,请参见使用Workbench上传或下载文件。
关于prescript.sh和postscript.sh脚本的更多介绍,请参见工作原理。
在顶部菜单栏处,选择目标ECS实例所在地域。
在快照一致性组页签中单击创建快照一致性组。
在创建快照对话框中,设置快照一致性组参数。
资源类型默认选中实例。
选择单台实例及实例中的ESSD类型云盘。
展开高级配置,设置应用一致性快照。
如果选中启用应用一致性快照并正确设置脚本,则创建应用一致性快照。
如果选中启用应用一致性快照但未设置脚本或未正确设置脚本,则创建文件系统一致性快照。
如果实例未安装云助手,选中启用应用一致性快照后,ECS实例将自动安装云助手插件。
您也可以选中文件系统IO暂停与恢复并设置超时时间。
如果启用文件系统IO暂停与恢复功能,则可以在创建快照过程中暂停文件系统的写入活动,从而避免因正在进行中的写操作导致的数据不一致问题。如果您设定的超时时长为16秒,表示如果在这个时间内暂停IO操作没有完成,则暂停IO操作失败,可能导致数据不一致问题。
其他更多参数说明,请参见操作步骤。
单击确认。
创建后会返回云助手命令执行ID,您可以根据命令执行ID查看创建结果。
单击云助手命令执行ID,在云助手页面查看执行结果。
如上图所示,ExitCode返回值为
0
,表示云助手上创建应用一致性快照执行成功,此时回显信息中会显示快照一致性组ID。如果ExitCode返回值不为
0
,请根据ExitCode错误码信息排查相关问题。更多信息,请参见错误码信息。查看创建的快照一致性组和快照信息。
在快照一致性组页签中找到已创建的快照一致性组,单击快照一致性组ID查看快照详情。
在快照信息区域,根据快照的标签信息,查看创建的快照是应用一致性快照还是文件系统一致性快照。
如果显示
APPConsistent:True
标签,表示创建的是应用一致性快照如果显示
FsConsistent: True
标签,表示创建的是文件系统一致性快照
在顶部菜单栏处,选择目标ECS实例所在地域。
在快照一致性组页签中单击创建快照一致性组。
在创建快照对话框中,设置快照一致性组参数。
资源类型默认选中实例。
选择单台实例及实例中的ESSD类型云盘。
展开高级配置,设置应用一致性快照。
如果同时选中启用应用一致性快照和是否默认包含Writer,则创建应用一致性快照。
如果只选中启用应用一致性快照,则创建文件系统一致性快照。
如果实例未安装云助手,选中启用应用一致性快照后,ECS实例将自动安装云助手插件。
其他更多参数说明,请参见操作步骤。
单击确认。
创建后会返回云助手命令执行ID。
单击云助手命令执行ID,在云助手页面查看执行结果。
如上图所示,ExitCode返回值为
0
,表示云助手上创建应用一致性快照执行成功,此时回显信息中会显示快照一致性组ID。如果ExitCode返回值不为
0
,请根据ExitCode错误码信息排查相关问题。更多信息,请参见错误码信息。查看创建的快照一致性组和快照信息。
在快照一致性组页签中找到已创建的快照一致性组,单击快照一致性组ID查看快照详情。
在快照信息区域,根据快照的标签信息,查看创建的快照是应用一致性快照还是文件系统一致性快照。
如果显示
APPConsistent:True
标签,表示创建的是应用一致性快照如果显示
FsConsistent: True
标签,表示创建的是文件系统一致性快照
通过API接口
调用API接口RunCommand为一台或多台ECS实例创建应用一致性快照。
您需要根据实际环境设置
RegionId
、Type
、CommandContent
和InstanceId
等参数。其中CommandContent
参数示例及说明如下:Linux实例Windows实例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\",-Description=\"LinuxApp\"
acs-plugin-manager --exec --plugin app-snapshot-plugin
:表示执行云助手插件app-snapshot-plugin
。--params=
:表示插件的配置参数,具体参数说明如下表所示。参数
类型
是否必传
描述
RamRoleName
String
是
ECS实例绑定的RAM角色。
EnableFsFreeze
Boolean
否
是否在创建快照前使用Linux的FsFreeze机制确保文件系统处于只读一致性。
默认为True。
TimeoutInSeconds
Integer
否
IO超时时间。
默认为30秒。
PreScriptPath
String
否
prescript.sh脚本路径(/tmp/prescript.sh)。prescript.sh脚本需要符合以下条件:
权限:仅root用户具有读、写、执行权限,即700权限。
内容:脚本内容需要根据应用自行定制。
Linux实例创建应用一致性快照时必须设置此参数。如果脚本设置错误(例如权限、保存路径或文件名设置错误等),最终创建的快照将是文件系统一致性快照。
PostScriptPath
String
否
postscript.sh脚本路径(/tmp/postscript.sh)。postscript.sh脚本需要符合以下条件:
权限:仅root用户具有读、写、执行权限,即700权限。
内容:脚本内容需要根据应用自行定制。
Linux实例创建应用一致性快照时必须设置此参数。如果脚本设置错误(例如权限、保存路径或文件名设置错误等),最终创建的快照将是文件系统一致性快照。
ExcludeDiskId
String
否
ECS实例中不需要创建快照的云盘。
Name
String
是
快照一致性组名称。
Description
String
否
快照一致性组描述信息。
acs-plugin-manager --exec --plugin app-snapshot-plugin-win --params=-RamRoleName=\"AppSnapshotRoleName\",-EnableWriters=true,-ExcludeDiskId=\"\",-Name=\"APPSnapshot-1\",-Description=\"AppSnapshot\"
acs-plugin-manager --exec --plugin app-snapshot-plugin-win
:表示执行云助手插件app-snapshot-plugin-win
。--params=
:表示插件的配置参数,具体参数说明如下表所示。参数
类型
是否必传
描述
RamRoleName
String
是
ECS实例绑定的RAM角色。
EnableWriters
Boolen
否
是否设置应用一致性快照。取值如下:
true:创建应用一致性快照
false:创建文件系统一致性快照
默认值为true。
ExcludeDiskId
String
否
ECS实例中不需要创建快照的云盘。
Name
String
是
快照一致性组名称。
Description
String
否
快照一致性组描述信息。
根据返回的
InvokeId
,调用API接口DescribeInvocationResults。查看应用一致性快照是否创建成功。
ExitCode
返回错误码信息取值为
0
表示快照创建成功。如果取值不为
0
,请根据错误码信息排查问题。更多信息,请参见错误码信息。
Output
为命令执行后的输出信息,如果创建成功,会包含如下快照一致性组ID等信息。[time=\"2025-03-04 16:09:25.8200239\"][message=\"Finish SnapshotGroup=ssg-2zefohc25d7n1grq**** Creation, TotalCost=3.8204978s, QueryCost=2.9307022s\"]\n[level=\"info\"][time=\"2025-03-04 16:09:25.8200239\"][message=\"Prepare to Thaw FileSystem or Applications\"]\n[requestor=\"\n\"]\n[level=\"info\"][time=\"2025-03-04 16:09:27.7133096\"][message=\"Thaw Write Request Done\"]\n[level=\"info\"][time=\"2025-03-04 16:09:28.0355042\"][message=\"Tag snapshots with AppConistent\"]\n[level=\"info\"][time=\"2025-03-04 16:09:28.0365941\"][message=\"Take AppConsistent snapshots successfully\"]
错误码信息
错误码(ExitCode) | 说明 |
错误码(ExitCode) | 说明 |
0 | 表示快照创建成功。 |
1 | 条件检查错误。可能错误如下:
|
2 |
|
3 | 可能错误如下:
|
4 | 创建快照一致性组失败。 |
5 | 快照一致性组状态错误。 |
6 | 创建快照一致性组超时。 |
7 | 快照一致性组内单个云盘快照的状态不符合预期。 |
8 | 为快照设置标签失败。 |
9 | 执行prescript.sh脚本失败。 |
10 | 执行postscript.sh脚本失败。 |
11 | 暂停I/O失败。 |
12 | 恢复I/O失败。 |
13 | ECS实例没有RAM角色授权。 |
14 | 快照个数超过限制。 |
15 | 快照状态错误。 |
16 | 前一个快照正在创建中,不能继续创建快照。 |
255 | 未知失败。 |
相关文档
您可以为MySQL数据库或SQL Server数据库创建应用一致性快照,请参见为MySQL创建应用一致性快照最佳实践(Linux)和为SQL Server创建应用一致性快照最佳实践(Windows)。
- 本页导读 (1)
- 背景信息
- 工作原理
- 使用限制
- 前提条件
- 操作步骤
- 通过控制台
- 通过API接口
- 错误码信息
- 相关文档