备份 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 复制到另一个存储帐户的最佳方法?