在独立 Service Fabric 中定期备份和还原

Service Fabric 是一种分布式系统平台,用于轻松开发和管理基于微服务的可靠的分布式云应用程序。 它允许运行无状态和有状态的微服务。 有状态服务可在请求和响应或完整的事务之外维持可变的权威状态。 如果某个有状态服务长时间不可用或由于灾难而丢失信息,则可能需要还原到其状态的某个最近备份,以便在其重新启动后继续提供服务。

Service Fabric 跨多个节点复制状态,确保服务高度可用。 即使群集中的一个节点出现故障,服务也将继续可用。 然而,在某些情况下,仍然需要服务数据能够可靠应对更广泛的故障。

例如,服务可能需要备份其数据,以防止出现以下情况:

  • 整个 Service Fabric 群集永久丢失。
  • 大部分服务分区副本永久丢失
  • 状态被意外删除或受损而引起管理错误。 例如,具有足够权限的管理员错误地删除了服务。
  • 服务中的 bug 导致数据损坏。 例如,当某个服务代码升级程序开始将错误数据写入到可靠集合中时可能发生此情况。 在此情况下,代码和数据可能都必须还原到先前的状态。
  • 离线数据处理。 对于商业智能来说使用离线处理的数据很方便,此处理是独立于生成数据的服务进行的。

Service Fabric 提供了一个内置 API,用于执行时间点备份和还原。 应用程序开发者可使用这些 API 定期备份服务状态。 此外,如果服务管理员想要在特定时间(例如,在升级应用程序之前)从服务外部触发备份,开发者需要将备份(和还原)作为服务的 API 公开。 维护备份是以上操作的额外成本。 例如,你可能希望每半小时进行 5 次递增备份,然后进行完整备份。 完整备份后,可删除以前的递增备份。 此方法需要额外的代码,因而在应用程序开发期间产生额外成本。

定期备份应用程序数据是管理分布式应用程序以及防范数据丢失或长时间丢失服务可用性的基本要求。 Service Fabric 提供可选的备份和还原服务,因此无需编写任何其他代码,便可配置有状态可靠服务(包括角色服务)的定期备份。 它还有助于还原以前执行的备份。

Service Fabric 提供了一组 API 以实现与定期备份和还原功能相关的以下功能:

  • 通过支持将备份上传到(外部)存储位置,计划可靠有状态服务和 Reliable Actors 的定期备份。 受支持的存储位置
    • Azure 存储
    • 文件共享(本地)
  • 枚举备份
  • 触发分区的计划外备份
  • 使用之前的备份还原分区
  • 暂时暂停备份
  • 备份的保留期管理(即将推出)

必备条件

  • 具有 Fabric 6.4 或更高版本的 Service Fabric 群集。 有关下载所需包的步骤,请参阅文章

  • 用于加密机密的 X.509 证书,连接到存储以存储备份时需要此机密。 请参阅文章,了解如何获取或创建一个自签名的 X.509 证书。

  • 使用 Service Fabric SDK 3.0 或更高版本生成的 Service Fabric 可靠有状态应用程序。 对于面向 .NET Core 2.0 的应用程序,应使用 Service Fabric SDK 3.1 或更高版本来生成应用程序。

  • 安装 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.chinaeast.cloudapp.chinacloudapi.cn:19080'   -X509Credential -FindType FindByThumbprint -FindValue '1b7ebe2174649c45474a4819dafae956712c31d3' -StoreLocation 'CurrentUser' -StoreName 'My' -ServerCertThumbprint '1b7ebe2174649c45474a4819dafae956712c31d3'  

启用备份和还原服务

