备份Azure Blob存储内容的最佳方法是什么

时间:2012-07-19 13:24:07

标签: azure backup azure-storage azure-storage-blobs

我知道Azure存储实体(blob,表和队列)具有内置的弹性,这意味着它们被复制到同一数据中心的3个不同服务器。最重要的是,它们也可以被复制到物理上位于不同地理区域的不同数据中心。出于所有实际目的,在这种情况下丢失数据的可能性接近于零。

然而,如果一个草率的开发人员(或受酒精影响的开发人员))通过Azure门户或Azure存储资源管理器工具意外删除了存储帐户,会发生什么?最糟糕的是,如果黑客获取您的帐户并清除存储会怎么样?有没有办法检索已删除blob的千兆字节或是这样吗?不知何故,我认为Azure基础设施必须提供一个优雅的解决方案,但我找不到任何文档。

我能想到的唯一解决方案是编写自己的流程(工作者角色),定期将我的整个存储备份到不同的订阅/帐户,从而大大增加了存储和交易成本。 有什么想法吗?

此致

阿尔奇尔

6 个答案:

答案 0 :(得分:24)

根据您要备份数据的位置,有两种选择:

  1. 在本地备份数据 - 如果您希望在基础架构中本地备份数据,则可以: 一个。使用Storage Client Library或使用REST API或编写自己的应用程序 湾使用第三方工具,如Cerebrata Azure Management Cmdlets(披露:我为Cerebrata工作)。

  2. 备份云中的数据 - 最近,Windows Azure存储团队宣布了异步复制Blob功能,该功能基本上允许您将数据从一个存储帐户复制到另一个存储帐户,而无需在本地下载数据。这里的问题是您的目标存储帐户应该在2012年6月7日之后创建。您可以在Windows Azure博客上阅读有关此功能的更多信息:http://blogs.msdn.com/b/windowsazurestorage/archive/2012/06/12/introducing-asynchronous-cross-account-copy-blob.aspx

  3. 希望这有帮助。

答案 1 :(得分:4)

接受的答案很好,但我花了几个小时来解读所有内容。

我已将我现在用于生产的解决方案整理在一起。我通过Backup()公开方法Web Api,然后每天(午夜)由Azure WebJob调用。

请注意,我已采用原始源代码并对其进行了修改:

  • 它没有更新,所以我更改了几个方法名称
  • 添加了重试复制操作保护(对同一个blob尝试4次后失败)
  • 添加了一些日志记录 - 你应该用自己的日志进行交换。
  • 在两个存储帐户(复制容器和blob)之间进行备份
  • 添加了清除 - 它摆脱了不需要的旧容器(保留了16天的数据)。你可以随时禁用它,因为空间很便宜。

可以从以下网址找到来源:https://github.com/ChrisEelmaa/StackOverflow/blob/master/AzureStorageAccountBackup.cs

这就是我在控制器中使用它的方法(注意你的控制器只能由azure webjob调用 - 你可以检查标题中的凭据):

[Route("backup")]
[HttpPost]
public async Task<IHttpActionResult> Backup()
{
    try
    {
        await _blobService.Backup();
        return Ok();
    }
    catch (Exception e)
    {
        _loggerService.Error("Failed to backup blobs " + e);
        return InternalServerError(new Exception("Failed to back up blobs!"));
    }
}

注意:我想将此代码添加为帖子的一部分,但是在尝试将该代码放入此帖子中浪费了6分钟,但是失败了。格式化根本不起作用,它完全破坏了。

答案 2 :(得分:1)

您可以制作博客容器的快照,然后下载快照以进行时间点备份。

https://docs.microsoft.com/en-us/azure/storage/storage-blob-snapshots

  

快照是在某一点上获取的blob的只读版本   时间。快照对备份blob非常有用。创建完成后   快照,您可以阅读,复制或删除它,但不能修改它。+   blob的快照与其基本blob相同,除了   blob URI具有附加到blob URI的DateTime值以指示   拍摄快照的时间。例如,如果是页面blob URI   是http://storagesample.core.blob.windows.net/mydrives/myvhd,是   快照URI类似于   http://storagesample.core.blob.windows.net/mydrives/myvhd?snapshot=2011-03-09T01:42:34.9360000Z

答案 3 :(得分:1)

如果不参考第三方解决方案,则可以通过以下步骤使用Azure中的内置功能来实现,以确保您的Blob安全。

  1. Azure存储Blob的软删除 更好的步骤是首先启用软删除,此功能现在已在GA中使用: https://azure.microsoft.com/en-us/blog/soft-delete-for-azure-storage-blobs-ga

  2. 可读取的地理冗余存储 第二种方法是为RA-RGA启用地理复制,因此,如果第一个数据中心宕机了,您始终可以从另一个区域的辅助副本中读取,则可以在这里找到更多信息: https://docs.microsoft.com/en-us/azure/storage/common/storage-redundancy-grs

