Azure Service Fabric でのバックアップの復元

Azure Service Fabric では、Reliable Stateful サービスおよび Reliable Actors は、要求と応答のトランザクションが完了した後、変更可能な信頼できる状態を維持できます。 ステートフル サービスは、災害のために長時間停止したり、情報を失う場合があります。 その場合は、動作し続けられるように、最新の許容可能なバックアップからサービスを復元する必要があります。

たとえば、データをバックアップして次のシナリオから保護するようにサービスを構成できます。

  • ディザスター リカバリーの場合:Service Fabric クラスター全体の完全な損失。
  • データ損失の場合:サービス パーティションのレプリカの過半数の完全な損失。
  • データ損失の場合:サービスの不測の削除または破損。 たとえば、管理者が誤ってサービスを削除した場合です。
  • データ破損の場合:サービスのバグにより引き起こされるデータの破損。 たとえば、データの破損は、サービス コードのアップグレードにより、Reliable Collection に不正なデータが書き込まれると起こる可能性があります。 このような場合は、コードとデータの両方を、以前の状態に復元する必要があります。

前提条件

  • 復元をトリガーするには、Fault Analysis Service (FAS) がクラスターで有効になっている必要があります。
  • "バックアップ復元サービス (BRS) " がバックアップを作成しました。
  • 復元は、パーティションでのみトリガーできます。
  • 構成の呼び出しを行うため、Microsoft.ServiceFabric.Powershell.Http モジュール (プレビュー) をインストールします。
    Install-Module -Name Microsoft.ServiceFabric.Powershell.Http -AllowPrerelease

Note

PowerShellGet のバージョンが 1.6.0 未満の場合、更新して -AllowPrerelease フラグのサポートを追加する必要があります。

Install-Module -Name PowerShellGet -Force

  • Microsoft.ServiceFabric.Powershell.Http モジュールを使用して、任意の構成要求を行う前に、Connect-SFCluster コマンドを使用してクラスターが接続されていることを確認します。

    Connect-SFCluster -ConnectionEndpoint 'https://mysfcluster.southcentralus.cloudapp.azure.com:19080'   -X509Credential -FindType FindByThumbprint -FindValue '1b7ebe2174649c45474a4819dafae956712c31d3' -StoreLocation 'CurrentUser' -StoreName 'My' -ServerCertThumbprint '1b7ebe2174649c45474a4819dafae956712c31d3'  

トリガーされた復元

次のシナリオのいずれかで復元をトリガーできます。

  • "ディザスター リカバリー" のデータ復元。
  • "データ破損/データ損失" の場合のデータ復元。

ディザスター リカバリーの場合のデータ復元

Service Fabric クラスター全体が失われた場合は、Reliable Stateful サービスと Reliable Actors のパーティションのデータを復元できます。 目的のバックアップは、バックアップ ストレージ詳細での GetBackupAPI を使用するときに一覧から選択できます。 アプリケーション、サービス、またはパーティションのバックアップを列挙できます。

次の例では、失われたクラスターが 「Reliable Stateful サービスと Reliable Actors の定期バックアップの有効化」で言及されている同じクラスターであるとします。 この場合、SampleApp は、バックアップ ポリシーを有効にしてデプロイされ、バックアップは Azure Storage に対して構成されます。

Microsoft.ServiceFabric.Powershell.Http モジュールを使用した PowerShell

Get-SFBackupsFromBackupLocation -Application -ApplicationName 'fabric:/SampleApp' -AzureBlobStore -ConnectionString 'DefaultEndpointsProtocol=https;AccountName=<account-name>;AccountKey=<account-key>;EndpointSuffix=core.windows.net' -ContainerName 'backup-container'

PowerShell を使用した Rest の呼び出し

REST API を使用して SampleApp アプリケーション内のすべてのパーティションに対して作成されたバックアップバックアップの一覧を返す PowerShell スクリプトを実行します。 この API は、使用可能なバックアップを一覧するためにバックアップ ストレージ情報を必要とします。