首先,需要在群集中启用备份和还原服务 。 获取要部署的群集的模板。 可使用示例模板。 通过以下步骤启用备份和还原服务 :

  1. 检查在群集配置文件中 apiversion 是否设置为了 10-2017,如果没有,请按以下代码片段所示进行更新:

    {
        "apiVersion": "10-2017",
        "name": "SampleCluster",
        "clusterConfigurationVersion": "1.0.0",
        ...
    }
    
  2. 现在,通过在 properties 部分下添加以下 addonFeatures 部分来启用备份和还原服务,如以下代码片段所示:

        "properties": {
            ...
            "addonFeatures": ["BackupRestoreService"],
            "fabricSettings": [ ... ]
            ...
        }
    
    
  3. 配置 X.509 证书以用于加密凭据。 此步骤非常重要,可确保在保留之前对提供用于连接存储的凭据(如果有)进行加密。 通过在 fabricSettings 部分下添加以下 BackupRestoreService 部分来配置加密证书,如以下代码片段所示:

    "properties": {
        ...
        "addonFeatures": ["BackupRestoreService"],
        "fabricSettings": [{
            "name": "BackupRestoreService",
            "parameters":  [{
                "name": "SecretEncryptionCertThumbprint",
                "value": "[Thumbprint]"
            },
            {
                "name": "SecretEncryptionCertX509StoreName",
                "value": "My"
            }]
        }
        ...
    }
    
  4. 通过前述更改更新群集配置文件后,应用更改并等待部署/升级完成。 完成后,备份和还原服务开始在群集中运行 。 此服务的 URI 为 fabric:/System/BackupRestoreService,并且此服务可位于 Service Fabric Explorer 中系统服务部分下。

启用可靠有状态服务和 Reliable Actors 的定期备份

让我们通过一些步骤来启用可靠有状态服务和 Reliable Actors 的定期备份。 这些步骤假定

  • 群集配置了备份和还原服务。
  • 在群集上部署了可靠有状态服务。 在本快速入门指南中,应用程序 URI 为 fabric:/SampleApp,属于此应用程序的可靠有状态服务的 URI 为 fabric:/SampleApp/MyStatefulService。 使用单个分区部署此服务,分区 ID 为 23aebc1e-e9ea-4e16-9d5c-e91a614fefa7

创建备份策略

第一步是创建描述备份计划的备份策略、备份数据的目标存储、策略名称、触发完整备份之前允许的最大递增备份以及备份存储的保留策略。

对于备份存储,请创建文件共享并为所有 Service Fabric 节点计算机提供对此文件共享的读写访问权限。 此示例假定名为 BackupStore 的共享存在于 StorageServer 上。

使用 Microsoft.ServiceFabric.PowerShell.Http 模块的 PowerShell


New-SFBackupPolicy -Name 'BackupPolicy1' -AutoRestoreOnDataLoss $true -MaxIncrementalBackups 20 -FrequencyBased -Interval 00:15:00 -FileShare -Path '\\StorageServer\BackupStore' -Basic -RetentionDuration '10.00:00:00'

使用 PowerShell 进行 Rest 调用

执行以下 PowerShell 脚本,调用所需的 REST API 来创建新策略。

$ScheduleInfo = @{
    Interval = 'PT15M'
    ScheduleKind = 'FrequencyBased'
}   

$StorageInfo = @{
    Path = '\\StorageServer\BackupStore'
    StorageKind = 'FileShare'
}

$RetentionPolicy = @{ 
    RetentionPolicyType = 'Basic'
    RetentionDuration =  'P10D'
}

$BackupPolicy = @{
    Name = 'BackupPolicy1'
    MaxIncrementalBackups = 20
    Schedule = $ScheduleInfo
    Storage = $StorageInfo
    RetentionPolicy = $RetentionPolicy
}

$body = (ConvertTo-Json $BackupPolicy)
$url = "http://localhost:19080/BackupRestore/BackupPolicies/$/Create?api-version=6.4"

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

使用 Service Fabric Explorer

  1. 在 Service Fabric Explorer 中,导航到“备份”选项卡,然后选择“操作”>“创建备份策略”。

    Create Backup Policy

  2. 填写信息。 对于独立群集,应选择 FileShare。

    Create Backup Policy FileShare

启用定期备份

在定义策略以满足应用程序的数据保护要求后,备份策略应与应用程序相关联。 根据需要,备份策略可与应用程序、服务或分区相关联。

使用 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 = "http://localhost:19080/Applications/SampleApp/$/EnableBackup?api-version=6.4"

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

使用 Service Fabric Explorer

  1. 选择应用程序,然后访问操作。 单击“启用/更新应用程序备份”。

    Enable Application Backup

  2. 最后,选择所需的策略,然后选择“启用备份”。

    Select Policy

验证定期备份是否正常工作

对应用程序启用备份后,属于应用程序下的可靠有状态服务和 Reliable Actors 的所有分区将根据关联的备份策略开始定期备份。

Partition BackedUp Health Event

列出备份

可使用 GetBackups API 来枚举属于应用程序的可靠有状态服务和 Reliable Actors 的所有分区的关联备份 。 根据需要,可为应用程序、服务或分区枚举备份。

使用 Microsoft.ServiceFabric.PowerShell.Http 模块的 PowerShell

    Get-SFApplicationBackupList -ApplicationId WordCount     

使用 PowerShell 进行 Rest 调用

执行以下 PowerShell 脚本,调用 HTTP API 来枚举为 SampleApp 应用程序内所有分区创建的备份。

$url = "http://localhost:19080/Applications/SampleApp/$/GetBackups?api-version=6.4"

$response = Invoke-WebRequest -Uri $url -Method Get

$BackupPoints = (ConvertFrom-Json $response.Content)
$BackupPoints.Items

上述运行的示例输出:

BackupId                : d7e4038e-2c46-47c6-9549-10698766e714
BackupChainId           : d7e4038e-2c46-47c6-9549-10698766e714
ApplicationName         : fabric:/SampleApp
ServiceName             : fabric:/SampleApp/MyStatefulService
PartitionInformation    : @{LowKey=-9223372036854775808; HighKey=9223372036854775807; ServicePartitionKind=Int64Range; Id=23aebc1e-e9ea-4e16-9d5c-e91a614fefa7}
BackupLocation          : SampleApp\MyStatefulService\23aebc1e-e9ea-4e16-9d5c-e91a614fefa7\2018-04-01 19.39.40.zip
BackupType              : Full
EpochOfLastBackupRecord : @{DataLossNumber=131670844862460432; ConfigurationNumber=8589934592}
LsnOfLastBackupRecord   : 2058
CreationTimeUtc         : 2018-04-01T19:39:40Z
FailureError            : 

BackupId                : 8c21398a-2141-4133-b4d7-e1a35f0d7aac
BackupChainId           : d7e4038e-2c46-47c6-9549-10698766e714
ApplicationName         : fabric:/SampleApp
ServiceName             : fabric:/SampleApp/MyStatefulService
PartitionInformation    : @{LowKey=-9223372036854775808; HighKey=9223372036854775807; ServicePartitionKind=Int64Range; Id=23aebc1e-e9ea-4e16-9d5c-e91a614fefa7}
BackupLocation          : SampleApp\MyStatefulService\23aebc1e-e9ea-4e16-9d5c-e91a614fefa7\2018-04-01 19.54.38.zip
BackupType              : Incremental
EpochOfLastBackupRecord : @{DataLossNumber=131670844862460432; ConfigurationNumber=8589934592}
LsnOfLastBackupRecord   : 2237
CreationTimeUtc         : 2018-04-01T19:54:38Z
FailureError            : 

BackupId                : fc75bd4c-798c-4c9a-beee-e725321f73b2
BackupChainId           : d7e4038e-2c46-47c6-9549-10698766e714
ApplicationName         : fabric:/SampleApp
ServiceName             : fabric:/SampleApp/MyStatefulService
PartitionInformation    : @{LowKey=-9223372036854775808; HighKey=9223372036854775807; ServicePartitionKind=Int64Range; Id=23aebc1e-e9ea-4e16-9d5c-e91a614fefa7}
BackupLocation          : SampleApp\MyStatefulService\23aebc1e-e9ea-4e16-9d5c-e91a614fefa7\2018-04-01 20.09.44.zip
BackupType              : Incremental
EpochOfLastBackupRecord : @{DataLossNumber=131670844862460432; ConfigurationNumber=8589934592}
LsnOfLastBackupRecord   : 2437
CreationTimeUtc         : 2018-04-01T20:09:44Z
FailureError            : 

使用 Service Fabric Explorer

若要在 Service Fabric Explorer 中查看备份,请导航到一个分区,然后选择“备份”选项卡。

Enumerate Backups

限制/注意事项

  • Service Fabric PowerShell cmdlet 处于预览模式。
  • Linux 上不支持 Service Fabric 群集。

后续步骤