IBM Cloud Docs
创建集群

创建集群

本部分将逐步完成创建 Windows Server Failover Cluster (WSFC) 和可用性组所需的构建任务。

本指南假定您:

  • 至少有两个服务器正在运行 Windows 2019 和 SQL Server 2019 以进行集群。
  • 具有具有外部因特网访问权的防御主机。
  • 已部署 Active Directory。

安装故障转移集群功能部件

  1. RDP 到第一个 SQL Server ,使用 SQL Admins 组帐户中的用户,并打开 PowerShell 会话。

  2. 将 SQL Admins 组添加到本地远程管理用户组,以便此组中的用户可以执行远程命令。

  3. 允许入站 TCP 端口 5022 进入服务器,因为此端口用于可用性组流量。 安装故障转移集群功能部件,然后重新启动服务器:

    $domainnb = "<NB_Domain>"
    $group = $domainnb + "\SQLAdmins"
    Add-LocalGroupMember -Group "Remote Management Users" -Member $group
    New-NetFirewallRule -DisplayName 'SQL-AG-Inbound' -Profile Domain -Direction Inbound -Action Allow -Protocol TCP -LocalPort 5022
    Install-WindowsFeature –Name Failover-Clustering –IncludeManagementTools
    Restart-Computer -Force
    
  4. 对第二个 SQL Server 重复此操作。

创建 WSFC 并启用 SQL 始终开启

  1. RDP 到第一个 SQL Server ,使用 SQL Admins 组帐户中的用户,并打开 PowerShell 会话。

  2. 运行集群验证测试。 忽略任何 "一对网络接口" 警告,因为这对于此部署是正常的。

  3. 如果没有错误,那么它们会创建名称为 wsfc01 的 WSFC 集群,该集群包含两个 SQL Server <hostname1><hostname2>-ManagementPointNetworkType Distributed 选项使用虚拟服务器的节点 IP 地址,这意味着不需要接口上的辅助 IP 地址。 此选项创建 "分布式网络名" (DNN) ,用于将流量路由到相应的集群资源。

  4. 然后,使用 fs01上的文件共享为 Node 和 Disk Majority 配置集群定额, \\fs01\clusterwitness-wsfc01

    $sqldb01 = "<hostname1>"
    $sqldb02 = "<hostname2>"
    Test-Cluster -Node $sqldb01, $sqldb02
    New-Cluster -Name wsfc01 -Node $sqldb01, $sqldb02 -ManagementPointNetworkType Distributed
    Set-ClusterQuorum -NodeAndFileShareMajority \\fs01\clusterwitness-wsfc01
    Enable-SqlAlwaysOn -ServerInstance sqldb01, sqldb02 -Force
    

此活动不必在第二个节点上重复

创建文件共享

必须将要复制的数据库备份并复原到辅助实例,需要文件共享以促进此操作。 在堡垒服务器上创建目录并共享该目录,以便它可以保存来自主 SQL 服务器的数据库备份并复原到辅助 SQL 服务器。 该目录和共享必须可由 SQL 服务帐户访问,因为备份由数据库的服务帐户执行。

  1. 在防御主机上,打开 PowerShell 会话。

    $domainnb = "<NB_Domain>"
    $user = $domainnb + "\sqlsvc"
    New-Item -Path "C:\" -Name "TempShare" -ItemType "directory"
    $ACL=Get-ACL -Path "C:\TempShare"
    $AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($user,"FullControl","Allow")
    $ACL.SetAccessRule($AccessRule)
    $ACL | Set-Acl -Path "C:\TempShare"
    New-SmbShare -Name "TempShare" -Path "C:\TempShare" -FullAccess $user
    

创建端点

  1. RDP 到第一个 SQL Server ,使用 SQL Admins 组帐户中的用户,并打开 PowerShell 会话。

  2. 要参与 "始终开启" 可用性组,服务器实例需要自己的端点,这些端点使用 TCP 端口 5022 在托管可用性副本的服务器实例之间发送和接收流量。

  3. 以下 PowerShell 命令用于配置这些端点, Hadr_endpoint 在 SQL Server 上的缺省 SQL 实例 (DEFAULT) 上; <hostname1>`` and <hostname2> 并在端点之间启用加密:

    $sqldb01 = "<hostname1>"
    $sqldb02 = "<hostname2>"
    $domainnb = "<NB_Domain>"
    $user = $domainnb + "\sqlsvc"
    $pathsqldb01 = "SQLSERVER:\SQL\" + $sqldb01 + "\DEFAULT"
    $pathsqldb01 = "SQLSERVER:\SQL\" + $sqldb02 + "\DEFAULT"
    $endpoint1 = New-SqlHadrEndpoint Hadr_endpoint -Port 5022 -Path $pathsqldb01 -Encryption Required -EncryptionAlgorithm Aes -Owner $user
    Set-SqlHadrEndpoint -InputObject $endpoint1 -State "Started"
    $endpoint2 = New-SqlHadrEndpoint Hadr_endpoint -Port 5022 -Path $pathsqldb02 -Encryption Required -EncryptionAlgorithm Aes -Owner $user
    Set-SqlHadrEndpoint -InputObject $endpoint2 -State "Started"
    

