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

配置工作组可用性组

适用于:Azure VM 上的 SQL Server

本文介绍使用 AlwaysOn 可用性组创建与 Active Directory 域无关的群集所需的步骤;也称为工作组群集。 本文重点介绍与准备和配置工作组和可用性组相关的步骤。 它对其他文章中详细描述的步骤轻描淡写,例如如何创建群集或部署可用性组。

先决条件

若要配置工作组可用性组,需要满足以下先决条件:

  • 至少两台运行 SQL Server 2016(或更高版本)的 Windows Server 2016(或更高版本)虚拟机,并使用静态 IP 地址将其部署到相同的可用性集或不同的可用性区域。
  • 子网上至少有四个可用 IP 地址的本地网络。
  • 在管理员组中的每台计算机上都有一个帐户,该帐户在 SQL Server 内也拥有 sysadmin 权限。
  • 打开端口:TCP 1433、TCP 5022、TCP 59999。

为了参考,本文使用了以下参数,但可以根据需要进行修改:

名称 参数
Node1 AGNode1 (10.0.0.4)
Node2 AGNode2 (10.0.0.5)
群集名称 AGWGAG (10.0.0.6)
侦听器 AGListener (10.0.0.7)
DNS 后缀 ag.wgcluster.example.com
工作组名称 AGWorkgroup

设置 DNS 后缀

在此步骤中,为这两个服务器配置 DNS 后缀。 例如,ag.wgcluster.example.com。 通过此设置,可以使用要连接到的对象的名称作为网络中的完全限定地址,例如 AGNode1.ag.wgcluster.example.com

若要配置 DNS 后缀,请执行以下步骤:

  1. 使用 Bastion 连接到第一个节点并打开服务器管理器。

  2. 选择“本地服务器”,然后在“计算机名称”下选择虚拟机的名称 。

  3. 选择“重命名此计算机…”下的“更改…” 。

  4. 工作组 名称更改为有意义的内容,例如 AGWORKGROUP

    显示“计算机名称/Doman 更改”对话框的屏幕截图,其中选择了“工作组”,并输入了名称“AGWORKGROUP”。

  5. 选择“更多…”以打开“DNS 后缀和 NetBIOS 计算机名”对话框 。

  6. 在此 计算机的主 DNS 后缀下输入 DNS 后缀的名称,例如 ag.wgcluster.example.com ,然后选择“ 确定” :

    显示“DNS 后缀和 NetBIOS 计算机名”对话框的屏幕截图,其中输入了值 ag.wgcluster.example.com。

  7. 确认“完整计算机名”现在已显示 DNS 后缀,然后选择“确定”保存更改 :

    显示“计算机名称/Doman 更改”对话框的屏幕截图,其中突出显示了“完整计算机名”。

  8. 当系统提示你执行此作时,请重新启动服务器。

  9. 在要用于可用性组的任何其他节点上重复这些步骤。

编辑主机文件

由于此配置中没有 Active Directory,因此无法对 Windows 连接进行身份验证。 因此,请通过使用文本编辑器编辑主机文件来分配信任。

若要编辑主机文件,请执行以下步骤:

  1. 使用 Bastion 连接到虚拟机。

  2. 使用文件资源管理器以转到

  3. 右键单击 hosts 文件,然后使用记事本(或任何其他文本编辑器)打开该文件 。

  4. 在该文件末尾,以 IP Address, DNS Suffix #comment 的形式为每个节点、可用性组和侦听器添加一个条目,如下所示:

    10.0.0.4 AGNode1.ag.wgcluster.example.com #Availability group node
    10.0.0.5 AGNode2.ag.wgcluster.example.com #Availability group node
    10.0.0.6 AGWGAG.ag.wgcluster.example.com #Cluster IP
    10.0.0.7 AGListener.ag.wgcluster.example.com #Listener IP
    

    记事本中主机文件的屏幕截图。每个新节点的 IP 地址、群集和侦听器的新条目将添加到文件末尾。

设置权限

由于没有 Active Directory 来管理权限,因此需要手动允许非内置本地管理员帐户创建群集。

若要执行此操作,请在每个节点上的 PowerShell 管理会话中运行以下 PowerShell cmdlet:

new-itemproperty -path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System -Name LocalAccountTokenFilterPolicy -Value 1

创建故障转移群集

在此步骤中,将创建故障转移群集。 如果不熟悉这些步骤,请参阅 故障转移群集教程中的“创建 Windows 故障转移群集”。

故障转移群集教程与工作组群集所需操作之间的显著差异:

  • 运行群集验证时,取消选中“存储”和“存储空间直通” 。

  • 将节点添加到群集时,添加完全限定的名称,例如:

    • AGNode1.ag.wgcluster.example.com
    • AGNode2.ag.wgcluster.example.com
  • 取消选中“将所有符合条件的存储添加到群集”。

