建立叢集
本節逐步執行建立 Windows Server Failover Cluster (WSFC) 及可用性群組所需的建置作業。
本手冊假設您:
- 至少有兩部伺服器執行 Windows 2019 和 SQL Server 2019 至叢集。
- 具有具有外部網際網路存取權的防禦主機。
- 已部署 Active Directory。
安裝失效接手叢集作業功能
-
使用 SQL Admins 群組帳戶中的使用者,對第一個 SQL Server 執行 RDP ,並開啟 PowerShell 階段作業。
-
將 SQL Admins 群組新增至本端「遠端管理使用者」群組,以便此群組中的使用者可以執行遠端指令。
-
容許入埠 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
-
針對第二部 SQL Server 重複執行。
建立 WSFC 並啟用 SQL Always On
-
使用 SQL Admins 群組帳戶中的使用者,對第一個 SQL Server 執行 RDP ,並開啟 PowerShell 階段作業。
-
執行叢集驗證測試。 忽略任何「一對網路介面」警告,因為這在此部署中是正常的。
-
如果沒有錯誤,則會建立名稱為
wsfc01
的 WSFC 叢集,其中包括兩個 SQL Server<hostname1>
及<hostname2>
。-ManagementPointNetworkType Distributed
選項使用虛擬伺服器的節點 IP 位址,這表示不需要介面上的次要 IP 定址。 此選項會建立「分散式網路名稱 (DNN)」,將資料流量遞送至適當的叢集資源。 -
然後會使用 fs01上的檔案共用,為 Node 和磁碟多數配置叢集額定。
\\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 Admins 群組帳戶中的使用者,對第一個 SQL Server 執行 RDP ,並開啟 PowerShell 階段作業。
-
若要參與 Always On 可用性群組,伺服器實例需要自己的端點,其使用 TCP 埠 5022 在管理可用性抄本的伺服器實例之間傳送及接收資料流量。
-
下列 PowerShell 指令用來配置這些端點: SQL 伺服器上預設 SQL 實例 (DEFAULT) 上的
Hadr_endpoint
;<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
清單中:
- 在主要抄本主機上啟動 SQL Server Management Studio (SSMS) ,並連接至主要抄本。
- 展開安全,用滑鼠右鍵按一下登入,然後選取新建登入。
- 按一下「搜尋」並輸入使用者帳戶 \sqlserver\sqlsvc ,然後按一下「確定」。
- 用滑鼠右鍵按一下所建立的登入,然後選取內容。
- 按一下「安全」,然後按一下「搜尋」。
- 在「新增物件」對話框中,選取特定物件,然後按一下確定。
- 在「選取物件」對話框中,按一下物件類型,然後選取端點。
- 按一下瀏覽以選取物件名稱。
- 選取 Hadr_endpoint ,然後按一下確定。
- 在 Hadr_endpoint 的許可權中,明確授與此物件的連接許可權。
建立測試資料庫
若要配置可用性群組,必須在主要節點上提供資料庫,然後在次要節點上提供此資料庫的副本。 此作業會建立測試資料庫,然後透過檔案共用使用備份及還原作業,將資料庫複製到次要節點。
-
使用 SQL Admins 群組帳戶中的使用者,對第一個 SQL Server 執行 RDP ,並開啟 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
-
準備次要資料庫,方法是使用
Backup-SqlDatabase
及Restore-SqlDatabase
指令,在TempShare
on<file_share_host>
上的<hostname1>
上建立TestDatabase
的備份,這是管理主要抄本的 SQL Server 實例。 將備份還原至管理次要抄本的<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
新的次要資料庫處於 RESTORING 狀態。 除非它已結合至可用性群組,否則無法存取。
建立可用性群組
新增至可用性群組的資料庫稱為可用性資料庫。 新增資料庫時,資料庫必須是線上讀寫資料庫,並且存在於將在 WSFC 中管理主要抄本的伺服器實例上。 新增時,資料庫會結合可用性群組作為主要資料庫,並保持可供用戶端使用。 除非將主要資料庫的備份還原至將變成次要抄本的伺服器實例,否則不存在次要資料庫。 新的次要資料庫會處於 RESTORING 狀態,直到它加入可用性群組為止。 如果未使用備份及還原方法,請參閱 使用自動植入來起始設定 Always On 可用性群組的次要抄本 。
-
使用 SQL Admins 群組帳戶中的使用者,對第一個 SQL Server 執行 RDP ,並開啟 PowerShell 階段作業。
-
若要確保您未收到路徑錯誤,請使用
Invoke-SQLCmd
,這會強制載入 SQL PowerShell 程式庫,然後可透過 PowerShell 磁碟機樹狀結構存取該程式庫。 PowerShell 會處理 SQL Server 中的物件,類似於目錄中的檔案。 將<hostname1>
取代為 SQL Server 的主機名稱:invoke-sqlcmd cd SQLSERVER:\SQL\<hostname1>
-
若要建立可用性群組,請使用具有 -AsTemplate 參數的
New-SqlAvailabilityReplica
指令,為要包含在可用性群組中的兩個可用性抄本中的每一個建立記憶體內可用性抄本物件。 然後,使用New-SqlAvailabilityGroup
指令並參照 availability-replica 物件來建立可用性群組。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
-
使用下列指令將次要抄本結合至可用性群組。 結合會將次要資料庫置於 ONLINE 狀態,並起始與對應主要資料庫的資料同步化。 資料同步化是在次要資料庫上重新產生主要資料庫變更的程序。 資料同步化包括將交易日誌記錄傳送至次要資料庫的主要資料庫。
$sqldb02 = "<hostname2>" $pathsqldb02 = "SQLSERVER:\SQL\" + $sqldb02 + " \DEFAULT" Join-SqlAvailabilityGroup -Path $pathsqldb02 -Name "AG01" -ClusterType WSFC
-
將每一個次要資料庫結合至可用性群組,以啟動資料同步化:
$sqldb02 = "<hostname2>" $agpathsqldb02 = "SQLSERVER:\SQL\" + $sqldb02 + " \DEFAULT\AvailabilityGroups\AG01" Add-SqlAvailabilityDatabase -Path $agpathsqldb02 -Database "TestDatabase"
-
使用 dir 指令來驗證新可用性群組的內容,例如
dir SQLSERVER:\SQL\sqldb01\DEFAULT\AvailabilityGroups\AG01
。
建立可用性群組分散式網路名稱
使用 IBM Cloud VPC上的 SQL Server ,「分散式網路名稱 (DNN)」會將資料流量遞送至適當的叢集資源。 與 Always On 可用性群組搭配使用時, (DNN) 接聽器會取代傳統「虛擬網路名稱 (VNN)」可用性群組接聽器,並簡化雲端環境中的部署。
DNN 接聽器設計成在唯一埠上接聽。 接聽器名稱的 DNS 項目將解析為可用性群組中抄本的所有 IP 位址。 因為 SQL Server 在埠 1433 上接聽,所以埠 1433 無法用於任何 DNN 接聽器。
使用來自 SQL Admins 群組帳戶的使用者,對第一個 SQL Server 執行 RDP ,並開啟 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
使用下列指令,以容許 TCP 6789 通過 Windows 防火牆:
New-NetFirewallRule -DisplayName 'SQL-dnnlsnr-6789-Inbound' -Profile Domain -Direction Inbound -Action Allow -Protocol TCP -LocalPort 6789