要向端点使用的域服务授予连接许可权,需要执行以下步骤。 如果未完成此步骤,那么端点端口将不会启动,并且不会显示在 netstat -a 列表中:

  1. 在主副本主机上启动 SQL Server Management Studio (SSMS) 并连接到主副本。
  2. 展开 "安全性" ,右键单击 "登录" ,然后选择 "新建登录"。
  3. 单击 "搜索" 并输入用户帐户 \sqlserver\sqlsvc ,然后单击 "确定"。
  4. 右键单击创建的登录,然后选择 "属性"。
  5. 单击 "可安全性" ,然后单击 "搜索"。
  6. 在 "添加对象" 对话框中,选择 "特定对象" ,然后单击 "确定"。
  7. 在 "选择对象" 对话框中,单击 "对象类型" 并选择端点。
  8. 单击 "浏览" 以选择对象名。
  9. 选择 Hadr_endpoint ,然后单击 "确定"。
  10. 在 Hadr_endpoint 的许可权中,显式授予对此对象的连接许可权。

创建测试数据库

要配置可用性组,必须在主节点上提供数据库,然后在辅助节点上提供此数据库的副本。 此任务将创建测试数据库,然后通过文件共享使用备份和复原操作将数据库复制到辅助节点。

  1. RDP 到第一个 SQL Server ,使用 SQL Admins 组帐户中的用户,并打开 PowerShell 会话。 对于可用性组中使用的数据库,将恢复方式设置为 Full 非常重要:

    $sql = "
    CREATE DATABASE [TestDatabase]
     CONTAINMENT = NONE
     ON  PRIMARY
    ( NAME = N'TestDatabase', FILENAME = N'D:\MSSQL15.MSSQLSERVER\MSSQL\DATA\TestDatabase.mdf' , SIZE = 1048576KB , FILEGROWTH = 262144KB )
     LOG ON
    ( NAME = N'MyDatabase_log', FILENAME = N'E:\MSSQL15.MSSQLSERVER\MSSQL\Logs\TestDatabase_log.ldf' , SIZE = 524288KB , FILEGROWTH = 131072KB )
    GO
    
    USE [master]
    GO
    ALTER DATABASE [TestDatabase] SET RECOVERY FULL
    GO
    
    ALTER AUTHORIZATION ON DATABASE::[TestDatabase] TO [sa]
    GO "
    Invoke-SqlCmd -ServerInstance sqldb01 -Query $sql
    
  2. 通过使用 Backup-SqlDatabaseRestore-SqlDatabase 命令来准备辅助数据库,以在 TempShare on <file_share_host>(托管主副本的 SQL Server 实例) 上的 <hostname1> 上创建 TestDatabase 的备份。 将备份复原到托管辅助副本的 <hostname2>。 必须使用 NoRecovery 复原参数。

    $sqldb01 = "<hostname1>"
    $sqldb02 = "<hostname2>"
    $filesharehost = "<file_share_host>"
    $backupfiledata = "\\" + $filesharehost +"\TempShare\TestDatabase.bak"
    $backupfilelog = "\\" + $filesharehost +"\TempShare\TestDatabase.trn"
    Backup-SqlDatabase -Database "TestDatabase" -ServerInstance $sqldb01 -BackupFile $backupfiledata -CopyOnly
    Backup-SqlDatabase -Database "TestDatabase" -BackupFile $backupfilelog -ServerInstance $sqldb01 -BackupAction Log -CopyOnly
    Restore-SqlDatabase -Database "TestDatabase" -BackupFile $backupfiledata -ServerInstance $sqldb02 -NoRecovery  
    Restore-SqlDatabase -Database "TestDatabase" -BackupFile $backupfilelog -ServerInstance $sqldb02 -RestoreAction Log -NoRecovery
    

新的辅助数据库处于 "正在复原" 状态。 在将其连接到可用性组之前,它不可访问。

创建可用性组

