46

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

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

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

问候,

阿基尔

4

6 回答 6

25

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

  1. 本地备份数据 - 如果您希望在基础架构中本地备份数据,您可以:使用存储客户端库或使用 REST API 或 b 编写您自己的应用程序。使用第 3 方工具,例如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

希望这可以帮助。

于 2012-07-19T15:58:13.940 回答
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 分钟试图将该代码放入此帖子,但失败了。格式化根本不起作用,它完全坏了。

于 2016-12-27T18:40:21.780 回答
4

我使用Azure 数据工厂备份 Azure 存储,效果很好。它真的很容易使用,具有成本效益并且工作得很好。

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

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

设置管道后,您应该设置计划触发器。这将在一定时间间隔启动备份以满足您的需求。

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

于 2019-03-18T03:01:49.060 回答
2

我有完全相同的要求:从 Azure 备份 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"
        }
      }
    }

  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
于 2020-12-19T23:33:06.847 回答
1

在不参考 3rd 方解决方案的情况下,您现在可以使用 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

于 2018-11-12T10:26:19.240 回答
0

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

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 ?快照=2011-03-09T01:42:34.9360000Z

于 2017-08-15T13:41:14.650 回答