你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在 Azure 中,使用 Windows 故障转移群集和共享磁盘为 SAP ASCS/SCS 实例安装 SAP NetWeaver HA

本文介绍如何通过使用 Windows Server 故障转移群集和群集共享磁盘,群集化 SAP ASCS/SCS 实例,在 Azure 中配置高可用性 SAP 系统。 如体系结构指南:使用群集共享磁盘在 Windows 故障转移群集上群集化 SAP ASCS/SCS 实例中所述,有两种群集共享磁盘的替代方案:

先决条件

在开始安装之前,请查看这些文档:

本文不会介绍 DBMS 安装,因为安装因所使用的 DBMS 系统而异。 本文假设 DBMS 在高可用性方面的疑虑已通过不同 DBMS 供应商为 Azure 提供的功能支持而获得解决。 例如,适用于 SQL Server 的 Always On 或数据库镜像,以及适用于 Oracle 数据库的 Oracle Data Guard。 本文不介绍 DBMS 的高可用性方案。

当不同的 DBMS 服务与 Azure 中的群集 SAP ASCS 或 SCS 配置交互时,不存在任何特殊注意事项。

注意

SAP NetWeaver ABAP 系统、Java 系统和 ABAP+Java 系统的安装过程几乎完全相同。 最明显的差别在于,SAP ABAP 系统只有一个 ASCS 实例。 SAP Java 系统有一个 SCS 实例。 SAP ABAP+Java 系统有一个 ASCS 实例和一个在相同 Microsoft 故障转移群集组中运行的 SCS 实例。 将明确说明每个 SAP NetWeaver 安装堆栈的所有安装差异。 可以假定剩余步骤都相同。

使用高可用性 ASCS/SCS 实例安装 SAP

重要

如果使用 SIOS 显示共享磁盘,请不要将页面文件放置在 SIOS DataKeeper 镜像卷上。 可将页面文件保留在 Azure 虚拟机的临时驱动器 D 上,这是默认值。 如果它尚未在该位置,请将 Windows 页面文件移到 Azure 虚拟机的驱动器 D。

安装包含高可用性 ASCS/SCS 实例的 SAP 系统的过程包括以下任务:

  • 为群集 SAP ASCS/SCS 实例创建虚拟主机名。
  • 在第一个群集节点上安装 SAP。
  • 修改 ASCS/SCS 实例的 SAP 配置文件。
  • 添加探测端口。
  • 打开 Windows 防火墙探测端口。

为群集 SAP ASCS/SCS 实例创建虚拟主机名

  1. 在 Windows DNS 管理器中为 ASCS/SCS 实例的虚拟主机名创建 DNS 条目。

    重要

    分配给 ASCS/SCS 实例的虚拟主机名的 IP 地址必须与分配给 Azure 负载均衡器的 IP 地址相同。

    Figure 1: Define the DNS entry for the SAP ASCS/SCS cluster virtual name and TCP/IP address

    定义 SAP ASCS/SCS 群集虚拟名称和 TCP/IP 地址的 DNS 条目

  2. 如果使用的是新的 SAP 排队复制服务器 2(也是群集实例),则还需要在 DNS 中为 ERS2 保留虚拟主机名。

    重要

    分配给 ERS2 实例的虚拟主机名的 IP 地址必须是分配给 Azure 负载均衡器的第二个 IP 地址。

    Figure 1A: Define the DNS entry for the SAP ASCS/SCS cluster virtual name and TCP/IP address

    定义 SAP ERS2 群集虚拟名称和 TCP/IP 地址的 DNS 条目

  3. 若要定义分配给虚拟主机名的 IP 地址,请选择“DNS 管理器”>“域” 。

    Figure 2: New virtual name and TCP/IP address for SAP ASCS/SCS cluster configuration

    SAP ASCS/SCS 群集配置的新虚拟名称和 TCP/IP 地址