答案 4 :(得分:1)

我有完全相同的要求:从 Azure 备份 blob,因为我们有数百万个 blob 客户,您是对的 - 拥有完全访问权限的草率开发人员可能会危及整个系统。

因此,我编写了一个完整的应用程序“Blob To Local Backup”,在 GitHub 上根据 MIT 许可免费且开源:https://github.com/smartinmedia/BlobToLocalBackup

它解决了您的许多问题,即: a) 您只能授予此应用程序的 READ 访问权限,因此该应用程序不能破坏 Azure 上的任何数据 b) 备份到服务器,您粗心的开发人员或黑客没有与您的 Azure 帐户相同的访问权限。 c) 该软件提供版本控制,因此您甚至可以保护自己免受 e. G。赎金/加密攻击。 d) 我包含了一个序列化方法而不是数据库,因此您甚至可以在 Azure 上拥有数百万个文件,并且仍然能够保持同步(我们在 Azure 上有 2000 万个文件)。

这是它的工作原理(有关更多详细信息,请阅读 github 上的 README):

  1. 您在主文件夹中设置了 appsettings.json 文件。您可以在此处为整个访问提供 LoginCredentials,或者在存储帐户级别进行更精细的操作:
    {
     "App": {

        "ConsoleWidth": 150,
        "ConsoleHeight":  42,

        "LoginCredentials": {
            "ClientId": "2ab11a63-2e93-2ea3-abba-aa33714a36aa",
            "ClientSecret": "ABCe3dabb7247aDUALIPAa-anc.aacx.4",
            "TenantId": "d666aacc-1234-1234-aaaa-1234abcdef38"
        },
        "DataBase": {
          "PathToDatabases": "D:/temp/azurebackup"
        },
        "General": {
          "PathToLogFiles": "D:/temp/azurebackup"
        }
      }
    }

  1. 将作业设置为这样的 JSON 文件(我添加了许多选项):
    {
      "Job": {
        "Name": "Job1",
        "DestinationFolder": "D:/temp/azurebackup",
        "ResumeOnRestartedJob": true,
        "NumberOfRetries": 0, 
        "NumberCopyThreads": 1,
        "KeepNumberVersions": 5,
        "DaysToKeepVersion": 0, 
        "FilenameContains": "", 
        "FilenameWithout": "", 
        "ReplaceInvalidTargetFilenameChars": false,
        "TotalDownloadSpeedMbPerSecond": 0.5,

        "StorageAccounts": [
          {

            "Name": "abc",
            "SasConnectionString": "BlobEndpoint=https://abc.blob.core.windows.net/;QueueEndpoint=https://abc.queue.core.windows.net/;FileEndpoint=https://abc.file.core.windows.net/;TableEndpoint=https://abc.table.core.windows.net/;SharedAccessSignature=sv=2019-12-12&ss=bfqt&srt=sco&sp=rl&se=2020-12-20T04:37:08Z&st=2020-12-19T20:37:08Z&spr=https&sig=abce3e399jdkjs30fjsdlkD",
            "FilenameContains": "",
            "FilenameWithout": "",
            "Containers": [
              {
                "Name": "test",
                "FilenameContains": "",
                "FilenameWithout": "",
                "Blobs": [
                  {
                    "Filename": "2007 EasyRadiology.pdf",
                    "TargetFilename": "projects/radiology/Brochure3.pdf"
                  }
                ]
              },
              {
                "Name": "test2"
              }
            ]

          },
          {
            "Name": "martintest3",
            "SasConnectionString": "",
            "Containers": [] 
          }
        ]
      }
      
    }
  1. 使用您的作业运行应用程序:
    blobtolocal job1.json

答案 5 :(得分:0)

我已使用 Azure Data Factory 备份Azure存储,效果很好。它确实易于使用,具有成本效益并且运行良好。

只需创建一个数据工厂(v2),设置与数据源的数据连接(它当前支持Azure表,Azure Blob和Azure文件),然后设置数据复制管道。

管道可以合并,覆盖等,您可以设置自定义规则/通配符。

设置管道后,您应该设置时间表触发器。这样会按您需要的间隔启动备份。

我已经使用了几个月了,它非常完美。没有代码,没有VMS,没有自定义PowerShell脚本或第三方软件。纯Azure解决方案。