Azure Service Fabric クラスターでの定期的なバックアップと復元
Service Fabric は、信頼性の高い分散クラウド アプリケーションを開発して管理するためのプラットフォームです。 ステートレスおよびステートフル マイクロサービスの両方がサポートされています。 ステートフル サービスは、1 つの要求またはトランザクションを超えて重要なデータを保持できます。 ステートフル サービスがダウンしたりデータが失われたりした場合、正常な動作を続けるには、最新のバックアップからの復元が必要になる場合があります。
Service Fabric は、複数のノードの状態をレプリケートして、サービスの高可用性を確保します。 クラスター内の 1 つのノードに障害が発生しても、サービスは引き続き利用できます。 しかし、特定のケースでは、サービス データがより広範囲の障害に対する信頼性を持つことが望まれます。
たとえば、次のような状況を防ぐために、サービスのデータをバックアップすることが望まれます。
- Service Fabric クラスター全体が永久に失われた場合。
- サービス パーティションのレプリカの過半数の完全な損失。
- 状態が誤って削除されたり、破損したりするなどの管理エラー。 例: 十分な権限を持つ管理者が誤ってサービスを削除した。
- データの破損を引き起こすサービスのバグ。 これは、サービス コードのアップグレードにより、Reliable Collection に不正なデータが書き込まれ始めると起こる可能性があります。 このような場合は、コードとデータの両方を、以前の状態に復元する必要があります。
- オフライン データ処理 データを生成するサービスと切り離されて行われるビジネス インテリジェンスのために、データのオフライン処理を用意しておけば便利です。
Service Fabric には、ポイントインタイムのバックアップと復元を行う API が組み込まれています。 アプリケーション開発者は、これらの API を使用して、サービスの状態を定期的にバックアップできます。 さらに、サービス管理者が特定の時点 (アプリケーションをアップグレードする前など) にサービスの外部からバックアップをトリガーすることを望んでいるのであれば、開発者は、バックアップ (および復元) を API としてサービスから公開する必要があります。 バックアップの管理には、追加コストが発生します。 たとえば、完全バックアップに続けて、30 分ごとに 5 回の増分バックアップを実行したい場合があるとします。 完全バックアップを実行した後、その前に実行された増分バックアップを削除できます。 このアプローチではコードを追加する必要であり、それによってアプリケーションの開発中に追加コストが発生します。
Service Fabric のバックアップと復元サービスを使用すると、ステートフル サービスに格納された情報を簡単かつ自動的にバックアップできます。 定期的にアプリケーション データをバックアップすることは、データが失われたりサービスを利用できなくなったりしないように保護するために不可欠です。 Service Fabric には、オプションで提供されるバックアップと復元サービスがあります。このサービスを使用すると、追加のコードを記述することなく、ステートフルな Reliable Services の定期的なバックアップを構成できます (Actor Services も対象になります)。 これまでに実行したバックアップも簡単に復元できます。
Service Fabric には、定期的なバックアップと復元機能に関連する次の機能を実現するための一連の API が用意されています。
- ステートフルな Reliable Services と Reliable Actors の定期的なバックアップのスケジュールを設定する。バックアップの (外部) 保存場所へのアップロードがサポートされます。 サポートされる保存場所
- Azure Storage
- ファイル共有 (オンプレミス)
- バックアップを列挙する
- パーティションのアドホック バックアップをトリガーする
- 以前のバックアップを使用してパーティションを復元する
- バックアップを一時停止する
- バックアップの保有期間を管理する (予定)
前提条件
- Service Fabric のバージョンが 6.4 以降の Fabric クラスター。 Azure リソース テンプレートを使用して Service Fabric クラスターを作成する手順については、こちらの記事を参照してください。
- バックアップを保存するストレージに接続するために必要なシークレットを暗号化する X.509 証明書。 X.509 証明書を取得または作成する方法については、こちらの記事を参照してください。
- Service Fabric SDK バージョン 3.0 以降を使用してビルドされた Service Fabric Reliable Stateful アプリケーション。 .NET Core 2.0 をターゲットにするアプリケーションに関しては、アプリケーションを Service Fabric SDK バージョン 3.1 以上を使用してビルドする必要があります。
- アプリケーションのバックアップを保存するための Azure ストレージ アカウントを作成します。
- 構成の呼び出しを行うため、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'
バックアップと復元サービスの有効化
Azure Portal の使用
Cluster Configuration
タブの + Show optional settings
の下で Include backup restore service
チェック ボックスをオンにします。
Azure Resource Manager テンプレートの使用
最初に、"バックアップと復元サービス" をクラスターで有効にする必要があります。 デプロイするクラスター用テンプレートを用意します。 サンプル テンプレートを使用することも、Resource Manager テンプレートを作成することもできます。 次の手順で、"バックアップと復元サービス" を有効にします。
まず、
Microsoft.ServiceFabric/clusters
リソースのapiversion
が2018-02-01
に設定されていることを確認し、設定されていない場合は次のスニペットのように更新します。{ "apiVersion": "2018-02-01", "type": "Microsoft.ServiceFabric/clusters", "name": "[parameters('clusterName')]", "location": "[parameters('clusterLocation')]", ... }
下のスニペットに示すように、次の
addonFeatures
セクションをproperties
セクションの下に追加することで、"バックアップと復元サービス" を有効にします。"properties": { ... "addonFeatures": ["BackupRestoreService"], "fabricSettings": [ ... ] ... }
資格情報を暗号化する X.509 証明書を構成します。 これは、ストレージに接続するために提供された証明書が永続化の前に暗号化されることを保証するために重要です。 下のスニペットに示すように、次の
BackupRestoreService
セクションをfabricSettings
セクションの下に追加することで、暗号化証明書を有効にします。"properties": { ... "addonFeatures": ["BackupRestoreService"], "fabricSettings": [ { "name": "BackupRestoreService", "parameters": [ { "name": "SecretEncryptionCertThumbprint", "value": "[Thumbprint]" }, { "name": "SecretEncryptionCertX509StoreName", "value": "My" } ] }] ... }
Note
[Thumbprint] は、暗号化に使用される有効な証明書のサムプリントに置き換える必要があります。
上記の変更でクラスター テンプレートを更新したら、その変更を適用して、デプロイ/アップグレードを完了します。 完了すると、"バックアップと復元サービス" がクラスターで実行されます。 このサービスの URI は
fabric:/System/BackupRestoreService
です。サービスは、Service Fabric エクスプローラーでシステム サービス セクションの下に置くことができます。
Reliable Stateful サービスと Reliable Actors の定期バックアップの有効化
Reliable Stateful サービスと Reliable Actors の定期バックアップを有効にする手順について説明します。 これらの手順は、以下を前提としています
- クラスターが X.509 セキュリティと "バックアップと復元サービス" を使用してセットアップされている。
- Reliable Stateful サービスがクラスターにデプロイされている。 このクイックスタート ガイドでは、アプリケーション URI は
fabric:/SampleApp
であり、このアプリケーションに属する Reliable Stateful サービスの URI はfabric:/SampleApp/MyStatefulService
です。 このサービスは単一パーティションでデプロイされ、パーティション ID は974bd92a-b395-4631-8a7f-53bd4ae9cf22
です。 - 管理者ロールのクライアント証明書が、スクリプトが呼び出されるコンピューター上の CurrentUser 証明書ストアの保存場所の My (Personal) ストアにインストールされている。 この例では、この証明書の拇印として
1b7ebe2174649c45474a4819dafae956712c31d3
を使用します。 クライアント証明書の詳細については、「ロールベースのアクセス制御 (Service Fabric クライアント用)」を参照してください。
バックアップ ポリシーを作成する
最初の手順は、バックアップ ポリシーを作成することです。 このポリシーには、バックアップ スケジュール、バックアップ データのターゲット ストレージ、ポリシー名、完全バックアップがトリガーされるまでに許容される増分バックアップの最大回数、およびバックアップ ストレージの保持ポリシーが含まれている必要があります。
バックアップ ストレージには、先ほど作成した Azure ストレージ アカウントを使用します。 コンテナー backup-container
は、バックアップを格納するために構成されます。 バックアップのアップロード中に、この名前を持つコンテナーが作成されます (まだ存在しない場合)。 BlobServiceUri
には account-name
を実際のストレージ アカウント名に置き換えて Azure Storage アカウントの URL を設定し、ManagedIdentityClientId
にはユーザー割り当てマネージド ID のクライアント ID を設定します (リソースに割り当てられているマネージド ID が複数存在する場合)。
以下に示す Azure リソースでのマネージド ID の割り当ての手順に従います。
Virtual Machine Scale Sets でシステム割り当てまたはユーザー割り当てマネージド ID を有効にします (「仮想マシン スケール セットでマネージド ID を構成する」)
Virtual Machine Scale Sets のマネージド ID にストレージ アカウントに対してロールを割り当てます (「Azure portal を使用して Azure ロールを割り当てる - Azure RBAC」)
- ストレージ BLOB データ共同作成者ロール以上
Microsoft.ServiceFabric.Powershell.Http モジュールを使用した PowerShell
新しいバックアップ ポリシーを作成するために、以下の PowerShell コマンドレットを実行します。 account-name
をストレージ アカウント名に置き換えます。
New-SFBackupPolicy -Name 'BackupPolicy1' -AutoRestoreOnDataLoss $false -MaxIncrementalBackups 20 -FrequencyBased -Interval "<hh:mm>" -ManagedIdentityAzureBlobStore -FriendlyName "AzureMI_storagesample" -BlobServiceUri 'https://<account-name>.blob.core.windows.net' -ContainerName 'backup-container' -ManagedIdentityType "VMSS" -ManagedIdentityClientId "<Client-Id of User-Assigned MI>" -Basic -RetentionDuration '10.00:00:00'
# Use Optional parameter `ManagedIdentityClientId` with Client-Id of User-Assigned Managed Identity in case of multiple User-Assigned Managed Identities assigned to your resource, or both SAMI & UAMI assigned and we need to use UAMI as the default, else no need of this paramter.
PowerShell を使用した Rest の呼び出し
必要な REST API を呼び出して新しいポリシーを作成するために、以下の PowerShell スクリプトを実行します。 account-name
をストレージ アカウント名に置き換えます。
$StorageInfo = @{
StorageKind = "ManagedIdentityAzureBlobStore"
FriendlyName = "AzureMI_storagesample"
BlobServiceUri = "https://<account-name>.blob.core.windows.net"
ContainerName = "backup-container"
ManagedIdentityType = "VMSS"
ManagedIdentityClientId = "<Client-Id of User-Assigned MI>" # Use Optional parameter `ManagedIdentityClientId` with Client-Id of User-Assigned Managed Identity in case of multiple User-Assigned Managed Identities assigned to your resource, or both SAMI & UAMI assigned and we need to use UAMI as the default, else no need of this paramter.
}
$ScheduleInfo = @{
Interval = 'PT15M'
ScheduleKind = 'FrequencyBased'
}
$RetentionPolicy = @{
RetentionPolicyType = 'Basic'
RetentionDuration = 'P10D'
}
$BackupPolicy = @{
Name = 'BackupPolicy1'
MaxIncrementalBackups = 20
Schedule = $ScheduleInfo
Storage = $StorageInfo
RetentionPolicy = $RetentionPolicy
}
$body = (ConvertTo-Json $BackupPolicy)
$url = "https://mysfcluster.southcentralus.cloudapp.azure.com:19080/BackupRestore/BackupPolicies/$/Create?api-version=6.4"
Invoke-WebRequest -Uri $url -Method Post -Body $body -ContentType 'application/json' -CertificateThumbprint '1b7ebe2174649c45474a4819dafae956712c31d3'
Service Fabric Explorer の使用
Service Fabric Explorer で、左側のパネルの [クラスター] をクリックし、[バックアップ] タブに移動して [アクション] > [バックアップ ポリシーの作成] を選択します。
情報を入力します。 頻度ベースの間隔を指定する方法の詳細については、「TimeGrain プロパティ」を参照してください。 Azure クラスターの場合は、[ManagedIdentityAzureBlobStore] を選択する必要があります。
定期バックアップを有効にする
アプリケーションのデータ保護要件を満たすバックアップ ポリシーを定義した後、そのポリシーをアプリケーションに関連付けする必要があります。 バックアップ ポリシーは、要件に応じて、アプリケーション、サービス、またはパーティションに関連付けることができます。
Microsoft.ServiceFabric.Powershell.Http モジュールを使用した PowerShell
Enable-SFApplicationBackup -ApplicationId 'SampleApp' -BackupPolicyName 'BackupPolicy1'
PowerShell を使用した Rest の呼び出し
必要な REST API を呼び出して、上の手順で作成した BackupPolicy1
という名前のバックアップ ポリシーをアプリケーション SampleApp
に関連付けるために、以下の PowerShell スクリプトを実行します。
$BackupPolicyReference = @{
BackupPolicyName = 'BackupPolicy1'
}
$body = (ConvertTo-Json $BackupPolicyReference)
$url = "https://mysfcluster.southcentralus.cloudapp.azure.com:19080/Applications/SampleApp/$/EnableBackup?api-version=6.4"
Invoke-WebRequest -Uri $url -Method Post -Body $body -ContentType 'application/json' -CertificateThumbprint '1b7ebe2174649c45474a4819dafae956712c31d3'
Service Fabric Explorer の使用
クラスターで BackupRestoreService が有効になっていることを確認します。
Service Fabric Explorer を開きます。
アプリケーションを選択し、[バックアップ] セクションに移動します。 [バックアップ アクション] をクリックします。
[Enable/Update Application Backup](アプリケーションのバックアップを有効化/更新する) をクリックします。
最後に希望のポリシーを選択して、[バックアップの有効化] をクリックします。
定期バックアップが動作していることを確認する
アプリケーション レベルでのバックアップを有効にすると、アプリケーションの下で Reliable Stateful サービスと Reliable Actors に属しているすべてのパーティションで、バックアップ ポリシーに従って定期バックアップが開始されます。
バックアップを一覧表示する
GetBackups API を使用して、アプリケーションの Reliable Stateful サービスと Reliable Actors に属するすべてのパーティションに関連付けられているバックアップを列挙できます。 アプリケーション、サービス、またはパーティションのバックアップを列挙できます。
Microsoft.ServiceFabric.Powershell.Http モジュールを使用した PowerShell
Get-SFApplicationBackupList -ApplicationId WordCount
PowerShell を使用した Rest の呼び出し
HTTP API を呼び出して、SampleApp
アプリケーション内のすべてのパーティションに対して作成されたバックアップを列挙するために、以下の PowerShell スクリプトを実行します。
$url = "https://mysfcluster.southcentralus.cloudapp.azure.com:19080/Applications/SampleApp/$/GetBackups?api-version=6.4"
$response = Invoke-WebRequest -Uri $url -Method Get -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 :
Service Fabric Explorer の使用
Service Fabric Explorer でバックアップを表示するには、パーティションに移動し、[バックアップ] タブを選択します。
制限事項/注意事項
- Service Fabric PowerShell コマンドレットは、プレビュー モードです。
- Linux 上の Service Fabric クラスターはサポートされません。