创建群集后,分配静态群集 IP 地址。 为此,请执行下列步骤:

  1. 在某个节点上,打开故障转移群集管理器,选择群集,右键单击<下的“名称:>ClusterName”,然后选择“属性”。

    显示如何在“FailoverCluster Manger”中编辑群集属性的屏幕截图。

  2. 选择“IP 地址”下的 IP 地址,然后选择“编辑” 。

  3. 选择“使用静态”,提供群集的 IP 地址,然后选择“确定” :

    显示如何编辑群集的静态 IP 地址的屏幕截图。

  4. 验证是否已正确进行设置,然后选择“确定”以保存设置:

    显示用于验证的群集属性的屏幕截图。

创建云见证

在此步骤中,配置云共享见证。 如果不熟悉这些步骤,请参阅为故障转移群集部署云见证

启用可用性组功能

在此步骤中,启用可用性组功能。 如果尚不熟悉这些步骤,请参阅可用性组教程

创建密钥和证书

在此步骤中,创建 SQL 登录在加密的终结点上使用的证书。 在每个节点上创建一个文件夹来保存证书备份,如 c:\certs

注意

如果未指定证书的到期日期,则自创建之日起一年内有效。 如果证书过期,则终结点之间的连接将失败。

若要配置第一个节点,请执行以下步骤:

  1. 打开 SQL Server Management Studio 并连接到第一个节点,例如

  2. 更新为复杂且安全的密码后,打开“新建查询”窗口并运行以下 Transact-SQL (T-SQL) 语句:

    USE master;
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'PassWOrd123!';
    GO
    
    --create a cert from the master key
    USE master;
    CREATE CERTIFICATE AGNode1Cert
       WITH SUBJECT = 'AGNode1 Certificate';
    GO
    
    --Backup the cert and transfer it to AGNode2
    BACKUP CERTIFICATE AGNode1Cert TO FILE = 'C:\certs\AGNode1Cert.crt';
    GO
    
  3. 接下来,创建 HADR 终结点,并通过运行以下 Transact-SQL (T-SQL) 语句使用证书进行身份验证:

    --CREATE or ALTER the mirroring endpoint
    CREATE ENDPOINT hadr_endpoint
       STATE = STARTED
       AS TCP (
          LISTENER_PORT=5022
          , LISTENER_IP = ALL
       )
       FOR DATABASE_MIRRORING (
          AUTHENTICATION = CERTIFICATE AGNode1Cert
          , ENCRYPTION = REQUIRED ALGORITHM AES
          , ROLE = ALL
       );
    GO
    
  4. 使用文件资源管理器以转到证书所在的文件位置,如

  5. 从第一个节点手动生成证书副本(如 AGNode1Cert.crt),并将其传输到第二个节点上的同一位置。

若要配置第二个节点,请执行以下步骤:

  1. 使用 SQL Server Management Studio 连接到第二个节点,例如

  2. 更新为复杂且安全的密码后,在“新建查询”窗口中运行以下 Transact-SQL (T-SQL) 语句:

    USE master;
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<complex password>';
    GO
    
    --create a cert from the master key
    USE master;
    CREATE CERTIFICATE AGNode2Cert
       WITH SUBJECT = 'AGNode2 Certificate';
    GO
    --Backup the cert and transfer it to AGNode1
    BACKUP CERTIFICATE AGNode2Cert TO FILE = 'C:\certs\AGNode2Cert.crt';
    GO
    
  3. 接下来,创建 HADR 终结点,并通过运行以下 Transact-SQL (T-SQL) 语句使用证书进行身份验证:

    --CREATE or ALTER the mirroring endpoint
    CREATE ENDPOINT hadr_endpoint
       STATE = STARTED
       AS TCP (
          LISTENER_PORT=5022
          , LISTENER_IP = ALL
       )
       FOR DATABASE_MIRRORING (
          AUTHENTICATION = CERTIFICATE AGNode2Cert
          , ENCRYPTION = REQUIRED ALGORITHM AES
          , ROLE = ALL
       );
    GO
    
  4. 使用文件资源管理器以转到证书所在的文件位置,如

  5. 从第二个节点手动生成证书副本(如 AGNode2Cert.crt),并将其传输到第一个节点上的同一位置。

如果群集中有任何其他节点,请重复执行这些步骤,并修改各自的证书名称。

创建登录名

证书身份验证用于跨节点同步数据。 若要允许同步,请为另一个节点创建登录名、为登录名创建用户、为登录名创建证书以使用备份证书,然后在镜像终结点上授予连接。

若要执行此操作,请首先在第一个节点(如 AGNode1)上运行以下 Transact-SQL (T-SQL) 查询:

--create a login for the AGNode2
USE master;
CREATE LOGIN AGNode2_Login WITH PASSWORD = '<complex password>';
GO

--create a user from the login
CREATE USER AGNode2_User FOR LOGIN AGNode2_Login;
GO

--create a certificate that the login uses for authentication
CREATE CERTIFICATE AGNode2Cert
   AUTHORIZATION AGNode2_User
   FROM FILE = 'C:\certs\AGNode2Cert.crt'
