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

最新文章

  1. latex均方极限符号l.i.m在lyx下的输入方法
  2. iOS开发-UI 从入门到精通(五)
  3. hadoop+javaWeb的开发中遇到包冲突问题(java.lang.VerifyError)
  4. 软件测试--测试Demo
  5. Linux下svn命令详解
  6. mysql 外键(FOREIGN KEY)
  7. 绕过 <?PHP exit('Access Denied'); ?> 限制
  8. Word 2013双引号的BUG
  9. [Angular2 Form] Display Validation and Error Messaging in Angular 2
  10. 登陆用户怎样获取验证码和保存用户到cookie中
  11. 转:关于http server - 来自百度知道,留存备读
  12. Linux高性能server编程——信号及应用
  13. JDK安装及Tomcat安装
  14. slice 与 splice 的区别
  15. [lua][openresty]代码覆盖率检测的解决方式
  16. ArcGis恢复初始设置(默认设置、出厂设置)的方法
  17. C# - Visual Studio简明操作
  18. python中类方法,实例方法,静态方法的作用和区别
  19. [Kali_Debian] 清除无用的库文件(清理系统,洁癖专用)-布布扣-bubuko.com - Google Chrome
  20. hp电脑重装win7 64位 后 所有软件都装不上问题【转】

热门文章

  1. 阿里云+LAMP环境配置
  2. python基础-第六篇-6.4模块混战
  3. 感知器(Perception)
  4. Spring注解式与配置文件式
  5. MySQL一些常见查询方式
  6. print函数详解及python打印99乘法表的不同方法
  7. 谷歌浏览器chrome上的firepath ----chropath
  8. butterknif
  9. MVC ViewBag不能使用在工程文件中添加引用
  10. VHDL学习笔记——数字系统设计