安装 SAP 的第一个群集节点

  1. 在群集节点 A 上执行第一个群集节点选项:

    • ABAP 系统ASCS 实例编号 00
    • Java 系统SCS 实例编号 01
    • ABAP+Java 系统ASCS 实例编号 00SCS 实例编号 01

    重要

    请记住,Azure 内部负载均衡器的负载均衡规则的配置(如果使用基本 SKU)和所选的 SAP 实例编号必须匹配。

  2. 按照 SAP 说明的安装过程操作。 请确保在开始安装选项“第一个群集节点”中,选择“群集共享磁盘”作为配置选项。

提示

SAP 安装文档介绍如何安装第一个 ASCS/SCS 群集节点。

修改 ASCS/SCS 实例的 SAP 配置文件

如果运行的是排队复制服务器 1,请添加 SAP 配置文件参数 enque/encni/set_so_keepalive,如下所述。 配置文件参数可避免 SAP 工作进程与排队服务器之间的连接在空闲时间太长时关闭。 ERS2 不需要 SAP 参数。

  1. 如果使用的是 ERS1,则将此配置文件参数添加到 SAP ASCS/SCS 实例配置文件中。

    enque/encni/set_so_keepalive = true
    

    对于 ERS1 和 ERS2,请确保按 SAP 说明 1410736 中所述设置 keepalive OS 参数。

  2. 若要应用 SAP 配置文件参数更改,请重启 SAP ASCS/SCS 实例。

添加探测端口

使用内部负载均衡器探测功能,让整个群集配置使用 Azure Load Balancer。 Azure 内部负载均衡器通常在参与的虚拟机之间平均分配传入的工作负荷。

但是,这在某些群集配置中由于只有一个实例处于活动状态而不起作用。 其他实例处于被动状态,并且无法接受任何工作负荷。 当 Azure 内部负载均衡器检测处于活动状态的实例,并且仅将活动实例作为目标时,探测功能会很有帮助。

重要

在此示例配置中,“ProbePort” 设置为“620Nr”。 对于编号为“00”的 SAP ASCS 实例,则为“62000”。 你将需要调整配置,使其与 SAP 实例编号和 SAP SID 一致。

若要添加探测端口,请在其中一个群集 VM 上运行以下 PowerShell 模块:

  • 对于 SAP ASC/SCS 实例

    Set-AzureLoadBalancerHealthCheckProbePortOnSAPClusterIPResource -SAPSID SID -ProbePort 62000
    
  • 如果使用的是群集化的 ERS2。 不需要为 ERS1 配置探测端口,因为它不是群集实例。

    Set-AzureLoadBalancerHealthCheckProbePortOnSAPClusterIPResource -SAPSID SID -ProbePort 62001 -IsSAPERSClusteredInstance $True
    

