Azure Service Fabric 叢集中的定期備份和還原
Service Fabric 是開發及管理可靠分散式雲端應用程式的平台。 其同時支援無狀態和具狀態微服務。 具狀態服務可以將重要的資料保留在單一要求或交易之外。 如果具狀態服務關閉或遺失資料,可能需要從最近的備份還原,才能繼續正常運作。
Service Fabric 會將狀態複寫至多個節點,以確保服務具有高可用性。 即使叢集內的一個節點失敗,服務仍繼續可供使用。 不過,在某些情況下,仍然建議您讓服務資料能夠穩定可靠地面對更廣泛的失敗狀況。
例如,服務可以備份其資料,以針對下列情況提供防護:
- 發生整個 Service Fabric 叢集永久遺失的情況。
- 永久遺失多數的服務分割區複本
- 不小心刪除或損毀狀態的系統管理錯誤。 例如,具備足夠權限的系統管理員錯誤地刪除服務。
- 服務中造成資料損毀的錯誤。 例如,當服務程式碼升級而開始將錯誤資料寫入「可靠的集合」時,就可能發生此情況。 在這種情況下,可能必須將程式碼和資料還原成先前的狀態。
- 離線資料處理。 對於獨立於服務來產生資料的商業智慧,離線處理資料相當方便。
Service Fabric 提供內建的 API 來執行時間點備份與還原。 應用程式開發人員可以使用這些 API 來定期備份服務的狀態。 此外,如果服務管理員想要在特定時間 (例如在升級應用程式之前) 從服務外部觸發備份,開發人員就必須從服務將備份 (和還原) 公開為 API。 維護備份是這之外的一筆額外成本。 例如,您可以每半小時建立 5 個增量備份,接著再建立一個完整備份。 在建立完整備份之後,您便可以刪除先前的增量備份。 這個方法需要額外的程式碼,而會造成在應用程式開發期間產生額外的成本。
Service Fabric 中的備份與還原服務可讓您輕鬆自動備份具狀態服務中儲存的資訊。 定期備份應用程式資料是防止資料遺失和服務無法使用的基本原則。 Service Fabric 提供一項選用的備份與還原服務,可讓您無須撰寫任何額外的程式碼,即可設定具狀態 Reliable Services (包括「動作項目服務」) 的定期備份。 它也可以協助還原先前建立的備份。
Service Fabric 提供一組 API,可實現下列和定期備份與復原功能相關的功能:
- 排定可靠具狀態服務和 Reliable Actors 的定期備份,並支援將備份上傳至 (外部) 儲存體位置。 支援的儲存位置
- Azure 儲存體
- 檔案共用 (內部部署)
- 列舉備份
- 觸發分割區的臨機操作備份
- 使用先前的備份來還原分割區
- 暫時暫停備份
- 備份的保留管理 (即將推出)
必要條件
- 具有 Fabric 6.4 版或更新版本的 Service Fabric 叢集。 如需了解使用 Azure 資源範本來建立 Service Fabric 叢集的步驟,請參閱這篇文章。
- 用於加密祕密 (連線至儲存體以儲存備份時所需) 的 X.509 憑證。 若要了解如何取得或建立 X.509 憑證,請參閱這篇文章。
- 使用 Service Fabric SDK 3.0 版或更新版本來建置的 Service Fabric 可靠具狀態應用程式。 針對以 .Net Core 2.0 為目標的應用程式,則應該使用 Service Fabric SDK 3.1 版或更新版本來建置應用程式。
- 建立 Azure 儲存體帳戶來儲存應用程式備份。
- 安裝 Microsoft.ServiceFabric.PowerShell.Http 模組以進行設定呼叫。
Install-Module -Name Microsoft.ServiceFabric.Powershell.Http -AllowPrerelease
注意
如果 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 入口網站
在 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')]", ... }
現在,在
properties
區段底下新增下列addonFeatures
區段來啟用「備份與還原服務」,如下列程式碼片段所示:"properties": { ... "addonFeatures": ["BackupRestoreService"], "fabricSettings": [ ... ] ... }
設定用於加密認證的 X.509 憑證。 這很重要,可確保所提供來連線至儲存體的認證會先經過加密再進行保存。 在
fabricSettings
區段底下新增下列BackupRestoreService
區段來設定加密憑證,如下列程式碼片段所示:"properties": { ... "addonFeatures": ["BackupRestoreService"], "fabricSettings": [ { "name": "BackupRestoreService", "parameters": [ { "name": "SecretEncryptionCertThumbprint", "value": "[Thumbprint]" }, { "name": "SecretEncryptionCertX509StoreName", "value": "My" } ] }] ... }
注意
[指紋] 必須由要用來加密的有效憑證指紋取代。
在您更新叢集範本以反映先前的變更之後,請套用它們,然後讓部署/升級完成。 完成之後,「備份與還原服務」就會開始在您的叢集中執行。 此服務的 URI 是
fabric:/System/BackupRestoreService
,此服務可能位於 Service Fabric 總管中的系統服務區段底下。
啟用可靠具狀態服務和 Reliable Actors 的定期備份
以下步驟將逐步解說如何啟用可靠具狀態服務和 Reliable Actors 的定期備份。 這些步驟假設
- 叢集是使用 X.509 安全性搭配「備份與還原服務」設定的。
- 叢集上已部署可靠具狀態服務。 對於本快速入門指南來說,應用程式 URI 是
fabric:/SampleApp
,而屬於此應用程式的可靠具狀態服務 URI 是fabric:/SampleApp/MyStatefulService
。 此服務是使用單一分割區的,而分割區識別碼是974bd92a-b395-4631-8a7f-53bd4ae9cf22
。 - 在將可供叫用下面指令碼的電腦上,具備系統管理員角色的用戶端憑證已安裝於 CurrentUser 憑證存放區位置的 My (Personal) 存放區名稱中。 此範例使用
1b7ebe2174649c45474a4819dafae956712c31d3
作為此憑證的指紋。 如需有關用戶端憑證的詳細資訊,請參閱角色型存取控制 (適用於 Service Fabric 用戶端)。
建立備份原則
第一個步驟是建立備份原則。 此原則應包含備份排程、備份資料的目標儲存體、原則名稱、觸發完整備份之前允許的增量備份數目上限,以及備份儲存體的保留原則。
針對備份儲存體,請使用上面建立的 Azure 儲存體帳戶。 容器 backup-container
已設定為儲存備份。 如果具有此名稱的容器尚未存在,則會在備份上傳期間建立該容器。 以 Azure 儲存體帳戶 URL 填入 BlobServiceUri
,並將 account-name
取代為您的儲存體帳戶名稱,若有多個受控識別指派給資源,以使用者指派的受控識別的用戶端識別碼填入選用參數 ManagedIdentityClientId
。
請遵循 Azure 資源上指派受控識別的步驟:
在虛擬機器擴展集中啟用系統指派或使用者指派的受控識別 在虛擬機器擴展集上設定受控識別
將角色指派給儲存體帳戶的虛擬機器擴展集受控識別 使用 Azure 入口網站指派 Azure 角色 - Azure RBAC
- 至少儲存體 Blob 資料參與者角色
使用 Microsoft.ServiceFabric.PowerShell.Http 模組的 PowerShell
執行下列 PowerShell Cmdlet 建立新的備份原則。 將 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 呼叫
執行下列 PowerShell 指令碼,叫用必要的 REST API 來建立新原則。 將 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 呼叫
請執行下列 PowerShell 指令碼叫用必要的 REST API,以將在上述步驟中所建立名為 BackupPolicy1
的備份原則與應用程式 SampleApp
建立關聯。
$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。
選取應用程式並移至 [備份] 區段。 按一下 [備份動作]。
按一下 [啟用/更新應用程式備份]。
最後,選取所需的原則,然後按一下 [啟用備份]。
確認定期備份能夠運作
啟用應用程式層級的備份之後,所有屬於應用程式底下可靠具狀態服務和 Reliable Actors 的分割區,就會依據關聯的備份原則開始定期進行備份。
列出備份
您可以使用 GetBackups API,以列舉屬於應用程式可靠具狀態服務和 Reliable Actors 的所有分割區相關備份。 您可以列舉應用程式、服務或分割區的備份。
使用 Microsoft.ServiceFabric.PowerShell.Http 模組的 PowerShell
Get-SFApplicationBackupList -ApplicationId WordCount
使用 PowerShell 進行 REST 呼叫
請執行下列 PowerShell 指令碼來叫用 HTTP API,以列舉針對 SampleApp
應用程式內所有分割區建立的備份。
$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 Cmdlet 處於預覽模式。
- 不支援 Linux 上的 Service Fabric 叢集。