写点什么

如何使用 Amazon EC2 Systems Manager 自动创建数据一致的 EBS 快照

  • 2019-11-07
  • 本文字数:4012 字

    阅读完需:约 13 分钟

如何使用Amazon EC2 Systems Manager自动创建数据一致的EBS快照

作者:王宇


上一期我们讨论了如何在不关机的前提下实现 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 脚本:


Java


$EbsSnapshotPsFileName = "C:/tmp/ebsSnapshot.ps1"
$EbsSnapshotPs = New-Item -Type File $EbsSnapshotPsFileName -Force
Add-Content $EbsSnapshotPs '$InstanceID = Invoke-RestMethod -Uri http://169.254.169.254/latest/meta-data/instance-id'
Add-Content $EbsSnapshotPs '$AZ = Invoke-RestMethod -Uri http://169.254.169.254/latest/meta-data/placement/availability-zone'
Add-Content $EbsSnapshotPs '$Region = $AZ.Substring(0, $AZ.Length-1)'
Add-Content $EbsSnapshotPs '$Volumes = ((Get-EC2InstanceAttribute -Region $Region -Instance "$InstanceId" -Attribute blockDeviceMapping).BlockDeviceMappings.Ebs |? {$_.Status -eq "attached"}).VolumeId'
Add-Content $EbsSnapshotPs '$Volumes | New-EC2Snapshot -Region $Region -Description " Consistent snapshot of a Windows instance with VSS" -Force'
Add-Content $EbsSnapshotPs 'Exit $LastExitCode'
复制代码


首先创建了一个名为“ebsSnapshot.ps1”的 PowerShell 脚本文件,脚本中为实例的每一个 EBS 卷创建一个快照。


Java


$EbsSnapshotCmdFileName = "C:/tmp/ebsSnapshot.cmd"
$EbsSnapshotCmd = New-Item -Type File $EbsSnapshotCmdFileName -Force
Add-Content $EbsSnapshotCmd 'powershell.exe -ExecutionPolicy Bypass -file $EbsSnapshotPsFileName'
Add-Content $EbsSnapshotCmd 'exit $?'
复制代码


再创建第二个名为“ebsSnapshot.cmd”脚本文件,用来执行之前创建的 PowerShell 脚本。


Java


$VssScriptFileName = "C:/tmp/scriptVss.txt"
$VssScript = New-Item -Type File $VssScriptFileName -Force
Add-Content $VssScript 'reset'
Add-Content $VssScript 'set context persistent'
Add-Content $VssScript 'set option differential'
Add-Content $VssScript 'begin backup'
$Drives = Get-WmiObject -Class Win32_LogicalDisk |? {$_.VolumeName -notmatch "Temporary" -and $_.DriveType -eq "3"} | Select-Object DeviceID
$Drives | ForEach-Object { Add-Content $VssScript $('add volume ' + $_.DeviceID + ' alias Volume' + $_.DeviceID.Substring(0, 1)) }
Add-Content $VssScript 'create'
Add-Content $VssScript "exec $EbsSnapshotCmdFileName"
Add-Content $VssScript 'end backup'
$Drives | ForEach-Object { Add-Content $VssScript $('delete shadows id %Volume' + $_.DeviceID.Substring(0, 1) + '%') }
Add-Content $VssScript 'exit'
复制代码


第三个名为“scriptVss.txt”的文件包含了 DiskShadow 命令。DiskShadow 是一个包含在 Windows Server 2008 及以上版本中的 VSS 工具。这个脚本在 EBS 上为每一个逻辑卷创建一个副本拷贝,再为这个 EBS 创建一个快照,最后删除副本拷贝来释放磁盘空间。


Java


diskshadow.exe /s $VssScriptFileNameExit $LastExitCode
复制代码


最终,在脚本模式中来运行 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


  1. 创建一个 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


  1. 为 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


  1. 给 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 的脚本如下:


Java


$OfflineDisks = (Get-Disk |? {$_.OperationalStatus -eq "Offline"})
foreach ($OfflineDisk in $OfflineDisks) {
Set-Disk -Number $OfflineDisk.Number -IsOffline $False
Set-Disk -Number $OfflineDisk.Number -IsReadonly $False
Write-Host "Disk " $OfflineDisk.Signature " is now online"
}
$ShadowCopyIds = (Get-CimInstance Win32_ShadowCopy).Id
Write-Host "Number of shadow copies found: " $ShadowCopyIds.Count
foreach ($ShadowCopyId in $ShadowCopyIds) {
"revert " + $ShadowCopyId | diskshadow
}
foreach ($OfflineDisk in $OfflineDisks) {
$CurrentSignature = (Get-Disk -Number $OfflineDisk.Number).Signature
if ($OfflineDisk.Signature -eq $CurrentSignature) {
Set-Disk -Number $OfflineDisk.Number -IsReadonly $True
Set-Disk -Number $OfflineDisk.Number -IsOffline $True
Write-Host "Disk " $OfflineDisk.Number " is now offline"
}
else {
Set-Disk -Number $OfflineDisk.Number -Signature $OfflineDisk.Signature
Write-Host "Reverting to the initial disk signature: " $OfflineDisk.Signature
}
}
复制代码