$StorageInfo = @{
    ConnectionString = 'DefaultEndpointsProtocol=https;AccountName=<account-name>;AccountKey=<account-key>;EndpointSuffix=core.windows.net'
    ContainerName = 'backup-container'
    StorageKind = 'AzureBlobStore'
}

$BackupEntity = @{
    EntityKind = 'Application'
    ApplicationName='fabric:/SampleApp'
}

$BackupLocationAndEntityInfo = @{
    Storage = $StorageInfo
    BackupEntity = $BackupEntity
}

$body = (ConvertTo-Json $BackupLocationAndEntityInfo)
$url = "https://myalternatesfcluster.southcentralus.cloudapp.azure.com:19080/BackupRestore/$/GetBackups?api-version=6.4"

$response = Invoke-WebRequest -Uri $url -Method Post -Body $body -ContentType 'application/json' -CertificateThumbprint '1b7ebe2174649c45474a4819dafae956712c31d3'
$BackupPoints = (ConvertFrom-Json $response.Content)
$BackupPoints.Items

上記を実行したときのサンプル出力:

BackupId                : b9577400-1131-4f88-b309-2bb1e943322c
BackupChainId           : b9577400-1131-4f88-b309-2bb1e943322c
ApplicationName         : fabric:/SampleApp
ServiceName             : fabric:/SampleApp/MyStatefulService
PartitionInformation    : @{LowKey=-9223372036854775808; HighKey=9223372036854775807; ServicePartitionKind=Int64Range; Id=974bd92a-b395-4631-8a7f-53bd4ae9cf22}
BackupLocation          : SampleApp\MyStatefulService\974bd92a-b395-4631-8a7f-53bd4ae9cf22\2018-04-06 20.55.16.zip
BackupType              : Full
EpochOfLastBackupRecord : @{DataLossNumber=131675205859825409; ConfigurationNumber=8589934592}
LsnOfLastBackupRecord   : 3334
CreationTimeUtc         : 2018-04-06T20:55:16Z
FailureError            : 
*
BackupId                : b0035075-b327-41a5-a58f-3ea94b68faa4
BackupChainId           : b9577400-1131-4f88-b309-2bb1e943322c
ApplicationName         : fabric:/SampleApp
ServiceName             : fabric:/SampleApp/MyStatefulService
PartitionInformation    : @{LowKey=-9223372036854775808; HighKey=9223372036854775807; ServicePartitionKind=Int64Range; Id=974bd92a-b395-4631-8a7f-53bd4ae9cf22}
BackupLocation          : SampleApp\MyStatefulService\974bd92a-b395-4631-8a7f-53bd4ae9cf22\2018-04-06 21.10.27.zip
BackupType              : Incremental
EpochOfLastBackupRecord : @{DataLossNumber=131675205859825409; ConfigurationNumber=8589934592}
LsnOfLastBackupRecord   : 3552
CreationTimeUtc         : 2018-04-06T21:10:27Z
FailureError            :
*
BackupId                : 69436834-c810-4163-9386-a7a800f78359
BackupChainId           : b9577400-1131-4f88-b309-2bb1e943322c
ApplicationName         : fabric:/SampleApp
ServiceName             : fabric:/SampleApp/MyStatefulService
PartitionInformation    : @{LowKey=-9223372036854775808; HighKey=9223372036854775807; ServicePartitionKind=Int64Range; Id=974bd92a-b395-4631-8a7f-53bd4ae9cf22}
BackupLocation          : SampleApp\MyStatefulService\974bd92a-b395-4631-8a7f-53bd4ae9cf22\2018-04-06 21.25.36.zip
BackupType              : Incremental
EpochOfLastBackupRecord : @{DataLossNumber=131675205859825409; ConfigurationNumber=8589934592}
LsnOfLastBackupRecord   : 3764
CreationTimeUtc         : 2018-04-06T21:25:36Z
FailureError            :

