备份Azure Blob存储内容的最佳方法是什么
我知道Azure存储实体(Blob、表和队列)具有内置的弹性,这意味着它们被复制到同一数据中心的3个不同服务器上。除此之外,还可以将它们复制到物理上位于不同地理区域的不同数据中心。在这种情况下,丢失数据的可能性几乎为零 但是,如果草率的开发人员(或受酒精影响的开发人员:)通过Azure门户或Azure storage Explorer工具意外删除存储帐户,会发生什么情况?最糟糕的是,如果黑客获得了你的帐户并清除了存储空间怎么办?有没有一种方法可以检索千兆字节的已删除blob,还是这样?不知何故,我认为Azure infrastructure必须提供一个优雅的解决方案,但我找不到任何文档 我能想到的唯一解决方案是编写自己的进程(工作角色),定期将整个存储备份到不同的订阅/帐户,从而使存储和事务的成本增加一倍。 有什么想法吗 问候,备份Azure Blob存储内容的最佳方法是什么,azure,backup,azure-storage,azure-storage-blobs,Azure,Backup,Azure Storage,Azure Storage Blobs,我知道Azure存储实体(Blob、表和队列)具有内置的弹性,这意味着它们被复制到同一数据中心的3个不同服务器上。除此之外,还可以将它们复制到物理上位于不同地理区域的不同数据中心。在这种情况下,丢失数据的可能性几乎为零 但是,如果草率的开发人员(或受酒精影响的开发人员:)通过Azure门户或Azure storage Explorer工具意外删除存储帐户,会发生什么情况?最糟糕的是,如果黑客获得了你的帐户并清除了存储空间怎么办?有没有一种方法可以检索千兆字节的已删除blob,还是这样?不知何故,
归档取决于您要备份数据的位置,有两个可用选项:
希望这能有所帮助。被接受的答案很好,但我花了几个小时才破译了所有内容 我已经准备好了我现在在生产中使用的解决方案。我每天(午夜)通过
webapi
公开方法Backup()
,然后由azurewebjob
调用
请注意,我采用了原始源代码,并对其进行了修改:
- 它不是最新的,所以我更改了几个方法名
- 添加了重试复制操作保护(对同一blob尝试4次后失败)
- 添加了一点日志记录-您应该用自己的日志记录替换它
- 在两个存储帐户(复制容器和Blob)之间执行备份
- 添加了清除功能—它可以清除不需要的旧容器(保留16天的数据)。您可以随时禁用此功能,因为空间很便宜
[路由(“备份”)]
[HttpPost]
公共异步任务备份()
{
尝试
{
wait_blobService.Backup();
返回Ok();
}
捕获(例外e)
{
_loggerService.Error(“备份Blob失败”+e);
返回InternalServerError(新异常(“备份Blob失败!”);
}
}
注意:我想把这段代码作为文章的一部分添加进去,但是我浪费了6分钟试图把这段代码放到这篇文章中,但是失败了。格式化根本不起作用,它完全崩溃了。您可以制作博客容器的快照,然后下载快照进行时间点备份 快照是一个只读版本的blob,它是在中的某个点上拍摄的 时间快照对于备份blob很有用。创建一个 快照,您可以读取、复制或删除它,但不能修改它+ blob的快照与其基本blob相同,只是 blob URI在blob URI后附加了一个日期时间值,以指示 拍摄快照的时间。例如,如果一个页面blob URI 就是 快照URI类似于
在不参考第三方解决方案的情况下,您可以通过以下步骤实现在Azure中使用内置功能可能有助于保护您的blob
我使用了Azure Data Factory来备份Azure存储,效果非常好。它真的很容易使用,成本效益和工作非常好 只需创建一个数据工厂(v2),设置到数据源的数据连接(它当前支持Azure表、Azure Blob和Azure文件),然后设置数据复制管道 管道可以合并、覆盖等,您可以设置自定义规则/通配符 一旦设置了管道,就应该设置一个调度触发器。这将在一段时间内启动备份,以满足您的需要
我已经用了好几个月了,很完美。无代码、无虚拟机、无自定义PowerShell脚本或第三方软件。纯Azure解决方案。我有完全相同的要求:从Azure备份Blob,因为我们有数百万Blob的客户,你是对的-一个拥有完全访问权限的草率开发人员可能会危害整个系统 因此,我在github上根据MIT许可证编写了一个完整的免费开源应用程序“Blob到本地备份”: 它解决了您的许多问题,即: a) 您只能授予此应用程序的读取权限,以便该应用程序无法销毁Azure上的任何数据
[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!"));
}
}
{
"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"
}
}
}
{
"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