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

46

我知道Azure存储实体(块、表和队列)具有内置的弹性,这意味着它们会在同一数据中心的3个不同服务器上进行复制。除此之外,它们还可以被复制到位于不同地理区域的完全不同的数据中心。在所有实际目的下,此情况下丢失数据的几率接近于零。

但是,如果粗心的开发人员(或者受酒精影响的人:))通过Azure门户或Azure Storage Explorer工具意外删除存储账户会发生什么?更糟糕的是,如果黑客掌握了您的账户并清空了存储会怎么样?是否有办法检索已删除的千兆字节blob,还是就这样了?我认为Azure基础架构一定提供了一个优雅的解决方案,但我找不到任何文档。

我唯一想到的解决方案是编写自己的进程(Worker Role),定期将我的整个存储备份到不同的订阅/账户,从而实质上使存储和交易成本加倍。您有什么想法吗?

敬礼,

Archil

6个回答

25

根据您想备份数据的位置,有两个可选项:

  1. 本地备份数据 - 如果您希望在基础设施中备份数据,则可以: a. 使用 Storage Client Library 或使用 REST API 编写自己的应用程序或 b. 使用第三方工具,例如 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

希望这可以帮助您。


1
我曾经遇到过这个确切的问题,并且使用了.NET存储客户端进行备份。如果今天我再次编写它,我会使用异步复制Blob,速度更快。 - knightpfhor
Cerebrata Azure 管理 Cmdlets 似乎已经停止更新。 - TWilly
Gaurav Mantri 第一个选项的链接已经失效。 - SashaPinsk
有没有办法将 Azure Blob 存储备份下载到本地,然后稍后再将其导出回 Azure?我知道我们可以从一个存储帐户导出到另一个存储帐户,但我想将备份副本下载到本地,类似于我们对 SQL 数据库所做的操作。 - Souvik Ghosh

4

我曾经使用Azure Data Factory备份Azure存储,效果非常好。这个工具使用简单,成本低廉,而且效果出色。

只需创建一个Data Factory(v2),设置数据源的数据连接(目前支持Azure Tables、Azure Blobs和Azure Files),然后设置数据复制管道即可。

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

一旦设置了管道,您应该设置一个时间表触发器。这将按照您的需求间隔启动备份。

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


4
接受的答案不错,但我花了几个小时才破译出来。
我提供了一个解决方案,现在正在生产中使用。 我通过Web Api公开了Backup()方法,然后由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分钟,却失败了。格式全乱了,并且完全无法使用。

元数据键名不再能包含“-”。如果您将其重命名为“CreateAt”和“BackupOf”,则一切都可以正常工作。 - PMerlet
备份容器时,您是否使用事务? - Horia Toma

2
我有完全相同的需求:备份Azure中的blob,由于我们有数百万个客户的blob,你是正确的——一个粗心的开发者拥有完全访问权限可以危及整个系统。
因此,我编写了一个完整的应用程序“Blob To Local Backup”,在MIT许可下免费开源发布在github上:https://github.com/smartinmedia/BlobToLocalBackup 它解决了许多问题,包括: a)您可以只给这个应用程序READ权限,这样应用程序就不能破坏Azure上的任何数据 b)备份到一个服务器,您的粗心的开发人员或黑客无法像访问Azure帐户那样访问该服务器。 c)该软件提供版本控制,因此您甚至可以保护自己免受勒索/加密攻击等。 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"
        }
      }
    }


请按照以下方式设置一个 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": [] 
          }
        ]
      }
      
    }

使用以下命令运行带有您的作业的应用程序:
    blobtolocal job1.json

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://learn.microsoft.com/en-us/azure/storage/common/storage-redundancy-grs


0
您可以对博客容器进行快照,并下载该快照以进行时间点备份。

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

快照是在某个时间点拍摄的 blob 的只读版本。快照对于备份 blob 非常有用。创建快照后,您可以读取、复制或删除它,但不能修改它。blob 的快照与其基本 blob 相同,只是 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

5
明确一点,这是 Blob 的快照,而不是整个 Blob 容器。因此,您不能完全“制作 Blob 容器的快照,然后下载该快照”-如果我错了,请纠正我。 - ttugates
你说得对,这个解决方案不太适用于备份存储容器。 - Nicolas Mommaerts

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接