復元をトリガーするには、バックアップのいずれかを選択します。 たとえば、ディザスター リカバリー用の最新のバックアップは、次のバックアップになります。

BackupId                : b0035075-b327-41a5-a58f-3ea94b68faa4
BackupChainId           : b9577400-1131-4f88-b309-2bb1e943322c
ApplicationName         : fabric:/SampleApp
ServiceName             : fabric:/SampleApp/MyStatefulService
PartitionInformation    : @{LowKey=-9223372036854775808; HighKey=9223372036854775807; ServicePartitionKind=Int64Range; Id=974bd92a-b395-4631-8a7f-53bd4ae9cf22}
BackupLocation          : SampleApp\MyStatefulService\974bd92a-b395-4631-8a7f-53bd4ae9cf22\2018-04-06 21.10.27.zip
BackupType              : Incremental
EpochOfLastBackupRecord : @{DataLossNumber=131675205859825409; ConfigurationNumber=8589934592}
LsnOfLastBackupRecord   : 3552
CreationTimeUtc         : 2018-04-06T21:10:27Z
FailureError            :

復元 API に対して、BackupIdBackupLocation の詳細を提供する必要があります。

パーティション スキームで詳しく述べているように、代替クラスター内のバックアップ先パーティションを選択する必要もあります。 代替クラスターのバックアップは、元の失われたクラスターの、パーティション スキームで指定されたパーティションに復元されます。

代替クラスターでのパーティション ID が 1c42c47f-439e-4e09-98b9-88b8f60800c6 である場合、"範囲パーティション分割 (UniformInt64Partition) " に対する上位キーと下位キーを比較することによって、元のクラスターのパーティション ID 974bd92a-b395-4631-8a7f-53bd4ae9cf22 にマップできます。

"名前付きパーティション分割" では、名前の値を比較して、代替クラスターの対象パーティションが識別されます。

Microsoft.ServiceFabric.Powershell.Http モジュールを使用した PowerShell


Restore-SFPartition  -PartitionId '1c42c47f-439e-4e09-98b9-88b8f60800c6' -BackupId 'b0035075-b327-41a5-a58f-3ea94b68faa4' -BackupLocation 'SampleApp\MyStatefulService\974bd92a-b395-4631-8a7f-53bd4ae9cf22\2018-04-06 21.10.27.zip' -AzureBlobStore -ConnectionString 'DefaultEndpointsProtocol=https;AccountName=<account-name>;AccountKey=<account-key>;EndpointSuffix=core.windows.net' -ContainerName 'backup-container'

PowerShell を使用した Rest の呼び出し

次の復元 API を使用することにより、バックアップ クラスター パーティションに対して復元を要求します。


$StorageInfo = @{
    ConnectionString = 'DefaultEndpointsProtocol=https;AccountName=<account-name>;AccountKey=<account-key>;EndpointSuffix=core.windows.net'
    ContainerName = 'backup-container'
    StorageKind = 'AzureBlobStore'
}

$RestorePartitionReference = @{
    BackupId = 'b0035075-b327-41a5-a58f-3ea94b68faa4'
    BackupLocation = 'SampleApp\MyStatefulService\974bd92a-b395-4631-8a7f-53bd4ae9cf22\2018-04-06 21.10.27.zip'
    BackupStorage  = $StorageInfo
}

$body = (ConvertTo-Json $RestorePartitionReference) 
$url = "https://mysfcluster.southcentralus.cloudapp.azure.com:19080/Partitions/1c42c47f-439e-4e09-98b9-88b8f60800c6/$/Restore?api-version=6.4" 

Invoke-WebRequest -Uri $url -Method Post -Body $body -ContentType 'application/json' -CertificateThumbprint '1b7ebe2174649c45474a4819dafae956712c31d3'