通过比较,将数据不一致的逻辑卷恢复到了数据一致状态,这个 EBS 就回到了数据一致的状态。


本次的介绍就到这里。如对 AWS 混合云架构解决方案感兴趣,请联系我们:yuwangcn@amazon.com


作者介绍:


王宇,AWS 企业容灾解决方案业务拓展经理,目前负责 AWS 中国区的混合云、容灾和 DevOps 产品和解决方案。曾服务于 VMware 等传统私有云厂商,熟悉传统 IT 架构和私有云、混合云、公有云的解决方案融合。


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/how-to-use-amazon-ec2-systems-manager-to-automatically-create-consistent-ebs-snapshots-of-datapart-2/


2019-11-07 08:00712

评论

发布
暂无评论
发现更多内容

冗余是什么意思?与双机热备有什么区别?

行云管家

高可用 冗余 双机热备

线上网络丢包引起的接口响应时间过慢,快速排查案例

KINDLING

Java 运维 网络 丢包 eBPF&Linux

实战分享 | 金融数据采集报送平台实践

葡萄城技术团队

NFTScan 正式上线 Fantom 网络 NFTScan 浏览器和 NFT API 数据服务

NFT Research

NFT 数据基础设施

SparK 用稀疏掩码为卷积设计 Bert 预训练

Zilliz

计算机视觉

R2M分布式锁原理及实践

京东科技开发者

redis 框架解析 企业号 2 月 PK 榜 r2m 分布式锁原理

开心档-软件开发入门之MongoDB 覆盖索引查询

雪奈椰子

mongodb Ppython 操作mongodb库 开心档

CompletableFuture实现异步转同步

FunTester

sun4.0泰山众筹模式项目系统开发技术讲解放哪(Demo)

I8O28578624

简单概述Serverless

天翼云开发者社区

谈谈我工作中的23个设计模式

阿里巴巴中间件

阿里云 云原生

MySQL中的distinct和group by哪个效率更高?

Steven

10大知识管理软件厂商有对比

爱吃小舅的鱼

项目管理 知识管理软件

行云洞见|为何行业权威都预测“云原生IDE 将成为常态”?

行云创新

ide 云原生 云端IDE Cloud IDE TitanIDE

基于GIS+WebGL智慧消防3D可视化云控系统

2D3D前端可视化开发

智慧消防 消防物联网云平台 消防三维可视化 智慧消防系统 消防云控平台

聊聊Docker镜像

天翼云开发者社区

Docker 镜像

re:Invent 开发者最喜爱产品票选榜单出炉!快来探索高光产品~

亚马逊云科技 (Amazon Web Services)

Studio One2023永久和谐版水果编曲工具使用教程

茶色酒

Studio One 5 Studio One2023

如何让OpenHarmony编译速度“狂飙”

离北况归

OpenHarmony

零基础自学网络安全/网络渗透攻防路线学习方法【建议收藏】

网络安全学海

黑客 网络安全 安全 信息安全 渗透测试

如何通过jstat命令进行查看堆内存使用情况

华为云开发者联盟

后端 开发 华为云 企业号 2 月 PK 榜 华为云开发者联盟

理论+实践,教你如何使用Nginx实现限流

华为云开发者联盟

后端 开发 华为云 企业号 2 月 PK 榜 华为云开发者联盟

如何用Apipost校验响应结果

爱研究代码的极客人

APi设计 JSON Schema apipost

工业生产环境下,时序数据库 TDengine 如何打造全面有效的数字化监控?

TDengine

数据库 tdengine 时序数据库

LeaRun快速开发平台:自由搭建个性化门户

力软低代码开发平台

开心档-软件开发入门之MongoDB 创建集合

雪奈椰子

mongodb 开心档

9种跨域方式实现原理

华为云开发者联盟

开发 华为云 企业号 2 月 PK 榜 华为云开发者联盟

OpenHarmony标准系统内核学习【2】CPU轻量级隔离特性

离北况归

OpenHarmony

带你读论文丨S&P21 Survivalism: Living-Off-The-Land 经典离地攻击

华为云开发者联盟

人工智能 华为云 论文 企业号 2 月 PK 榜 华为云开发者联盟

单线程架构的Redis如此之快的 4 个原因

JAVA旭阳

redis 缓存

使用Jira盗版会存在的6大风险

爱吃小舅的鱼

项目管理 软件开发 软件管理

如何使用Amazon EC2 Systems Manager自动创建数据一致的EBS快照_语言 & 开发_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章