• 上海-北京间通过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

     

     

  • 相关阅读:
    如何仅仅修改每一页的页眉
    resize
    Linux搭建深度学习环境
    Image.open、cv2.imread
    any、all
    cookie
    any、all
    库文件
    出来混总要还的,要提醒自己提高核心竞争力
    “行百里者半九十”(现在才逐渐真正理解这些道理)
  • 原文地址:https://www.cnblogs.com/hengwei/p/5385013.html
Copyright © 2020-2023  润新知