• Azure blob Storage Snapshot


    用户虚拟机硬盘的备份是客户在部署云应用中是一个非常重要的部分。

    目前有多种平台的备份方法:

    1. 捕获镜像:可以采用Capture的方式(powershell命令为Save-AzureVMImage)捕获虚拟机系统盘和数据盘。但这种方式占用空间太大,而且Capture的Image数量也是有数量限制的。所以不是优选的方案。
    2. 复制硬盘vhd文件:通过AzCopy的方式,把VM的vhd复制到部分的blob的container中。这种方式也是占用空间大。不适合大规模的备份,只适合灾备时的使用。
    3. 对Blob的vhd文件snapshot:通过blob snapshot功能对VM的vhd文件进行blob snapshot。这种方式节省空间,操作方便,是虚拟机进行备份的非常好的一种方式。

    Azure的Snapshot是按照实际使用空间进行计费的。由于Snapshot遵循"写时复制"的方式,如果Base Blob的内容不发生变化,Snapshot里是没有内容的,只有Base Blob发生变化时,Snapshot会把Base Blob中老的内容复制过来。

    具体的计费方式如下:

    情况一: 如果Snapshot的内容和Base Blob的内容相同,收费只收Base Blob的费用(3个单元)。

    情况二:如果Base Blob中的CCC内容发生更新,Snapshot会复制Base Blob中老的CCC部分。收费将收4个单元

    情况三:如果Base Blob中的CCC内容删除,增加了DDD,Snapshot中会复制Base Blob中老的CCC部分。收费将收4个单元

    情况四:多个blob块出现更改,多个snapshot,按照实际的用量进行计费。图中的计费单元为8个

    具体的blob snapshot的实现有三个部分:1.创建;2.删除超过xx天的snapshot;3.恢复snapshot。本文将介绍这三个功能的脚本:

    1. 创建Snapshot:

    $storageaccounts = Get-AzureStorageAccount
    $subs = Get-AzureSubscription -Current
    foreach ($storageaccount in $storageaccounts)

    {
      Set-AzureSubscription -SubscriptionName $subs.SubscriptionName -CurrentStorageAccountName $storageaccount.StorageAccountName
      $containers = Get-AzureStorageContainer | Where-Object {$_.name -Match "vhd"}
      foreach($container in $containers)
      {
        $pageblobs = Get-AzureStorageBlob -Container $container.Name | Where-Object {$_.Name -match ".vhd"}

        foreach ($blob in $pageblobs)
        {

          if(!$blob.ICloudBlob.IsSnapshot)
          {
            $blob.ICloudBlob.CreateSnapshot()

          }

        }
      }

    }

          2. 删除超过14天的Snapshot

    $storageaccounts = Get-AzureStorageAccount

    foreach($storageaccount in $storageaccounts)

    {

      $pageblobs = Get-AzureStorageBlob -Container vhds | Where-Object {$_.Name -match ".vhd"}

      $now = Get-Date

      foreach($pageblob in $pageblobs)

      {

        $diff = [datetime]::FromBinary($now.Ticks-$pageblob.SnapshotTime.Ticks)

        if($pageblob.ICloudBlob.IsSnapshot)

        {

          if ( $diff.dayofyear -ge 14)

          {

            write-host "the snapshot is "$diff.dayofyear "days"

            write-host "delete"

            $pageblob.ICloudBlob.Delete()

          }else

          {

            write-host "the snapshot is "$diff.dayofyear "days"

            Write-Host "not delete snapshot"

          }

        }else

        {

          write-host "is not snapshot, do not delete"

        }

      }

    }

    3.恢复7天前的Snapshot

    $StorageAccount = "XXXX"

    $StorageKey = "XXX=="

    $Ctr = New-AzureStorageContext -StorageAccountName $StorageAccount -StorageAccountKey $StorageKey

    $SrcContainer = "container1"

    $DestContainer = "container2"

    $blobname ="xxx.vhd"

    $Date=date

    $DestBlob = "R"+$Date.DayOfYear+$blobname

    $DayOfYear = 7

    $times = Get-AzureStorageBlob -Container $SrcContainer | Where-Object {$_.Name -match "xxx.vhd" } | Select -ExpandProperty SnapshotTime

    foreach($time in $times)

    {

      if ($time.DayOfYear -eq $DayOfYear)

      {

        $snaptime = $time

      }else

      {

        continue

      }

    }

    $srcsnap = Get-AzureStorageBlob -Container $SrcContainer | Where-Object {$_.SnapshotTime -eq $snaptime}

    Start-AzureStorageBlobCopy -CloudBlob $srcsnap.ICloudBlob -DestContainer $DestContainer -DestBlob $DestBlob

    $blob.ICloudBlob.CreateSnapshot()

  • 相关阅读:
    visual studio项目多级引用不拷贝dll的问题
    ef6 code first,对已有数据库如何执行迁移
    wsl 修改默认安装路径
    Windows docker镜像文件无法删除
    Docker镜像下载很慢,各种加速无效
    activemq整合springboot使用(个人微信小程序用)
    angular入门一之环境安装及项目创建
    jquery中attr()和prop()的区别
    IntelliJ IDEA部署web项目,Tomcat没有出现Artifacts
    IntelliJ IDEA:创建Java Web工程
  • 原文地址:https://www.cnblogs.com/hengwei/p/5148471.html
Copyright © 2020-2023  润新知