添加到可用性组的数据库称为可用性数据库。 添加数据库时,数据库必须是联机读写数据库,并且存在于将在 WSFC 中托管主副本的服务器实例上。 添加后,数据库将作为主数据库加入可用性组,并保持可供客户机使用。 在将主数据库的备份复原到将成为辅助副本的服务器实例之前,不存在辅助数据库。 新的辅助数据库处于 "正在复原" 状态,直到它连接到可用性组为止。 如果未使用备份和复原方法,请参阅 使用自动种子植入来初始化 "始终开启" 可用性组的辅助副本

  1. RDP 到第一个 SQL Server ,使用 SQL Admins 组帐户中的用户,并打开 PowerShell 会话。

  2. 要确保不会发生路径错误,请使用 Invoke-SQLCmd 来强制装入 SQL PowerShell 库,然后可通过 PowerShell 驱动器树进行访问。 PowerShell 处理 SQL Server 中的对象,类似于目录中的文件。 将 <hostname1> 替换为 SQL Server 的主机名:

    invoke-sqlcmd
    cd SQLSERVER:\SQL\<hostname1>
    
  3. 要创建可用性组,带有 -AsTemplate 参数的 New-SqlAvailabilityReplica 命令用于为要包括在可用性组中的两个可用性副本中的每个副本创建内存中的可用性-副本对象。 然后,通过使用 New-SqlAvailabilityGroup 命令并引用可用性副本对象来创建可用性组。 AutomatedBackupPreference Primary 用于指定备份应始终发生在主副本上,而 -FailureConditionLevel OnCriticalServerErrors 用于指定在发生严重服务器错误时触发自动故障转移。 可以使用 -SeedingMode Automatic 选项来启用直接种子植入,因为此方法不需要备份和复原主数据库的副本。 对于 SQL 2019 ,版本号为 15。

    请参阅 New-SqlAvailabilityGroup 文档以获取其他参数的描述。

    $sqldb01 = "<hostname1>"
    $sqldb02 = "<hostname2>"
    $sqldb01fqdn = "<fqdn1>"
    $sqldb02fqdn = "<fqdn2>"
    $endpointurl1 "TCP://" + $sqldb01fqdn + ":5022"
    $endpointurl2 "TCP://" + $sqldb02fqdn + ":5022"
    $pathsqldb01 = "SQLSERVER:\SQL\" + $sqldb01 +" \DEFAULT"
    $primaryReplica = New-SqlAvailabilityReplica -Name $sqldb01 -EndpointURL $endpointurl1 -AvailabilityMode "SynchronousCommit" -FailoverMode "Automatic" -Version 15 -AsTemplate  
    $secondaryReplica = New-SqlAvailabilityReplica -Name $sqldb02 -EndpointURL $endpointurl2 -AvailabilityMode "SynchronousCommit" -FailoverMode "Automatic" -Version 15 -AsTemplate
    New-SqlAvailabilityGroup -Name "AG01" -Path $pathsqldb01 -AvailabilityReplica @($primaryReplica,$secondaryReplica) -Database "TestDatabase" -ClusterType WSFC -AutomatedBackupPreference Primary -FailureConditionLevel OnCriticalServerErrors
    
  4. 使用以下命令将辅助副本连接到可用性组。 连接将辅助数据库置于 ONLINE 状态,并启动与相应主数据库的数据同步。 数据同步是在辅助数据库上重现对主数据库的更改的过程。 数据同步涉及主数据库将事务日志记录发送到辅助数据库。

    $sqldb02 = "<hostname2>"
    $pathsqldb02 = "SQLSERVER:\SQL\" + $sqldb02 + " \DEFAULT"
    Join-SqlAvailabilityGroup -Path $pathsqldb02 -Name "AG01" -ClusterType WSFC
    
  5. 通过将每个辅助数据库连接到可用性组来启动数据同步:

    $sqldb02 = "<hostname2>"
    $agpathsqldb02 = "SQLSERVER:\SQL\" + $sqldb02 + " \DEFAULT\AvailabilityGroups\AG01"
    Add-SqlAvailabilityDatabase -Path $agpathsqldb02 -Database "TestDatabase"
    
  6. 使用 dir 命令来验证新可用性组的内容,例如 dir SQLSERVER:\SQL\sqldb01\DEFAULT\AvailabilityGroups\AG01

创建可用性组分布式网络名称

通过 IBM Cloud VPC上的 SQL Server ,分布式网络名 (DNN) 将流量路由到相应的集群资源。 当与 "始终开启" 可用性组配合使用时, (DNN) 侦听器将替换传统的虚拟网络名 (VNN) 可用性组侦听器,并简化云环境中的部署。

DNN 侦听器旨在侦听唯一端口。 侦听器名称的 DNS 条目将解析为可用性组中副本的所有 IP 地址。 由于 SQL Server 侦听端口 1433 ,因此端口 1433 不能用于任何 DNN 侦听器。

RDP 到第一个 SQL Server ,使用来自 SQL Admins 组帐户的用户,打开 PowerShell 会话并使用以下命令; 要创建名称为 dnnlsnr-6789的 DNN 资源,请在 DNN 资源的 AD DNS 服务器上配置 DNS ,启动 DNN 资源,将来自可用性组资源的依赖关系添加到 DNN 资源,最后重置可用性组资源。

$ag = "AG01"
$dns = "dnnlsnr"
$port = "6789"
Add-ClusterResource -Name $port -ResourceType "Distributed Network Name" -Group $ag
Get-ClusterResource -Name $port | Set-ClusterParameter -Name DnsName -Value $dns
Start-ClusterResource -Name $port
$Dep = Get-ClusterResourceDependency -Resource $ag
if ( $Dep.DependencyExpression -match '\s*\((.*)\)\s*' ) {$DepStr = "$($Matches.1) or [$port]"} else {$DepStr = "[$port]"}
Set-ClusterResourceDependency -Resource $ag -Dependency "$DepStr"
Stop-ClusterResource -Name $ag
Start-ClusterResource -Name $ag

使用以下命令通过 Windows 防火墙允许 TCP 6789:

New-NetFirewallRule -DisplayName 'SQL-dnnlsnr-6789-Inbound' -Profile Domain -Direction Inbound -Action Allow -Protocol TCP -LocalPort 6789