TrackRestoreProgress を使用して復元の進行状況を追跡できます。

Note

Powershell を使用してパーティションを復元するときに、backuplocation に '$' が含まれている場合は、'~' を使用してエスケープします。

Service Fabric Explorer の使用

Service Fabric Explorer から復元をトリガーできます。 Service Fabric Explorer の設定で、詳細設定モードが有効になっていることを確認します。

  1. 目的のパーティションを選択し、[アクション] をクリックします。

  2. [Trigger Partition Restore](パーティションの復元のトリガー) を選択し、Azure の情報を入力します。

    パーティションの復元のトリガー

    または、FileShare の場合:

    パーティションの復元のトリガー (FileShare)

"データ破損/データ損失" の場合のデータ復元

"データ損失" または "データ破損" の場合、Reliable Stateful サービスと Reliable Actors のパーティション用のバックアップ パーティションは、選択した任意のバックアップに復元できます。

次の例は、「Reliable Stateful サービスと Reliable Actors の定期バックアップの有効化」の続きです。 この例では、バックアップ ポリシーがパーティションで有効になっており、サービスは Azure Storage に必要な頻度でバックアップを作成しています。

GetBackupAPI の出力からバックアップを選択します。 このシナリオでは、バックアップは以前と同じクラスターから生成されます。

復元をトリガーするには、一覧からバックアップを選択します。 現在の "データ損失/データ破損" には、次のバックアップを選択します。

BackupId                : b0035075-b327-41a5-a58f-3ea94b68faa4
BackupChainId           : b9577400-1131-4f88-b309-2bb1e943322c
ApplicationName         : fabric:/SampleApp
ServiceName             : fabric:/SampleApp/MyStatefulService
PartitionInformation    : @{LowKey=-9223372036854775808; HighKey=9223372036854775807; ServicePartitionKind=Int64Range; Id=974bd92a-b395-4631-8a7f-53bd4ae9cf22}
BackupLocation          : SampleApp\MyStatefulService\974bd92a-b395-4631-8a7f-53bd4ae9cf22\2018-04-06 21.10.27.zip
BackupType              : Incremental
EpochOfLastBackupRecord : @{DataLossNumber=131675205859825409; ConfigurationNumber=8589934592}
LsnOfLastBackupRecord   : 3552
CreationTimeUtc         : 2018-04-06T21:10:27Z
FailureError            :

復元 API には、BackupIdBackupLocation の詳細を提供します。 クラスターでバックアップが有効になっているので、Service Fabric の "バックアップ復元サービス (BRS) " では、関連付けられているバックアップ ポリシーから適切なストレージの場所が識別されます。

Microsoft.ServiceFabric.Powershell.Http モジュールを使用した PowerShell

Restore-SFPartition  -PartitionId '974bd92a-b395-4631-8a7f-53bd4ae9cf22' -BackupId 'b0035075-b327-41a5-a58f-3ea94b68faa4' -BackupLocation 'SampleApp\MyStatefulService\974bd92a-b395-4631-8a7f-53bd4ae9cf22\2018-04-06 21.10.27.zip'

PowerShell を使用した Rest の呼び出し

$RestorePartitionReference = @{
    BackupId = 'b0035075-b327-41a5-a58f-3ea94b68faa4',
    BackupLocation = 'SampleApp\MyStatefulService\974bd92a-b395-4631-8a7f-53bd4ae9cf22\2018-04-06 21.10.27.zip'
}

$body = (ConvertTo-Json $RestorePartitionReference)
$url = "https://mysfcluster.southcentralus.cloudapp.azure.com:19080/Partitions/974bd92a-b395-4631-8a7f-53bd4ae9cf22/$/Restore?api-version=6.4"

Invoke-WebRequest -Uri $url -Method Post -Body $body -ContentType 'application/json' -CertificateThumbprint '1b7ebe2174649c45474a4819dafae956712c31d3'

