Резервное копирование учетной записи хранилища Azure (таблицы и капли)
Мне нужно периодически создавать резервные копии всех блоков и таблиц в учетной записи хранилища Azure, чтобы мы могли восстановить все эти данные позднее, если по какой-либо причине испортили наши данные.
Хотя я уверен, что данные, которые мы сохраняем в Azure, долговечны и могут быть восстановлены в случае сбоев в ЦОД, нам все же нужны данные в наших учетных записях для хранения, чтобы предотвратить случайные перезаписи и удаления (фактор ошибки человека).
Мы внедрили решение для этого, которое периодически перечисляет все капли и копирует их на учетную запись резервного хранилища. Когда blob был изменен или удален, мы просто создаем моментальный снимок старой версии в резервной учетной записи.
Этот подход сработал хорошо для нас. Но он обрабатывает только капли, а не элементы таблицы. Теперь нам необходимо поддерживать резервное копирование объектов таблицы.
Теперь, столкнувшись с этой задачей, я думаю, что у кого-то еще, возможно, было это требование раньше и появилось умное решение. Или, может быть, есть коммерческие продукты, которые сделают это?
Не требуется, чтобы целью резервного копирования была другая учетная запись Azure. Все, что нам нужно - это способ восстановления всех блоков и таблиц, как они были в то время, когда мы запускали резервную копию.
Любая помощь приветствуется!
Ответы
Ответ 1
Существует множество способов решения этой проблемы.
Если вы хотите сделать это самостоятельно, вы можете использовать библиотеки хранилищ и написать код, чтобы просто запустить таблицу и вытащить данные.
Есть также несколько услуг, которые могут сделать это и для вас (FULL Disclosure: я работаю для компании, которая предоставляет это как услугу). Вот статья Трой Хант, рассказывающая о нашем варианте: http://www.troyhunt.com/2014/01/azure-will-save-you-from-unexpected_28.html. У нас также есть командлеты PowerShell, которые могут вытащить данные таблицы для вас (cerebrata.com). Чтобы быть справедливым, мы не единственные игроки в этом пространстве, и есть другие, у которых есть подобные услуги.
Наконец, в Tech Ed они объявили, что инструмент AZCopy будет обновлен в конце этого года, так что он сможет вытащить целые таблицы, что просто автоматизирует чтение таблиц и вытягивает их. В настоящее время нет способа "Snapshot" таблицы, поэтому все вышеприведенные методы приведут к копированию при копировании данных, возможно, в исходную таблицу они могут быть изменены к моменту завершения копирования.
Ответ 2
Недавно я собрал простое решение для резервного копирования хранилища таблиц. Он использует инструмент AzCopy и Storage Rest Api, чтобы вывести список всех таблиц и сделать резервную копию для JSON.
Надеюсь, это полезно!
param(
[parameter(Mandatory=$true)]
[string]$Account,
[parameter(Mandatory=$true)]
[string]$SASToken,
[parameter(Mandatory=$true)]
[string]$OutputDir
)
$ErrorActionPreference = "Stop"
##Example Usage
#.\Backup-TableStorage.ps1 -OutputDir "d:\tablebackup" -Account "examplestorageaccount" -SASToken "?sv=2015-04-05&ss=t&srt=sco&sp=rl&st=2016-04-08T07%3A44%3A00Z&se=2016-04-09T07%3A55%3A00Z&sig=CNotAREALSIGNITUREBUTYOURESWOUDLGOHERE3D"
if (-not (Test-Path "${env:ProgramFiles(x86)}\Microsoft SDKs\Azure\AzCopy\AzCopy.exe"))
{
throw "Azcopy not installed - get it from here: https://azure.microsoft.com/en-gb/documentation/articles/storage-use-azcopy/"
}
Write-host ""
Write-Host "Starting backup for account" -ForegroundColor Yellow
Write-host "--------------------------" -ForegroundColor Yellow
Write-Host " -Account: $Account"
Write-Host " -Token: $SASToken"
$response = Invoke-WebRequest -Uri "https://$Account.table.core.windows.net/Tables/$SASToken"
[xml]$tables = $response.Content
$tableNames = $tables.feed.entry.content.properties.TableName
Write-host ""
Write-host "Found Tables to backup" -ForegroundColor Yellow
Write-host "--------------------------" -ForegroundColor Yellow
foreach ($tableName in $tableNames)
{
Write-Host " -Table: $tableName"
}
foreach ($tableName in $tableNames)
{
$url = "https://$Account.table.core.windows.net/$tableName"
Write-host ""
Write-Host "Backing up Table: $url"-ForegroundColor Yellow
Write-host "--------------------------" -ForegroundColor Yellow
Write-host ""
& "${env:ProgramFiles(x86)}\Microsoft SDKs\Azure\AzCopy\AzCopy.exe" /Source:$url /Dest:$OutputDir\$account\ /SourceSAS:$SASToken /Z:"$env:temp\$([guid]::NewGuid()).azcopyJournal"
Write-host ""
Write-host "Backup completed" -ForegroundColor Green
Write-host ""
Write-host ""
}
Подробнее об использовании см. здесь:
https://gripdev.wordpress.com/2016/04/08/backup-azure-table-storage-quick-powershell-script/
Ответ 3
Вы можете создать резервную копию любой таблицы хранения таблиц Azure (но не blobs) с помощью бесплатного программного обеспечения, такого как Slazure Light. Следующий код С# для резервного копирования всех ваших лазурных таблиц в json файлы:
Сначала загрузите пакеты NuGet:
Установить пакет Azure.Storage.Slazure.Light
Создайте консольное приложение в Visual Studio и добавьте следующий код:
using System;
using System.Linq;
using Microsoft.WindowsAzure.Storage.Table;
using Newtonsoft.Json;
using SysSurge.Slazure.AzureTableStorage;
namespace BackupAzureTableStore
{
class Program
{
/// <summary>
/// Usage: BackupAzureTableStore.exe "UseDevelopmentStorage=true"
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
var storage = new DynStorage(args.Length == 0 ? "UseDevelopmentStorage=true" : args[0]);
foreach (var cloudTable in storage.Tables)
{
var tableName = cloudTable.Name;
var fileName = $"{tableName}.json";
using (var file = new System.IO.StreamWriter(fileName))
{
var dynTable = new DynTable(storage.StorageAccount, tableName);
TableContinuationToken token = null; // Continuation token required if > 1,000 rows per table
do
{
var queryResult =
dynTable.TableClient.GetTableReference(tableName)
.ExecuteQuerySegmented(new TableQuery(), token);
file.WriteLine("{{{0} : [", JsonConvert.SerializeObject(tableName));
var cntr = 0;
foreach (var entity in queryResult.Results)
{
var dynEntity = dynTable.Entity(entity.PartitionKey, entity.RowKey);
dynEntity.LoadAll().ToList(); // Force pre-downloading of all properties
file.WriteLine("{0}{1}", cntr++ > 0 ? "," : string.Empty,
JsonConvert.SerializeObject(dynEntity));
}
file.WriteLine("]}");
token = queryResult.ContinuationToken;
} while (token != null);
}
}
Console.WriteLine("Done. Press a key...");
Console.ReadKey();
}
}
}