函数 Set-AzureLoadBalancerHealthCheckProbePortOnSAPClusterIPResource 的代码如下:

 function Set-AzureLoadBalancerHealthCheckProbePortOnSAPClusterIPResource {

 <#
 .SYNOPSIS 
 Set-AzureLoadBalancerHealthProbePortOnSAPClusterIPResource will set a new Azure Load Balancer Health Probe Port on 'SAP $SAPSID IP' cluster resource.

 .DESCRIPTION
 Set-AzureLoadBalancerHealthProbePortOnSAPClusterIPResource will set a new Azure Load Balancer Health Probe Port on 'SAP $SAPSID IP' cluster resource.
 It will also restart SAP Cluster group (default behavior), to activate the changes. 

 You need to run it on one of the SAP ASCS/SCS Windows cluster nodes.

 Expectation is that SAP group is installed with official SWPM installation tool, which will set default expected naming convention for:
 - SAP Cluster Group:               'SAP $SAPSID'
 - SAP Cluster IP Address Resource: 'SAP $SAPSID IP' 

 .PARAMETER SAPSID 
 SAP SID - 3 characters staring with letter.

 .PARAMETER ProbePort 
 Azure Load Balancer Health Check Probe Port.

 .PARAMETER RestartSAPClusterGroup 
 Optional parameter. Default value is '$True', so SAP cluster group will be restarted to activate the changes.

 .PARAMETER IsSAPERSClusteredInstance 
 Optional parameter.Default value is '$False'.
 If set to $True , then handle clsutered new SAP ERS2 instance.

 .EXAMPLE 
 # Set probe port to 62000, on SAP cluster resource 'SAP AB1 IP', and restart the SAP cluster group 'SAP AB1', to activate the changes.
 Set-AzureLoadBalancerHealthCheckProbePortOnSAPClusterIPResource -SAPSID AB1 -ProbePort 62000 

 .EXAMPLE 
 # Set probe port to 62000, on SAP cluster resource 'SAP AB1 IP'. SAP cluster group 'SAP AB1' IS NOT restarted, therefore changes are NOT active.
 # To activate the changes you need to manualy restart 'SAP AB1' cluster group.
 Set-AzureLoadBalancerHealthCheckProbePortOnSAPClusterIPResource -SAPSID AB1 -ProbePort 62000 -RestartSAPClusterGroup $False

 .EXAMPLE 
 # Set probe port to 62001, on SAP cluster resource 'SAP AB1 ERS IP'. SAP cluster group 'SAP AB1 ERS' IS restarted, to activate the changes.
 Set-AzureLoadBalancerHealthCheckProbePortOnSAPClusterIPResource -SAPSID AB1 -ProbePort 62000 -IsSAPERSClusteredInstance $True

 #> 

     [CmdletBinding()]
     param(

         [Parameter(Mandatory=$True)]
         [ValidateNotNullOrEmpty()]  
         [ValidateLength(3,3)]      
         [string]$SAPSID,

         [Parameter(Mandatory=$True)]
         [ValidateNotNullOrEmpty()]        
         [int] $ProbePort,

         [Parameter(Mandatory=$False)] 
         [bool] $RestartSAPClusterGroup = $True,

         [Parameter(Mandatory=$False)] 
         [bool] $IsSAPERSClusteredInstance = $False
     )

     BEGIN{}

     PROCESS{
         try{                                      

             if($IsSAPERSClusteredInstance){
                 #Handle clustered SAP ERS Instance
                 $SAPClusterRoleName = "SAP $SAPSID ERS"
                 $SAPIPresourceName = "SAP $SAPSID ERS IP"            
             }else{
                 #Handle clustered SAP ASCS/SCS Instance
                 $SAPClusterRoleName = "SAP $SAPSID"
                 $SAPIPresourceName = "SAP $SAPSID IP"
             }

             $SAPIPResourceClusterParameters =  Get-ClusterResource $SAPIPresourceName | Get-ClusterParameter
             $IPAddress = ($SAPIPResourceClusterParameters | Where-Object {$_.Name -eq "Address" }).Value
             $NetworkName = ($SAPIPResourceClusterParameters | Where-Object {$_.Name -eq "Network" }).Value
             $SubnetMask = ($SAPIPResourceClusterParameters | Where-Object {$_.Name -eq "SubnetMask" }).Value
             $OverrideAddressMatch = ($SAPIPResourceClusterParameters | Where-Object {$_.Name -eq "OverrideAddressMatch" }).Value
             $EnableDhcp = ($SAPIPResourceClusterParameters | Where-Object {$_.Name -eq "EnableDhcp" }).Value
             $OldProbePort = ($SAPIPResourceClusterParameters | Where-Object {$_.Name -eq "ProbePort" }).Value

             $var = Get-ClusterResource | Where-Object {  $_.name -eq $SAPIPresourceName  }
             Write-Output "Current configuration parameters for SAP IP cluster resource '$SAPIPresourceName' are:" 

             Get-ClusterResource -Name $SAPIPresourceName | Get-ClusterParameter

             Write-Output " "
             Write-Output "Current probe port property of the SAP cluster resource '$SAPIPresourceName' is '$OldProbePort'." 
             Write-Output " "
             Write-Output "Setting the new probe port property of the SAP cluster resource '$SAPIPresourceName' to '$ProbePort' ..." 
             Write-Output " "

             $var | Set-ClusterParameter -Multiple @{"Address"=$IPAddress;"ProbePort"=$ProbePort;"Subnetmask"=$SubnetMask;"Network"=$NetworkName;"OverrideAddressMatch"=$OverrideAddressMatch;"EnableDhcp"=$EnableDhcp}

             Write-Output " "

             if($RestartSAPClusterGroup){
                 Write-Output ""
                 Write-Output "Activating changes..." 

                 Write-Output " "
                 Write-Output "Taking SAP cluster IP resource '$SAPIPresourceName' offline ..."
                 Stop-ClusterResource -Name $SAPIPresourceName
                 sleep 5

                 Write-Output "Starting SAP cluster role '$SAPClusterRoleName' ..."
                 Start-ClusterGroup -Name $SAPClusterRoleName

                 Write-Output "New ProbePort parameter is active." 
                 Write-Output " "

                 Write-Output "New configuration parameters for SAP IP cluster resource '$SAPIPresourceName':" 
                 Write-Output " " 
                 Get-ClusterResource -Name $SAPIPresourceName | Get-ClusterParameter
             }else
             {
                 Write-Output "SAP cluster role '$SAPClusterRoleName' is not restarted, therefore changes are not activated."
             }
         }
         catch{
            Write-Error  $_.Exception.Message
        }
     }
     END {}
 }