TrackRestoreProgress を使用して復元の進行状況を追跡できます。

Note

Powershell を使用してパーティションを復元するときに、backuplocation に '$' が含まれている場合は、'~' を使用してエスケープします。

復元の進行状況を追跡する

Reliable Stateful サービスまたは Reliable Actors のパーティションで受け付けられる復元要求は、一度に 1 つだけです。 パーティションは、現在の復元要求が完了した後にのみ別の要求を受け入れます。 パーティションが異なれば、同時に複数の復元要求をトリガーできます。

Microsoft.ServiceFabric.Powershell.Http モジュールを使用した PowerShell

    Get-SFPartitionRestoreProgress -PartitionId '974bd92a-b395-4631-8a7f-53bd4ae9cf22'

PowerShell を使用した Rest の呼び出し

$url = "https://mysfcluster-backup.southcentralus.cloudapp.azure.com:19080/Partitions/974bd92a-b395-4631-8a7f-53bd4ae9cf22/$/GetRestoreProgress?api-version=6.4"

$response = Invoke-WebRequest -Uri $url -Method Get -CertificateThumbprint '1b7ebe2174649c45474a4819dafae956712c31d3'

$restoreResponse = (ConvertFrom-Json $response.Content)
$restoreResponse | Format-List

復元要求は次の順序で進行します。

  1. 受け付け済み:"受け付け済み" の復元状態は、正しい要求パラメーターで要求されたパーティションが開始されたことを示します。

    RestoreState  : Accepted
    TimeStampUtc  : 0001-01-01T00:00:00Z
    RestoredEpoch : @{DataLossNumber=131675205859825409; ConfigurationNumber=8589934592}
    RestoredLsn   : 3552
    
  2. 進行中:"進行中" の復元状態は、要求で指定されたバックアップでパーティションの復元が行われていることを示します。 パーティションは "データ損失" 状態を報告します。

    RestoreState  : RestoreInProgress
    TimeStampUtc  : 0001-01-01T00:00:00Z
    RestoredEpoch : @{DataLossNumber=131675205859825409; ConfigurationNumber=8589934592}
    RestoredLsn   : 3552
    
  3. 成功失敗、またはタイムアウト:要求された復元は、次の状態のいずれかで完了する可能性があります。 各状態の重要性と応答の詳細は次のとおりです。

    • 成功: "成功" の復元状態は、回復したパーティション状態を示します。 パーティションは、RestoredEpoch および RestoredLSN の状態を UTC 時刻とともに報告します。

      RestoreState  : Success
      TimeStampUtc  : 2018-11-22T11:22:33Z
      RestoredEpoch : @{DataLossNumber=131675205859825409; ConfigurationNumber=8589934592}
      RestoredLsn   : 3552
      
    • 失敗:"エラー" の復元状態は、復元要求の失敗を示します。 エラーの原因が報告されます。

      RestoreState  : Failure
      TimeStampUtc  : 0001-01-01T00:00:00Z
      RestoredEpoch : 
      RestoredLsn   : 0
      
    • タイムアウト:"タイムアウト" の復元状態は、要求がタイムアウトしたことを示します。 RestoreTimeout を大きくして新しい復元要求を作成してください。 既定のタイムアウト時間は 10 分です。 再度復元を要求する前に、パーティションがデータ損失状態ではなくなっていることを確認してください。

      RestoreState  : Timeout
      TimeStampUtc  : 0001-01-01T00:00:00Z
      RestoredEpoch : 
      RestoredLsn   : 0
      

自動復元

Service Fabric クラスター内の Reliable Stateful サービスおよび Reliable Actors パーティションを、"自動復元" するように構成できます。 バックアップ ポリシーで AutoRestoretrue に設定します。 "自動復元" を有効にすると、データの損失が報告された場合、最新のパーティション バックアップからデータが自動的に復元されます。 詳細については、次を参照してください。

次のステップ