亚马逊AWS官方博客
如何使用Amazon EC2 Systems Manager自动创建数据一致的EBS快照(Part 2)
作者:王宇
上一期我们讨论了如何在不关机的前提下实现AWS上实例的数据一致性快照问题,传送门:《如何使用Amazon EC2 Systems Manager自动创建数据一致的EBS快照(Part 1)》
在本文的介绍中,我们将共同探索如何利用Amazon EC2 Systems Manager(SSM)和Microsoft VSS (Volume Shadow Copy Service)来创建数据一致的EBS快照。
SSM + VSS数据一致快照的原理
VSS (Volume Shadow Copy Service)是一个Windows操作系统内置的服务,用来协调与VSS兼容的应用程序(如SQL Server、Exchange Server等)的备份工作,如冻结或释放这些应用程序的I/O操作等。
VSS服务能够启动和监督副本拷贝的创建。“副本拷贝”是指一个逻辑卷在某一个时间点上的数据一致快照。比如:“C:”是一个逻辑卷,它与EBS快照不同。创建副本拷贝的步骤包括:
- 请求方向VSS发出创建副本拷贝的请求。
- VSS provider创建并维护副本拷贝。
- VSS写入器(writer)保证数据的一致性。写入器负责在VSS provider创建副本拷贝之前固化临时数据并冻结I/O操作,并在VSS provider完成创建后释放I/O操作。通常情况下,会为每一个与VSS兼容的应用程序分配一个独立的写入器(writer)。
我们可以使用Run Command在windows实例中运行一个PowerShell脚本:
首先创建了一个名为“ebsSnapshot.ps1”的PowerShell脚本文件,脚本中为实例的每一个EBS卷创建一个快照。
再创建第二个名为“ebsSnapshot.cmd”脚本文件,用来执行之前创建的PowerShell脚本。
第三个名为“scriptVss.txt”的文件包含了DiskShadow命令。DiskShadow是一个包含在Windows Server 2008及以上版本中的VSS工具。这个脚本在EBS上为每一个逻辑卷创建一个副本拷贝,再为这个EBS创建一个快照,最后删除副本拷贝来释放磁盘空间。
最终,在脚本模式中来运行DiskShadow命令。
这个脚本将保存在一个新的SSM Document中并关联到一个维护窗口中,在每天的午夜时间在每一台标签“consistentsnapshot”等于“windowsvss”的实例上运行。
在AWS console中快速实践
1. 使用AWS CloudFormation快速创建一组资源,包括:
a) VPC和互联网网关
b) VPC中创建一个子网和一个新的路由表,来实现互联网连接和AWS APIs
c) 创建一个IAM角色来赋予EC2实例相应的权限
d) 创建一个安全组,来允许来自internet的RDP访问,稍后将要通过远程登录到这个EC2实例中
e) 在子网中使用IAM角色创建和启动一个Windows实例,并分配好安全组
f) 创建一个包含上面例子中脚本的SSM document文件,来创建数据一致EBS快照
g) 创建另一个SSM document文件,其中的脚本来恢复逻辑卷中的数据,这些脚本将在下面的章节中详细说明
h) 创建一个能够生成Maintenance Windows的IAM role
2. 创建一个Maintenance Window
a) 在EC2 Console中选择:Systems Manager Shared Resources -> Maintenance Windows -> Create a Maintenance Window
b) Name:ConsistentSnapshots
c) Specify with:CRON/Rate expression
d) CRON/Rate expression:cron(0 0 * * ? *)
e) Duration:2 hours
f) Stop initiating tasks:0 hour
g) 选择Create maintenance window
3. 为Maintenance Window关联一组目标:
a) 在Maintenance Window列表中选择刚刚创建的维护窗口
b) 在Actions中选择Register targets
c) Owner information:WindowsVSS
d) Select targets by:Specifying tags
e) Tag Name:ConsistentSnapshot
f) Tag Value:WindowsVSS
g) 选择Register targets
4. 给Maintenance Window分配一个任务
a) 在Maintenance Window列表中选择刚刚创建的维护窗口
b) 在Actions中选择Register targets
c) 在Document中选择此前创建的用于创建EBS快照的SSM document文件名
d) 在Target by中选择刚刚创建的目标
e) 在Role中,选择在CloudFormation中创建的IAM Role
f) 在Execute on中,Targets:1,Stop after:1 errors
g) 选择Register task
运维窗口和一致性快照操作已经创建完毕,你可以在Maintenance Windows窗口中的History页面查看每一次任务的执行情况。
如何将逻辑卷恢复到数据一致状态
在本文上面的例子中,我们会注意到,在给EBS进行快照的脚本中,我们实际上是先使用DiskShadow进行了副本拷贝操作,这个操作中已经包含了对I/O操作的冻结和释放,在此之后再进行了EBS的快照操作。而在这两个操作之间的瞬间如果数据发生改变,那么EBS快照中的数据就可能不能保持数据一致状态。
解决这个问题有两个方向,其一是自己创建一个VSS provider来创建EBS快照,而不是使用DiskShadow采用的windows内置的VSS provider来执行,在自己创建的VSS provider中做到先创建EBS快照再释放I/O操作,来保持数据一致性。
本文会介绍另一个解决方向,就是检查在EBS快照中的每一个逻辑卷数据,如果发现数据不一致的情况,就将其恢复到此前的副本拷贝(副本拷贝中的数据被VSS writer保持了数据一致性)。
步骤如下:
1. 在EC2 console中,选择Instances
2. 搜索获得EBS进行了快照的实例,注意这个实例所在的AZ
3. 选择Snapshots
4. 选择最新的快照,再选择Actions,Create Volume
5. 选择与此前相同的AZ,然后选择Create, Volumes
6. 选择刚刚创建的Volume,然后选择Actions, Attach Volume
7. 在Instances中选择进行了EBS快照的实例,然后选择Attach
8. 选择Run Command, Run a command
9. 在Command document中选择恢复EBS的脚本Document,在Target中选择这个Windows实例,然后选择Run
恢复EBS的脚本如下:
通过比较,将数据不一致的逻辑卷恢复到了数据一致状态,这个EBS就回到了数据一致的状态。
本次的介绍就到这里。如对AWS混合云架构解决方案感兴趣,请联系我们:yuwangcn@amazon.com
作者介绍:
王宇,AWS企业容灾解决方案业务拓展经理,目前负责AWS中国区的混合云、容灾和DevOps产品和解决方案。曾服务于VMware等传统私有云厂商,熟悉传统IT架构和私有云、混合云、公有云的解决方案融合。