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

Posted

技术标签:

【中文标题】备份 Azure Blob 存储内容的最佳方法是啥【英文标题】:What is the best way to backup Azure Blob Storage contents备份 Azure Blob 存储内容的最佳方法是什么 【发布时间】:2012-07-18 16:43:32 【问题描述】:

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

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

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

问候,

阿吉尔

【问题讨论】:

【参考方案1】:

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

    在本地备份数据 - 如果您希望在基础架构中本地备份数据,您可以: 一种。使用存储客户端库或使用 REST API 或 湾。使用Cerebrata Azure Management Cmdlets 之类的第 3 方工具(披露:我为 Cerebrata 工作)。

    在云中备份数据 - 最近,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。

希望这会有所帮助。

【讨论】:

我遇到了这个确切的问题,并使用 .net 存储客户端进行了备份。如果我今天再写一次,我会使用异步复制 Blob,速度会快得多。 Cerebrata Azure 管理 Cmdlet 似乎已停产 Gaurav Mantri 第一个选项的链接不再起作用。 有没有办法在本地下载 Azure Blob 存储备份,然后再将其导出回 Azure?我知道我们可以从一个存储帐户导出到另一个,但我想将备份副本下载到本地,类似于我们为 SQL 数据库所做的操作。【参考方案2】:

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

我已经整合了我现在在生产中使用的解决方案。我通过Web Api 公开方法Backup(),然后每天(午夜)由Azure WebJob 调用。

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

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

来源可来自:https://github.com/ChrisEelmaa/***/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”,一切正常。 你在备份容器时使用事务吗?【参考方案3】:

我使用Azure数据工厂备份Azure存储,效果很好。它非常易于使用、经济高效且运行良好。

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

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

设置流水线后,您应该设置计划触发器。这将根据您的需要定期启动备份。

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

【讨论】:

【参考方案4】:

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

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

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

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

    您在主文件夹中设置了 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

【讨论】:

【参考方案5】:

无需参考第 3 方解决方案,您现在可以使用 Azure 中的内置功能实现这一点,使用以下步骤可能有助于保护您的 blob。

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

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

【讨论】:

【参考方案6】:

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

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

快照是 Blob 的只读版本,在 时间。快照对于备份 blob 很有用。创建一个之后 快照,您可以读取、复制或删除它,但不能修改它。+ Blob 的快照与其基本 Blob 相同,不同之处在于 blob URI 有一个 DateTime 值附加到 blob URI 以指示 拍摄快照的时间。例如,如果页面 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.

【讨论】:

明确地说,这是一个 Blob 的快照,而不是整个 Blob 容器。所以你不能完全“制作博客容器的快照然后下载快照” - 如果我错了,请纠正我。 你说得对,这种方案对于备份存储容器不太可行。

以上是关于备份 Azure Blob 存储内容的最佳方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

Azure Blob 存储:防止 Blob 复制到另一个存储帐户的最佳方法?

将文件备份到 Azure 存储

备份 Blob 存储帐户中的数据

如何备份 Azure 表和 Blob

在服务器中存储 mp3 文件的最佳方法是啥?将其存储在数据库(BLOB)中,对吗? [关闭]

自动将 Azure Webapp wwwroot 目录备份到 azure blob 存储