上海-北京间通过Azure Storage的RA-GRS类型的存储账户进行快速复制
Azure的Blob存储分成多种类型,目前主要有:

其中RA-GRS可以在上海-北京两个数据中心间同步数据。并且,在第二个数据中心可以只读的方式读取这个存储账户中的Blob内容。
虽然GRS采用的是准实时同步,不是实时同步,但对很多需要快速恢复虚拟机、文件的情况已经足够使用。
本文将介绍,如何采用RA-GRS在第二个数据中心可以读的特性,在第二个数据中心快速的复制磁盘文件的功能。
下面的Powershell脚本将用户输入的VM信息获取OSDisk和DataDisk的信息,把这些Disk复制到用户指定的类型是RA-GRS的存储账户中,并将这些Disk在第二个数据中心复制到用户指定的目标存储账户中。具体步骤如下:

第一步,把VM的Disk复制到相同存储账户的临时Container:temp中。这一步的作用是将正在读写的Disk变成一个普通的VHD文件。
第二步,把LRS的temp中的VHD文件复制到RA-GRS的存储账户的temp中。这一步比较耗时,主要看Disk的实际使用量。
第三步,等待数分钟,Azure平台会自动将VHD文件复制到另外一个数据中心的Secondary存储账户中。
第四步,把VHD文件复制到另外一个数据中心的目标存储账户中,并生成Disk。后续可以使用这些Disk创建VM。
具体的PowerShell脚本如下:
function Copy-GRSVM {
param(
#The GRS_RA type storage account
[Parameter(Mandatory=$true)]
[String]$GRS_StorageAccountName,
#The Dest Storage account, in another region
[Parameter(Mandatory=$true)]
[String]$Dst_StorageAccountName,
#VM cloud service name
[Parameter(Mandatory=$true)]
[String]$VM_Service,
#VM Name
[Parameter(Mandatory=$true)]
[String]$VM_Name
)
#Get the VM, using the service name and vm name
$vm = get-azurevm -ServiceName $VM_Service -Name $VM_Name
#Get the VM OS type
$ostype = $vm.VM.OSVirtualHardDisk.OS
#Copy OS Disk
$oslink = $vm.vm.OSVirtualHardDisk.MediaLink.OriginalString
Copy-diskfromlink -GRS_StorageAccountName $GRS_StorageAccountName -Dst_StorageAccountName $Dst_StorageAccountName -link $oslink -isOSDisk $true -OSType $ostype
#copy Data Disk
$datadisks = $vm.vm.DataVirtualHardDisks
foreach ($datadisk in $datadisks)
{
$datadisklink = $datadisk.MediaLink.OriginalString
Copy-diskfromlink -GRS_StorageAccountName $GRS_StorageAccountName -Dst_StorageAccountName $Dst_StorageAccountName -link $datadisklink -isOSDisk $false -OSType $ostype
}
}
function Copy-diskfromlink {
param(
#The GRS_RA type storage account
[Parameter(Mandatory=$true)]
[String]$GRS_StorageAccountName,
#The Dest Storage account, in another region
[Parameter(Mandatory=$true)]
[String]$Dst_StorageAccountName,
#VM disk link
[Parameter(Mandatory=$true)]
[String]$link,
#VM OS type
[Parameter(Mandatory=$true)]
[String]$OSType,
#The disk is OS
[Parameter(Mandatory=$true)]
[boolean]$isOSDisk
)
$diskname = $link.Split("/")[-1]
$vmdiskctn = $link.Split("/")[-2]
#Get the VM storage account's name, keys and context.
$VM_StorageAccountName = $link.Split("/")[-3].Split(".")[0]
$vmsa = Get-AzureStorageAccount -StorageAccountName $VM_StorageAccountName
$vmsakey = Get-AzureStorageKey -StorageAccountName $vmsa.Label
$vmsactx = New-AzureStorageContext -StorageAccountName $vmsa.Label -StorageAccountKey $vmsakey.Primary
#Get the GRS_RA storage account's name, keys and context
$grsa = Get-AzureStorageAccount -StorageAccountName $GRS_StorageAccountName
$grsakey = Get-AzureStorageKey -StorageAccountName $grsa.Label
$grsactx = New-AzureStorageContext -StorageAccountName $grsa.Label -StorageAccountKey $grsakey.Primary
$grsactn = Get-AzureStorageContainer -Context $grsactx | Where-Object {$_.name -match "temp"}
#Define the connection string, which is the GRS_RA storage account secondary region endpoint
$Connect_str="DefaultEndpointsProtocol=https;AccountName=" + $grsa.StorageAccountName + ";AccountKey=" + $grsakey.Primary + ";BlobEndpoint=http://" + $grsa.StorageAccountName + "-secondary.blob.core.chinacloudapi.cn;"
$grdstCtx = New-AzureStorageContext -ConnectionString $Connect_str
#Get the dest storage account's name, keys and context
$dstsa = Get-AzureStorageAccount -StorageAccountName $Dst_StorageAccountName
$dstsakey = Get-AzureStorageKey -StorageAccountName $dstsa.StorageAccountName
$dstsactx = New-AzureStorageContext -StorageAccountName $dstsa.StorageAccountName -StorageAccountKey $dstsakey.Primary
#In VM Storage account, if the temp container is not presented, create it.
$vmsactn = Get-AzureStorageContainer -Context $vmsactx | Where-Object {$_.name -match "temp"}
if ($vmsactn)
{write-host "temp container is already created!"}
else
{New-AzureStorageContainer -Name temp -Context $vmsactx}
#If the GRS_RA storage account type is not GRS_RA, change it to that.
if ($grsa.AccountType -eq "Standard_RAGRS")
{write-host "the storage account is GRS_RA"}
else
{Set-AzureStorageAccount -StorageAccountName $grsa.Label -Type Standard_RAGRS}
#In GRS_RA storage account, if the temp container is not presented, create it.
if ($grsactn)
{write-host "temp container is already created!"}
else
{New-AzureStorageContainer -Name temp -Context $grsactx}
#Copy VM OS disk to the same Storage account's temp conainter. This copy will be very fast. And is the only way to copy a starting VM's disk to a block blob file.
Start-AzureStorageBlobCopy -SrcBlob $diskname -SrcContainer $vmdiskctn -Context $vmsactx -DestContainer temp -DestBlob $diskname -DestContext $vmsactx -Force
#Monitor the copy status, wait until the copy success.
$i=0
while($true)
{
$i=$i+1
write-host "Copying vhd from VM Storage Account vhd container to temp container, elapsing"$i"0 seconds"
$cpstatus = Get-AzureStorageBlobCopyState -Container temp -Context $vmsactx -Blob $diskname
$percent=$cpstatus.BytesCopied/$cpstatus.TotalBytes * 100
write-host "Already copying" $percent "%"
if($cpstatus.Status -eq "Pending")
{Start-Sleep -s 10}
else
{
Write-Host "copy ok"
break}
}
#Copy the disk vhd file, from the VM storage temp container to the GRS_RA storage account temp container. This copy will spend lots of time.
Start-AzureStorageBlobCopy -SrcBlob $diskname -SrcContainer temp -Context $vmsactx -DestContainer temp -DestBlob $diskname -DestContext $grsactx -Force
#Monitor the copy status, wait until the copy success.
$i=0
while($true)
{
$i=$i+1
write-host "Copying vhd from VM Storage Account temp container to GRS Storage account temp container, elapsing"$i"0 seconds"
$cpstatus = Get-AzureStorageBlobCopyState -Container temp -Context $grsactx -Blob $diskname
$percent=$cpstatus.BytesCopied/$cpstatus.TotalBytes * 100
write-host "Already copying" $percent "%"
if($cpstatus.Status -eq "Pending")
{Start-Sleep -s 10}
else
{
Write-Host "copy ok"
break}
}
#Because the GRS_RA is best effort way to sync the data between two regions, wait 5 minutes to ensure the data is sync.
write-host "wait 5 minutes"
Start-Sleep -Seconds 300
#Check the disk is presented in the secondary region's GRS_RA storage account's temp folder.
while($true)
{
write-host "Check whether the disk is in the GRS storage account seconday site"
$grdstblob = Get-AzureStorageBlob -Container temp -Blob $diskname -Context $grdstCtx
if($grdstblob)
{ write-host "disk ok"
break}
else
{
Start-Sleep -s 10
}
}
#Copy the disk vhd file from the GRS_RA seconday region temp container to the dest storage account's vhds container
Start-AzureStorageBlobCopy -SrcContainer temp -SrcBlob $diskname -Context $grdstCtx -DestContainer vhds -DestContext $dstsactx -DestBlob $diskname
#Monitor the copy status, wait until the copy success.
$i=0
while($true)
{
$i=$i+1
write-host "Copying vhd from GRS Account secondary site temp container to destination Storage Account temp container, elapsing"$i"0 seconds"
$cpstatus = Get-AzureStorageBlobCopyState -Container vhds -Context $dstsactx -Blob $diskname
$percent=$cpstatus.BytesCopied/$cpstatus.TotalBytes * 100
write-host "Already copying" $percent "%"
if($cpstatus.Status -eq "Pending")
{Start-Sleep -s 10}
else
{
Write-Host "copy ok"
break}
}
#remove the temp vhd file in 2 temp containers
write-host "Removing the Temp vhd file"
Remove-AzureStorageBlob -Context $vmsactx -Container temp -Blob $diskname
Remove-AzureStorageBlob -Context $grsactx -Container temp -Blob $diskname
#Create the new disk from the vhd file
write-host "create disk from vhd file"
$dst_disk_link = "https://" + $Dst_StorageAccountName + ".blob.core.chinacloudapi.cn/vhds/" +$diskname
if($isOSDisk)
{
Add-AzureDisk -DiskName $diskname -MediaLocation $dst_disk_link -OS $OSType
}
else
{
Add-AzureDisk -DiskName $diskname -MediaLocation $dst_disk_link
}
}
Copy-GRSVM -GRS_StorageAccountName hweast -Dst_StorageAccountName hwnorth -VM_Service hwcentos65 -VM_Name hwcentos65-03
上海-北京间通过Azure Storage的RA-GRS类型的存储账户进行快速复制的更多相关文章
- Microsoft Azure Storage Exployer使用指南
概述 Microsoft Azure Storage Exployer 是微软官方推荐的一款管理Azure Storage 客户端工具,客户使用完全免费.支持Windows.Mac和Linux.用户使 ...
- Azure Storage架构介绍
Windows Azure Storage由三个重要部分或者说三种存储数据服务组成,它们是:Windows Azure Blob.Windows Azure Table和Windows Azure Q ...
- Azure Terraform(四)状态文件存储
一,引言 我们都知道在执行部署计划之后,当前目录中就产生了名叫 "" 的 Terraform 的状态文件,该文件中记录了已部署资源的状态.默认情况下,在执行部署计划后,Terraf ...
- 关于Azure存储账户中存储虚拟机VHD文件的注意事项
Joy Qiao from MSFT Thu, Mar 12 2015 3:16 PM 我们在使用Azure时经常都会在Azure存储账户中放一些文件,包括Azure虚机的VHD文件也都是放在存储 ...
- Windows Azure Storage (21) 使用AzCopy工具,加快Azure Storage传输速度
<Windows Azure Platform 系列文章目录> Update 2016-09-28 想要在Azure云端,使用AzCopy工具,从Azure China 上海数据中心存储账 ...
- Windows Azure Storage (18) 使用HTML5 Portal的Azure CDN服务
<Windows Azure Platform 系列文章目录> Update:2015-04-15 如果读者使用的是国内由世纪互联运维的Azure China服务,请参考笔者的文档:Azu ...
- Windows Azure Storage (24) 启用Azure Blob日志
<Windows Azure Platform 系列文章目录> 之前有一个业务需求,客户想知道Azure Storage是否有日志功能,可以检查某个Azure Blob文件在某个时间点被删 ...
- 【Azure】用“Azure Storage Exlporer”进行磁盘拷贝
zure Storage Explorer工具的下载 Azure 存储客户端工具 https://docs.azure.cn/zh-cn/storage/storage-explorers Azure ...
- Azure Storage 系列(一)入门简介
一,引言 今天作为新的Azure 资源介绍的开篇,我们来学习一个新的服务,Azure Storage.众所周知,我们实际在开发过程中,会需要存储一些比如说日志,图片,等等,各种类型的数据.比如说存储图 ...
随机推荐
- 【译】理解Spring MVC Model Attribute 和 Session Attribute
作为一名 Java Web 应用开发者,你已经快速学习了 request(HttpServletRequest)和 session(HttpSession)作用域.在设计和构建 Java Web 应用 ...
- SUBMIT 用法
[转自http://lz357502668.blog.163.com/blog/static/16496743201241195817597/] 1.最普通的用法 *Code used to exec ...
- JITWatch工具
JITWatch,执行程序时监测Java HotSpot JIT编译器如何运作的工具,有助于做JVM的性能优化 wiki: https://github.com/AdoptOpenJDK/jitwat ...
- 【WEB】高并发Web服务的演变-节约系统内存和CPU
目前主流浏览器通常可以存在2-6个并发. 连接和请求,占据了服务器的大量CPU和内存等资源.在资源数目超过100+的网站页面中,使用更多的下载连接,非常有必要. 缓解“高并发”的压力的手段. 一. W ...
- 4G U盘版64位bitcoin专用挖矿操作系统
这个操作系统是基于linux的操作系统,采用的ubuntu平台打造,所有的软件都已经安装齐备,是一个bitcoin专用挖矿操作系统,是64位的,对于显卡数量基本上没有限制,前提是你的主板支持足够多的显 ...
- NVM安装配置
http://www.kancloud.cn/summer/nodejs-install/71975 配置源 http://www.cnblogs.com/kaiye/p/4937191.html 安 ...
- 3.08课·········switch case及if else嵌套(日期格式)
switch case switch (n) { : break; : break; . . . case n: break; } 1.switch case必须与break一同使用,每一个case后 ...
- DevExpress实用心得:XtraGridControl动态添加右键菜
在使用GridControl的时候经常需要添加右键菜单. 一般的做法是自己创建菜单项,然后注册GridView的Mouse-Click事件,然后Show出定义好的菜单. 但是涉及到一些单击事件会收到编 ...
- 四分位数及matlab实现
四分位数(quantile),解释及调用形式如下. quantile(x,y,z)的三个参数的说明如下:x表示要求的矩阵或者向量:y的取值为表示要求的分位数,如四分之一中位数0.25,四分之三中位数0 ...
- php设计模式课程---2、为什么会用到简单工厂设计模式
php设计模式课程---2.为什么会用到简单工厂设计模式 一.总结 一句话总结: 比如调用数据库的语句,如果调用的数据库名字改了,或者调用的数据库类型改了(比如从Mysql用到了Mysqli),那么要 ...