Подтвердить что ты не робот

Резервное копирование учетной записи хранилища Azure (таблицы и капли)

Мне нужно периодически создавать резервные копии всех блоков и таблиц в учетной записи хранилища Azure, чтобы мы могли восстановить все эти данные позднее, если по какой-либо причине испортили наши данные.

Хотя я уверен, что данные, которые мы сохраняем в Azure, долговечны и могут быть восстановлены в случае сбоев в ЦОД, нам все же нужны данные в наших учетных записях для хранения, чтобы предотвратить случайные перезаписи и удаления (фактор ошибки человека).

Мы внедрили решение для этого, которое периодически перечисляет все капли и копирует их на учетную запись резервного хранилища. Когда blob был изменен или удален, мы просто создаем моментальный снимок старой версии в резервной учетной записи.

Этот подход сработал хорошо для нас. Но он обрабатывает только капли, а не элементы таблицы. Теперь нам необходимо поддерживать резервное копирование объектов таблицы.

Теперь, столкнувшись с этой задачей, я думаю, что у кого-то еще, возможно, было это требование раньше и появилось умное решение. Или, может быть, есть коммерческие продукты, которые сделают это?

Не требуется, чтобы целью резервного копирования была другая учетная запись Azure. Все, что нам нужно - это способ восстановления всех блоков и таблиц, как они были в то время, когда мы запускали резервную копию.

Любая помощь приветствуется!

4b9b3361

Ответ 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();
        }
    }
}