打开 Windows 防火墙探测端口

在两个群集节点上打开 Windows 防火墙探测端口。 使用以下脚本打开 Windows 防火墙探测端口。 更新环境的 PowerShell 变量。
如果使用的是 ERS2,则还需要为 ERS2 探测端口打开防火墙端口。

  $ProbePort = 62000   # ProbePort of the Azure internal load balancer
  New-NetFirewallRule -Name AzureProbePort -DisplayName "Rule for Azure Probe Port" -Direction Inbound -Action Allow -Protocol TCP -LocalPort $ProbePort

安装数据库实例

若要安装数据库实例,请按照 SAP 安装文档中所述的过程操作。

安装第二个群集节点

若要安装第二个群集,请按照 SAP 安装指南中所述的步骤操作。

安装 SAP 主应用程序服务器

在已指定为托管 PAS 的虚拟机上安装主应用程序服务器 (PAS) 实例 <SID>-di-0。 Azure 上没有依赖项。 如果使用的是 SIOS,则没有特定于 DataKeeper 的设置。

安装 SAP 附加应用程序服务器

在指定用于托管 SAP 应用程序服务器实例的所有虚拟机上安装 SAP 附加应用程序服务器 (AAS)。

测试 SAP ASCS/SCS 实例故障转移

对于概述的故障转移测试,假设 SAP ASCS 在节点 A 上处于活动状态。

  1. 验证 SAP 系统是否可以成功地从节点 A 故障转移到节点 B。选择以下选项之一,以启动将 SAP <SID> 群集组从群集节点 A 故障转移到群集节点 B:

    • 故障转移群集管理器
    • 故障转移群集 PowerShell
    $SAPSID = "PR1"     # SAP <SID>
    
    $SAPClusterGroup = "SAP $SAPSID"
    Move-ClusterGroup -Name $SAPClusterGroup
    
    
  2. 重启 Windows 来宾操作系统中的群集节点 A。 这会启动将 SAP <SID> 群集组从节点 A 故障转移到节点 B 的自动故障转移。

  3. 重启 Azure 门户中的群集节点 A。 这会启动将 SAP <SID> 群集组从节点 A 故障转移到节点 B 的自动故障转移。

  4. 使用 Azure PowerShell 重启群集节点 A。 这会启动将 SAP <SID> 群集组从节点 A 故障转移到节点 B 的自动故障转移。

  5. 验证

    • 故障转移后,验证 SAP <SID> 群集组是否在群集节点 B 上运行。

      Figure 8: In Failover Cluster Manager, the SAP <SID> cluster group is running on cluster node B

      在故障转移群集管理器中,SAP <SID> 群集组在群集节点 B 上运行

    • 故障转移后,请验证共享磁盘现在已装载到群集节点 B 上。

    • 故障转移后,如果使用 SIOS,请验证 SIOS DataKeeper 是否正在将群集节点 B 上的源卷驱动器 S 中的数据复制到群集节点 A 上的目标卷驱动器 S。

      Figure 9: SIOS DataKeeper replicates the local volume from cluster node B to cluster node A

      SIOS DataKeeper 将本地卷从群集节点 B 复制到群集节点 A