GO

--grant connect for login
GRANT CONNECT ON ENDPOINT::hadr_endpoint TO [AGNode2_login];
GO

接下来,在第二个节点(如 AGNode2)上运行以下 Transact-SQL (T-SQL) 查询:

--create a login for the AGNode1
USE master;
CREATE LOGIN AGNode1_Login WITH PASSWORD = '<complex password>';
GO

--create a user from the login
CREATE USER AGNode1_User FOR LOGIN AGNode1_Login;
GO

--create a certificate that the login uses for authentication
CREATE CERTIFICATE AGNode1Cert
   AUTHORIZATION AGNode1_User
   FROM FILE = 'C:\certs\AGNode1Cert.crt'
GO

--grant connect for login
GRANT CONNECT ON ENDPOINT::hadr_endpoint TO [AGNode1_login];
GO

如果群集中有任何其他节点,请同样在此处重复这些步骤,并修改各自的证书名称及用户名。

配置可用性组

在此步骤中,配置可用性组,并向其添加数据库。 目前不要创建侦听器。 如果尚不熟悉这些步骤,请参阅可用性组教程。 若要验证一切是否正常工作,请务必启动故障转移和故障恢复。

注意

如果在同步过程中发生故障,可能需要暂时授予 NT AUTHORITY\SYSTEM 帐户 sysadmin 权限,以在第一个节点上创建群集资源,例如 AGNode1

配置负载均衡器

在此最后一步中,使用 Azure 门户PowerShell 配置负载均衡器。

但是,使用 Windows 群集 GUI 时可能存在一些 限制 。 因此,应使用 PowerShell 通过以下示例脚本为侦听器创建客户端访问点或网络名称:

Add-ClusterResource -Name "IPAddress1" -ResourceType "IP Address" -Group "WGAG"
Get-ClusterResource -Name IPAddress1 | Set-ClusterParameter -Multiple @{"Network" = "Cluster Network 1";"Address" = "10.0.0.4";"SubnetMask" = "255.0.0.0";"EnableDHCP" = 0}
Add-ClusterResource -Name "IPAddress2" -ResourceType "IP Address" -Group "WGAG"
Get-ClusterResource -Name IPAddress2 | Set-ClusterParameter -Multiple @{"Network" = "Cluster Network 2";"Address" = "10.0.0.5";"SubnetMask" = "255.0.0.0";"EnableDHCP" = 0}
Add-ClusterResource -Name "TestName" -Group "WGAG" -ResourceType "Network Name"
Get-ClusterResource -Name "TestName" | Set-ClusterParameter -Multiple @{"DnsName" = "TestName";"RegisterAllProvidersIP" = 1}
Set-ClusterResourceDependency -Resource TestName -Dependency "[IPAddress1] or [IPAddress2]"
Start-ClusterResource -Name TestName -Verbose

配置探测端口

使用 Azure 负载均衡器支持虚拟网络名称(VNN)资源时,必须将群集配置为回复运行状况探测请求。 如果运行状况探测无法从后端实例获取响应,则在运行状况探测再次成功之前,不会向该后端实例发送新连接。

若要在 PowerShell 中设置探测端口参数,请根据适用的 IP 地址资源使用以下脚本一次:

$ClusterNetworkName = "<MyClusterNetworkName>" # The cluster network name. Use Get-ClusterNetwork on Windows Server 2012 or later to find the name.
$IPResourceName = "<IPResourceName>" # The IP address resource name.
[int]$ProbePort = <nnnnn> # The probe port that you configured in the health probe of the load balancer for a given Frontend IP Address. Any unused TCP port is valid.

Import-Module FailoverClusters

Get-ClusterResource $IPResourceName | Set-ClusterParameter -Multiple @{"Address"="$IPResourceName";"ProbePort"=$ProbePort;"SubnetMask"="255.255.255.255";"Network"="$ClusterNetworkName";"EnableDhcp"=0}

在 IP 地址资源脱机并再次联机之前,所做的更改不会生效。 进行资源的故障转移,以使此更改生效。

设置群集探测后,使用以下 PowerShell 脚本检查群集参数:

Get-ClusterResource $IPResourceName | Get-ClusterParameter

从动态端口范围中排除端口

使用 49,152 到 65,536 之间的运行状况探测端口( TCP/IP 的默认动态端口范围)时,请为每个 VM 上的每个运行状况探测端口添加排除项。

配置端口排除可防止其他系统进程在 VM 上动态分配同一端口

若要设置端口排除,请使用以下 PowerShell 脚本:

  • 每个运行状况探测端口
  • 在每台虚拟机上
[int]$ProbePort = <nnnnn> # The probe port that you configured in the health probe of the load balancer. Any unused TCP port is valid.

netsh int ipv4 add excludedportrange tcp startport=$ProbePort numberofports=1 store=persistent

若要确认已正确配置排除项,请使用以下命令:

netsh int ipv4 show excludedportrange tcp