Lync Server 2013 中的前端池 ABC 故障转移过程

 

上次修改的主题: 2014-05-22

使用以下步骤执行 ABC 故障转移过程。 此过程包含每个步骤的高级说明,后跟要为每个步骤运行的命令和 cmdlet。

若要运行 cmdlet,请使用“以管理员身份运行”打开 Lync Server Management Shell。

执行 ABC 故障转移

  1. 检查池 A 是否为中央管理服务器的主机 (CMS) 。

    • 运行以下 cmdlet:

      Get-CsService -CentralManagement
      

      如果活动 CMS 的标识字段指向池 A 的完全限定域名 (FQDN) ,则使用此过程的步骤 2 和 3 首先故障转移中央管理服务器。 否则,请跳到步骤 4。

  2. 通过运行以下 cmdlet,在灾难恢复模式下将 CMS 故障转移到池 B:

    Invoke-CsManagementServerFailover -BackupSqlServerFqdn <Pool B BE FQDN> -BackupSqlInstanceName <Pool B BE instance name> [-BackupMirrorSqlServerFqdn <Pool B Mirror BE FQDN> -BackupMirrorSqlInstanceName <Pool B Mirror BE Instance name>] -Force -Verbose
    

    执行此操作后,建议将 CMS 从池 B 移动到另一个现有配对池,以获得额外的复原能力。 有关详细信息,请参阅 Move-CsManagementServer.

  3. 如果池 A 包含 CMS,请将 LIS 配置从池 A 导入池 B 的 LIS 数据库 (Lis.mdf) 。 只有在定期备份 LIS 数据时,此操作才有效。 若要导入 LIS 配置,请运行以下 cmdlet:

    Import-CsLisConfiguration -FileName <String> 
    Publish-CsLisConfiguration
    
  4. 将备份的 Lync Server 响应组服务工作流从池 A 导入池 B。

    注意

    目前, Import-CsRgsConfiguration cmdlet 要求池 A 上的队列和工作流名称不同于池 B 上的队列和工作流名称。如果名称不重复,则运行 Import-CsRgsConfiguration cmdlet 时会收到错误,在继续使用 Import-CsRgsConfiguration cmdlet 之前,需要在池 B 中重命名队列和工作流。

    有两个选项用于将响应组配置从池 A 导入到池 B。使用哪种选项取决于是否要使用池 A 中的应用程序级别设置覆盖池 B 的应用程序级别设置。

    • 如果要覆盖池 B 设置,请使用 ReplaceExistingSettings 选项运行 Import-CsRgsConfiguration cmdlet:

      Import-CsRgsConfiguration -Destination "service:ApplicationServer:<Pool B FQDN>" -FileName "C:\RgsExportPrimary.zip"  -ReplaceExistingRgsSettings
      
    • 如果不想覆盖池 B 设置,请使用 Import-CsRgsConfiguration cmdlet,而不使用 ReplaceExistingSettings 选项。

      Import-CsRgsConfiguration -Destination "service:ApplicationServer:<Pool B FQDN>" -FileName "C:\RgsExportPrimary.zip"
      

    警告

    请记住,如果不想使用主池 (池 A) 的设置覆盖备份池 (池 B) 的应用程序级别设置,则池 A 的应用程序级别设置在池 A 丢失时将丢失,因为响应组应用程序每个池只能存储一组应用程序级别设置。 部署池 C 以替换池 A 时,必须重新配置应用程序级别设置,包括默认的保留音乐音频文件。

  5. 通过运行以下 cmdlet 来显示导入的响应组,验证响应组配置导入是否成功。 请注意,导入的响应组仍归池 A 所有。

    Get-CsRgsWorkflow -Identity "service:ApplicationServer:<Pool B FQDN>" -Owner "service:ApplicationServer:<Pool A FQDN>"
    
    Get-CsRgsQueue -Identity "service:ApplicationServer:<Pool B FQDN>" -Owner "service:ApplicationServer:<Pool A FQDN>"
    
    Get-CsRgsAgentGroup -Identity "service:ApplicationServer:<Pool B FQDN>" -Owner "service:ApplicationServer:<Pool A FQDN>"
    
  6. 对于未分配的数字,请将使用“公告”作为所选公告服务的未分配号码范围从池 A 移动到池 B。为此,请执行以下操作:

    • 重新创建池 B 上的池 A 中部署的所有公告。如果在池 A 中部署公告时使用了任何音频文件,则需要使用这些文件在池 B 中重新创建公告。若要在池 B 中重新创建公告,请使用将池 B 作为父服务的 New-CsAnnouncement cmdlet。

    • 将池 A 中针对公告的所有未分配号码范围重定向到池 B 中新部署的公告。针对面向池 A 公告的每个未分配号码范围运行以下 cmdlet:

      Set-CsUnassignedNumber -Identity "<Range Name>" -AnnouncementService "<Pool B FQDN>" -AnnouncementName "<New Announcement in pool B>"
      

    注意

    对于使用“Exchange UM”作为所选公告服务的未分配号码范围,不需要执行此步骤。

  7. 通过运行以下 cmdlet,在灾难恢复 (DR) 模式下将池 A 故障转移到池 B:

    Invoke-CsPoolFailover -PoolFqdn <Pool A FQDN> -DisasterMode
    
  8. 生成池 C,但不要在池 C 上启动任何服务。

    请注意,此步骤可以与步骤 5 和 6 并行执行。

  9. 通过运行以下 cmdlet,强制托管在池 A 上的用户移动到池 C:

    Get-csuser -Filter {RegistrarPool -eq "<Pool A FQDN>"} | Move-CsUser -Target <Pool C FQDN> -Force
    

    此时,托管在池 A 上的用户将开始遇到服务中断。 此中断将一直持续到步骤 16,此时池 C 上会启动服务。

  10. 通过运行以下 cmdlet,强制池 A 的会议目录移动到池 C:

    Move-CsConferenceDirectory -Identity <Conference Directory ID of Pool A> -TargetPool <Pool C FQDN> -Force
    
  11. 通过运行以下 cmdlet,强制会议自动助理 (CAA) 联系人对象从池 A 移动到池 C:

    Move-csApplicationEndpoint -Identity "<Pool A CAA Uri>" -targetApplicationPool <Pool C FQDN> -force
    
  12. 将会议内容从池 B 复制到池 C。

  13. 通过运行以下 cmdlet 从池 B 导出用户数据并将用户数据导入池 C:

    Export-CsUserData -PoolFqdn <Pool B Fqdn> -FileName <String>
    Import-CsUserData -PoolFqdn <Pool C Fqdn> -FileName <String>
    
  14. 将备份的呼叫寄存应用程序数据从池 A 还原到池 C,并将池 A 的呼叫寄存轨道范围分配给池 C。

    • 可以通过 Lync Server 控制面板或 Lync Server Management Shell 将池 A 的呼叫寄存轨道范围重新分配到池 C。 对于 Lync Server Management Shell,请针对分配给池 A 的每个呼叫寄存轨道范围运行以下 cmdlet (请注意,标识参数指的是属于池 A) 的呼叫寄存轨道范围:

      Set-CsCallParkOrbit -Identity "<Call Park Orbit Identity>" -CallParkService "service:ApplicationServer:<Pool C FQDN>"
      
    • 如果已为池 A 中的呼叫寄存配置了自定义音乐保留,请在池 C 中还原呼叫寄存自定义音乐保留文件。

      Xcopy <Source> <Destination: Pool C CPS File Store Path>
      

      例如:

      Xcopy "Source Path" "<Pool C File Store Path>\OcsFileStore\coX-ApplicationServer-X\AppServerFiles\CPS\"
      
    • 最后,使用 Set-CsCpsConfiguration cmdlet 在池 C 上重新配置呼叫寄存设置。 呼叫寄存应用程序每个池只能存储一组设置和一个自定义音乐保留音频文件,在发生灾难时不会备份或保留这些设置。

  15. 如果持久聊天的下一个跃点池指向池 A,请进行拓扑更改并发布,以便下一跃点服务器指向池 C。

    • 在拓扑生成器中,将持久聊天池更改为指向池 C 作为下一跃点。 为此,请右键单击持久聊天池,然后单击“ 常规 ”选项卡,然后在 下一跃点池中键入池 C 的名称。

    • 通过运行以下 cmdlet 在池 C 上启动服务:

      Start-csWindowsService
      

    此时,最初托管在池 A 上的用户的服务中断结束。

  16. 通过运行以下 cmdlet,从池 A 拥有的池 B 导出 Lync Server 响应组服务工作流以导入池 C:

    Export-CsRgsConfiguration -Source "service:ApplicationServer:<Pool B FQDN>" -Owner "service:ApplicationServer:<Pool A FQDN>" -FileName "C:\RgsExportPrimaryUpdated.zip" 
    
  17. 从池 B 将 Lync Server 响应组服务工作流导入池 C。

    有两个选项用于将响应组配置从池 B 导入到池 C。使用哪种选项取决于是否要使用池 B 中的应用程序级别设置覆盖池 C 的应用程序级别设置。

    • 如果要覆盖池 C 设置,请使用 ReplaceExistingSettings 选项运行 Import-CsRgsConfiguration cmdlet:

      Import-CsRgsConfiguration -Destination "service:ApplicationServer:<Pool C FQDN>" -FileName "C:\RgsExportPrimary.zip"  -ReplaceExistingRgsSettings
      
    • 如果不想覆盖池 C 设置,请使用 Import-CsRgsConfiguration cmdlet,而不使用 ReplaceExistingSettings 选项。

      Import-CsRgsConfiguration -Destination "service:ApplicationServer:<Pool B FQDN>" -FileName "C:\RgsExportPrimary.zip"
      

    警告

    请记住,如果不想使用备份池 B) (池的设置覆盖池 C 的应用程序级别设置,池 B 的应用程序级别设置将丢失,因为响应组应用程序每个池只能存储一组应用程序级别设置。

  18. 通过运行以下 cmdlet 来显示已导入到池 C 的响应组,验证响应组配置导入是否成功。

    Get-CsRgsWorkflow -Identity "service:ApplicationServer:<Pool C FQDN>" -ShowAll
     Get-CsRgsQueue -Identity "service:ApplicationServer:<Pool C FQDN>" -ShowAll
    Get-CsRgsAgentGroup -Identity "service:ApplicationServer:<Pool C FQDN>" -ShowAll
    
  19. 在池 C 中验证导入的配置后,从池 B 中删除主池拥有的响应组。这将最大程度地减少响应组的停机时间。

    此步骤使用导出的配置创建新文件,然后从池 B 中删除该文件。

    Export-CsRgsConfiguration -Source "service:ApplicationServer:<Pool B FQDN>" -Owner "service:ApplicationServer:<Pool A FQDN>" -FileName "C:\RgsExportPrimaryUpdated.zip" -RemoveExportedConfiguration
    
  20. 从池 A 移动到池 B 的未分配数字范围移动到池 C。

    • 在池 C 中重新创建从池 B 中的池 A 重新创建的所有公告。如果在部署要移动的公告时使用了任何音频文件,则需要使用这些文件在池 C 中重新创建公告。若要在池 C 中重新创建公告,请使用 New-CsAnnouncement cmdlet,其中池 C 作为父服务。

    • 重定向到池 C 所有从池 A 重定向到池 B 的未分配号码范围。对于需要重新定向的每个未分配号码范围,请运行以下 cmdlet:

      Set-CsUnassignedNumber -Identity "<Range Name>" -AnnouncementService "<Pool C FQDN>" -AnnouncementName "<New Announcement in pool C>"
      
    • (可选) 从池 B 中删除在池 C 中重新创建的公告(如果它们不再在池 B 中使用)。若要删除公告,请使用 Remove-CsAnnouncement cmdlet。

      注意

      对于使用“Exchange UM”作为公告服务的未分配号码范围,不需要执行此步骤。

  21. 通过运行以下 cmdlet 清理池 B 中池 A 的用户数据:

    Remove-CsUserStoreBackupData -PoolFqdn <Pool B FQDN> -Verbose
    
  22. 在拓扑生成器中执行以下操作:

    • 取消修复池 A 和池 B。配对池 B 和池 C。然后从拓扑中删除池 A 并发布它。 为此:

      • 在拓扑生成器中,右键单击池 B,然后单击 “编辑属性”。

      • 单击左窗格中的 复原能力

      • 在“ 关联备份池”下方的框中,选择“池 C”。请注意,关联的备份池选择框最初将显示池 A,因为池 B 以前与此池相关联。

      • 选择“语音的自动故障转移和故障回复”,然后单击“确定”。

        当你查看该池的详细信息时,此时关联的池显示在“复原”下的右窗格中。

      • 在控制台树中,右键单击池 A,然后单击“删除”。

      • 发布拓扑。

  23. 在池 C 上运行启动应用程序以安装备份服务应用程序,然后通过在池 C 中的本地计算机上的部署文件夹运行以下命令启动备份服务应用程序:

    Run "%SYSTEMROOT%\Program Files\Microsoft Lync Server 2013\Deployment\Bootstrapper.exe"
    Start-CsWindowsService -name LyncBackup
    
  24. 通过运行以下 cmdlet 在池 B 上重启备份服务应用程序:

    Stop-CsWindowsService -name LyncBackup
    Start-CsWindowsService -name LyncBackup
    
  25. 如果池 C 是标准版 (SE) 池和池 B 具有 CMS,请通过运行以下 cmdlet 在池 C 上手动安装 CMS 数据库:

    Install-CsDatabase -CentralManagementDatabase -SqlServerFqdn <Pool C FQDN> -SqlInstanceName rtc
    
  26. 调用备份服务,将旧会议内容从池 B 同步到池 C,这些内容是在将 B 和 C 配对在一起之前生成的,并将新会议内容从池 C 同步到池 B,这些内容是在启动池 C 和 B 和 C 配对之前生成的。 为此,请运行以下 cmdlet:

    Invoke-CsBackupServiceSync -PoolFqdn <Pool C FQDN>
    Invoke-CsBackupServiceSync -PoolFqdn <Pool B FQDN>
    
  27. 对于与池 A 关联的每个 Survivable Branch Appliance X:

    • 通过运行以下 cmdlet 关闭 SBA X:

      Stop-CsWindowsService
      
    • 创建一个文件,其中包含 SBA X 上托管的用户列表。在步骤 30 中将用户移回 SBA X 时,将需要该列表。 为此,请运行以下 cmdlet:

      Get-CsUser -Filter {RegistrarPool -eq "<SBA X FQDN>"} | Export-Csv d:\sbaxusers.txt
      
    • 通过运行以下 cmdlet,强制 SBA X 上的用户移动到池 C:

      Get-CsUser -Filter {RegistrarPool -eq "<SBA X FQDN>"} | Move-CsUser -Target <Pool C FQDN> -Force -Verbose
      
    • 首先运行以下 cmdlet 更新这些用户的数据:

      Convert-csUserData -InputFile <Data file exported from PoolB> -OutputFile c:\Logs\ExportedUserData.xml -TargetVersionLync2010 
      $a=get-csuser -Filter {RegistrarPool -eq "FQDN of SBA X"} | select SipAddress
      foreach($x in $a) {$x.SipAddress.Substring(4) >> users.txt}
      

      然后运行此脚本:

      $users=gc c:\logs\users.txt
      foreach ($user in $users)
      {
      Update-CsUserData -FileName c:\logs\exportedUserDAta.xml -UserFilter $user - 
      }
      

      注意

      在将这些用户移到池 C 之前,与池 A 关联的 SVA 上托管的用户将发生服务中断。

  28. 在拓扑生成器中,对于以前与池 A 关联的每个 SBA X,请执行以下操作:

    • 将关联更改为池 C。为此,请单击分支站点,展开 Survivable Branch Appliance 或 Servers 节点,然后单击 Survivable Branch Appliance。 然后选择 前端池, 即此 Survivable Branch 设备将作为池 C 连接到的用户服务池,然后单击 “下一步”。

    • 发布拓扑。 为此,在控制台树中,右键单击新的 Survivable Branch 设备,单击 拓扑,然后单击 “发布”。

  29. 对于现在与池 C 关联的每个 SBA X:

    • 通过在可生存分支设备上运行以下 cmdlet 来启动 SBA X:

      Start-CsWindowsService
      
    • 通过运行以下 cmdlet,将最初托管在 SBA X 上的用户从池 C 移动到 SBA X。

      Import-Csv d:\sbaxusers.txt | Move-CsUser -Target <SBA X FQDN> -Force