使用內部負載平衡器,以同步提交方式設定 SQL Server Always On 可用性群組


Microsoft SQL Server Always On 可用性群組可讓您跨多個 SQL Server Enterprise 執行個體複製資料庫。

SQL Server 容錯移轉叢集執行個體類似,Always On 可用性群組會使用 Windows Server 容錯移轉叢集 (WSFC) 實現高可用性。不過,這兩項功能在以下方面有所不同:

Always On 可用性群組 容錯移轉叢集執行個體
容錯移轉的範圍 資料庫群組 執行個體
儲存空間 未共用 共用

如需更詳細的比較,請參閱「叢集執行個體和可用性群組的比較」。

Always On 可用性群組支援多種可用性模式。本教學課程將說明如何在同步提交模式中部署 Always On 可用性群組,為一或多個資料庫實現高可用性。

在設定過程中,您將建立三個 VM 執行個體。兩個 VM 執行個體 node-1node-2 會做為叢集節點,並執行 SQL Server。第三個 VM 執行個體 witness 會用於在備援情況下達成法定人數。這三個 VM 執行個體分散在三個區域,並共用一個子網路。

使用 SQL Server Always On 可用性群組,將範例資料庫 bookshelf 同步複製到兩個 SQL Server 執行個體。

在內部部署的 Windows 叢集環境中,位址解析通訊協定 (ARP) 公告會觸發 IP 位址備援。Google Cloud則會忽略 ARP 廣播。因此,您必須採用下列兩種做法之一:使用內部負載平衡器和分散式網路名稱 (DNN)。

本文假設您已在 Google Cloud上部署 Active Directory,且具備 SQL Server、Active Directory 和 Compute Engine 的基本知識。如要進一步瞭解 Google Cloud上的 Active Directory,請參閱「事前準備」一節。

使用 SQL Server Always On 可用性群組,範例資料庫 bookshelf 會同步複製到兩個 SQL Server 執行個體。內部負載平衡器可確保將流量導向有效節點。

如要進一步瞭解 Windows Server 容錯移轉叢集與內部負載平衡器,請參閱容錯移轉叢集

架構

此圖表包含以下內容:

  • 兩個 VM 執行個體位於同一個區域,但可用區不同,分別是名為 node-1node-2 的備援叢集。其中一個節點會代管 SQL Server 資料庫的主要備用資源,另一個節點則會代管次要備用資源。
  • 第三個名為 witness 的 VM 會做為檔案共用見證,提供關鍵票並達成容錯移轉的仲裁。
  • 叢集前端的內部負載平衡器會為 SQL Server 用戶端提供單一端點,並使用健康狀態檢查,確保流量會導向有效節點。

目標

本教學課程旨在達成以下目標:

費用

本教學課程使用 Google Cloud的計費元件,包括:

使用Pricing Calculator 可根據您的預測使用量來產生預估費用。

事前準備

如要完成本教學課程中的任務,請確認下列事項:

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. 您有一個至少含有一個網域控制器的 Active Directory 網域。您可以使用 Managed Microsoft AD 建立 Active Directory 網域。或者,您也可以在 Compute Engine 上部署自訂 Active Directory 環境,並設定私人 DNS 轉送區域,將 DNS 查詢轉送至網域控制站。
  7. 您有一位 Active Directory 使用者,該使用者具備將電腦加入網域的權限,並可使用 RDP 登入。如果您使用的是 Managed Microsoft AD,可以使用 setupadmin 使用者。如要進一步瞭解如何佈建 Active Directory 使用者帳戶,請參閱「佈建 Active Directory 使用者帳戶
  8. Google Cloud 專案和虛擬私有雲 (VPC),可連線至 Active Directory 網域控制站。
  9. 用於 Windows Server 容錯移轉叢集 VM 執行個體的子網路。
完成本教學課程後,您可以刪除已建立的資源,避免系統繼續向您收取所用資源的費用。詳情請參閱「清除所用資源」。

準備專案和網路

如要部署 SQL Server Always On 可用性群組,您必須為部署作業準備 Google Cloud 專案和虛擬私有雲。下節將詳細說明如何執行這項操作。

設定專案和區域

如要為部署 SQL Server Always On 可用性群組做好 Google Cloud 專案的準備,請執行下列操作:

  1. 在 Google Cloud 控制台中,按一下「啟用 Cloud Shell」啟動 Cloud Shell。 按鈕,即可開啟 Cloud Shell

    前往 Google Cloud 控制台

  2. 初始化下列變數。

    VPC_NAME=VPC_NAME
    SUBNET_NAME=SUBNET_NAME
    

    更改下列內容:

    • VPC_NAME:虛擬私有雲名稱
    • SUBNET_NAME:子網路名稱
  3. 設定預設的專案 ID

    gcloud config set project PROJECT_ID
    

    PROJECT_ID 替換為 Google Cloud 專案的 ID。

  4. 設定預設地區。

    gcloud config set compute/region REGION
    

    REGION 替換為您要部署的地區 ID。

建立防火牆規則

如要讓用戶端連線至 SQL Server,並在叢集節點之間進行通訊,您需要建立多個防火牆規則。您可以使用網路標記簡化這些防火牆規則的建立程序,如下所示:

  • 兩個叢集節點都會加上 wsfc-node 標記。
  • 所有伺服器 (包括 witness) 都會加上 wsfc 標記。

如要建立使用這些網路標記的防火牆規則,請按照下列步驟操作:

  1. 返回現有的 Cloud Shell 工作階段。
  2. 建立防火牆規則,允許叢集節點之間的流量。

    SUBNET_CIDR=$(gcloud compute networks subnets describe $SUBNET_NAME --format=value\('ipCidrRange'\))
    
    gcloud compute firewall-rules create allow-all-between-wsfc-nodes \
      --direction=INGRESS \
      --action=allow \
      --rules=tcp,udp,icmp \
      --enable-logging \
      --source-tags=wsfc \
      --target-tags=wsfc \
      --network=$VPC_NAME \
      --priority 10000
    
    gcloud compute firewall-rules create allow-sql-to-wsfc-nodes \
      --direction=INGRESS \
      --action=allow \
      --rules=tcp:1433 \
      --enable-logging \
      --source-ranges=$SUBNET_CIDR \
      --target-tags=wsfc-node \
      --network=$VPC_NAME \
      --priority 10000
    

建立 VM 執行個體

為容錯移轉叢集建立及部署兩個 VM 執行個體。在任何時間點,其中一個 VM 會代管 SQL Server 資料庫的主要備用資源,而另一個節點則會代管次要備用資源。這兩個 VM 執行個體必須符合下列條件:

  • 位於相同的區域,這樣內部直通式網路負載平衡器才能存取。
  • 已安裝 Windows Server 容錯移轉叢集和 SQL Server。
  • 已啟用 Compute Engine WSFC 支援

您使用預先安裝 SQL Server 2022 的 SQL Server 進階映像檔

如要針對容錯移轉情境提供關鍵票並達成仲裁,請按照下列步驟部署第三個 VM,做為檔案共用見證

  1. 返回現有的 Cloud Shell 工作階段。
  2. 為 WSFC 節點建立專用指令碼。這個指令碼會安裝必要的 Windows 功能,並為 WSFC 和 SQL Server 建立防火牆規則。

    cat << "EOF" > specialize-node.ps1
    
    $ErrorActionPreference = "stop"
    
    # Install required Windows features
    Install-WindowsFeature Failover-Clustering -IncludeManagementTools
    Install-WindowsFeature RSAT-AD-PowerShell
    
    # Open firewall for WSFC
    netsh advfirewall firewall add rule name="Allow WSFC health check" dir=in action=allow protocol=TCP localport=59998
    
    # Open firewall for SQL Server
    netsh advfirewall firewall add rule name="Allow SQL Server" dir=in action=allow protocol=TCP localport=1433
    
    # Open firewall for SQL Server replication
    netsh advfirewall firewall add rule name="Allow SQL Server replication" dir=in action=allow protocol=TCP localport=5022
    
    # Format data disk
    Get-Disk |
     Where partitionstyle -eq 'RAW' |
     Initialize-Disk -PartitionStyle MBR -PassThru |
     New-Partition -AssignDriveLetter -UseMaximumSize |
     Format-Volume -FileSystem NTFS -NewFileSystemLabel 'Data' -Confirm:$false
    
    # Create data and log folders for SQL Server
    md d:\Data
    md d:\Logs
    EOF
    
  3. 建立 VM 執行個體。在用於叢集節點的兩個 VM 上,請附加額外資料磁碟,並將中繼資料鍵 enable-wsfc 設為 true,啟用 Windows Server 容錯移轉叢集:

    REGION=$(gcloud config get-value compute/region)
    ZONE1=ZONE1
    ZONE2=ZONE2
    ZONE3=ZONE3
    PD_SIZE=200
    MACHINE_TYPE=n2-standard-8
    
    gcloud compute instances create node-1 \
      --zone $ZONE1 \
      --machine-type $MACHINE_TYPE \
      --subnet $SUBNET_NAME \
      --image-family sql-ent-2022-win-2022 \
      --image-project windows-sql-cloud \
      --tags wsfc,wsfc-node \
      --boot-disk-size 50 \
      --boot-disk-type pd-ssd \
      --boot-disk-device-name "node-1" \
      --create-disk=name=node-1-datadisk,size=$PD_SIZE,type=pd-ssd,auto-delete=no \
      --metadata enable-wsfc=true \
      --metadata-from-file=sysprep-specialize-script-ps1=specialize-node.ps1
    
    gcloud compute instances create node-2 \
      --zone $ZONE2 \
      --machine-type $MACHINE_TYPE \
      --subnet $SUBNET_NAME \
      --image-family sql-ent-2022-win-2022 \
      --image-project windows-sql-cloud \
      --tags wsfc,wsfc-node \
      --boot-disk-size 50 \
      --boot-disk-type pd-ssd \
      --boot-disk-device-name "node-2" \
      --create-disk=name=node-2-datadisk,size=$PD_SIZE,type=pd-ssd,auto-delete=no \
      --metadata enable-wsfc=true \
      --metadata-from-file=sysprep-specialize-script-ps1=specialize-node.ps1
    
    gcloud compute instances create "witness" \
      --zone $ZONE3 \
      --machine-type e2-medium \
      --subnet $SUBNET_NAME \
      --image-family=windows-2022 \
      --image-project=windows-cloud \
      --tags wsfc \
      --boot-disk-size 50 \
      --boot-disk-type pd-ssd \
      --metadata sysprep-specialize-script-ps1="add-windowsfeature FS-FileServer"
    

    根據您使用的區域,替換 ZONE1ZONE2ZONE3

  4. 如要將三個 VM 執行個體加入 Active Directory,請針對每個 VM 執行個體執行下列操作:

    1. 查看 VM 的序列埠輸出內容,監控 VM 的初始化程序。

      gcloud compute instances tail-serial-port-output NAME
      

      NAME 替換為 VM 執行個體的名稱。

      請等候幾分鐘,直到您看到輸出 Instance setup finished,然後按下 Ctrl+C。此時,VM 執行個體已可供使用。

    2. 為 VM 執行個體建立使用者名稱和密碼

    3. 使用遠端桌面連線至 VM,然後使用上一個步驟建立的使用者名稱和密碼登入。

    4. 在「開始」按鈕上按一下滑鼠右鍵 (或按下 Win + X 鍵),然後按一下「Windows PowerShell (系統管理員)」

    5. 按一下「是」,確認權限提升提示。

    6. 將電腦加入 Active Directory 網域,然後重新啟動。

      Add-Computer -Domain DOMAIN -Restart
      

      DOMAIN 替換為 Active Directory 網域的 DNS 名稱。

    7. 輸入具有權限將 VM 加入網域的帳戶憑證

      等待 VM 重新啟動。您現在已將 VM 執行個體加入 Active Directory。

預留靜態 IP 位址

您現在已在 VPC 中保留兩個靜態 IP 位址。一個 IP 位址用於預設 WSFC 叢集 IP 位址,另一個則用於 SQL Server 可用性群組偵聽器的靜態 IP。

在 WSFC 叢集中,叢集 IP 位址主要用於管理目的和存取叢集資源。這個虛擬 IP 位址會指派給叢集本身,讓管理員能夠管理叢集,並執行設定叢集設定、監控節點健康狀態,以及管理備援程序等工作。

在 SQL Server 可用性群組的情況下,監聽器是虛擬網路名稱 (VNN) 和 IP 位址,可讓用戶端連線至可用性群組,而不需要知道哪個特定伺服器是主要節點。

內部負載平衡器需要內部 IP 位址,才能有效率地轉送內部流量,並在 WSFC 叢集中支援高可用性和負載平衡。內部負載平衡器可確保要求一律會導向叢集的目前主要副本。在容錯移轉事件期間,負載平衡器會偵測主要備用資源的變更,並將用戶端連線重新導向至新的主要備用資源,無須手動介入,即可盡量減少停機時間,並確保資料庫服務持續可用。

在 WSFC 與 SQL Server Always On 可用性群組的情況下,系統會為預設 WSFC 叢集 IP 位址保留內部靜態 IP 位址,並由相關聯的內部負載平衡器使用。

  1. 如要在 VPC 中保留兩個靜態 IP 位址,請按照下列步驟操作。

    gcloud compute addresses create wsfc-cluster-ip \
      --subnet $SUBNET_NAME \
      --region $(gcloud config get-value compute/region) && \
    CLUSTER_IP=$(gcloud compute addresses describe wsfc-cluster-ip \
        --region $(gcloud config get-value compute/region) \
        --format=value\(address\)) && \
    echo "cluster IP: $CLUSTER_IP"
    
  2. 請在 CLUSTER_IP 變數中取代叢集 IP 位址,您稍後需要將其指定為叢集 IP:

    CLUSTER_IP=CLUSTER_IP
    
  3. 為可用性群組偵聽器保留另一個靜態 IP,並在名為 LISTENER_IP 的新環境變數中擷取該位址。

    gcloud compute addresses create wsfc-listener-ip \
      --subnet $SUBNET_NAME \
      --region $(gcloud config get-value compute/region)
    
    LISTENER_IP=$(gcloud compute addresses describe wsfc-listener-ip \
      --region $(gcloud config get-value compute/region) \
      --format=value\(address\)) && \
    echo "Listener IP: $LISTENER_IP"
    
  4. 將負載平衡器的保留 IP 位址替換為 LISTENER_IP 變數,您稍後需要用來設定可用性群組。

    LISTENER_IP=LISTENER_IP
    

專案和 VPC 現已準備好部署 Windows Server 容錯移轉叢集和 SQL Server。

部署容錯移轉叢集

您現在可以使用 VM 執行個體部署 Windows Server 容錯移轉叢集和 SQL Server。下節將詳細說明如何執行這項操作。

準備 SQL Server

請按照下列步驟,在 SQL Server 的 Active Directory 中建立新的使用者帳戶。

  1. 使用遠端桌面連線至 node-1。使用您的網域使用者帳戶登入。
  2. 在「開始」按鈕上按一下滑鼠右鍵 (或按下 Win + X 鍵),然後按一下「Windows PowerShell (系統管理員)」
  3. 按一下「是」,確認權限提升提示。
  4. 為 SQL Server 和 SQL 代理程式建立網域使用者帳戶,並指派密碼:

    $Credential = Get-Credential -UserName sql_server -Message 'Enter password'
    New-ADUser `
      -Name "sql_server" `
      -Description "SQL Admin account." `
      -AccountPassword $Credential.Password `
      -Enabled $true -PasswordNeverExpires $true
    

如要設定 SQL Server,請在 node-1node-2 上執行下列步驟:

  1. 開啟 SQL Server 組態管理工具
  2. 在導覽窗格中,選取「SQL Server 服務」
  3. 在服務清單中,在「SQL Server (MSSQLSERVER)」上按一下滑鼠右鍵,然後選取「Properties」
  4. 在「以以下身分登入」下方,依下列方式變更帳戶:

    • 帳戶名稱: DOMAIN\sql_server 其中 DOMAIN 是 Active Directory 網域的 NetBIOS 名稱。
    • 密碼:輸入先前選擇的密碼。
  5. 按一下 [確定]

  6. 系統提示重新啟動 SQL Server 時,請選取「是」

SQL Server 會以網域使用者帳戶執行。

建立檔案共用區

在 VM 執行個體 witness 上建立兩個檔案共用區,以便儲存 SQL Server 備份,並充當檔案共用區見證:

  1. 使用遠端桌面連線至 witness。使用您的網域使用者帳戶登入。
  2. 在「開始」按鈕上按一下滑鼠右鍵 (或按下 Win + X 鍵),然後按一下「Windows PowerShell (系統管理員)」
  3. 按一下「是」,確認權限提升提示。
  4. 建立見證檔案共用,並授予自己和兩個叢集節點存取檔案共用的權限。

    New-Item "C:\QWitness" –type directory
    
    icacls C:\QWitness\ /grant 'node-1$:(OI)(CI)(M)'
    icacls C:\QWitness\ /grant 'node-2$:(OI)(CI)(M)'
    
    New-SmbShare `
      -Name QWitness `
      -Path "C:\QWitness" `
      -Description "SQL File Share Witness" `
      -FullAccess $env:username,node-1$,node-2$
    
  5. 建立另一個檔案共用,用於儲存備份,並授予 SQL Server 完全存取權:

    New-Item "C:\Backup" –type directory
    New-SmbShare `
      -Name Backup `
      -Path "C:\Backup" `
      -Description "SQL Backup" `
      -FullAccess  $env:USERDOMAIN\sql_server
    

建立容錯移轉叢集

如要建立容錯移轉叢集,請按照下列步驟操作:

  1. 返回 node-1 的遠端桌面工作階段。
  2. 在「開始」按鈕上按一下滑鼠右鍵 (或按下 Win + X 鍵),然後按一下「Windows PowerShell (系統管理員)」
  3. 按一下「是」,確認權限提升提示。
  4. 建立新叢集。

    New-Cluster `
      -Name sql-cluster `
      -Node node-1,node-2 `
      -NoStorage `
      -StaticAddress CLUSTER_IP
    

    CLUSTER_IP 替換為您先前建立的叢集 IP 位址。

  5. 返回 witness 的 PowerShell 工作階段,並授予叢集的虛擬電腦物件存取檔案共用區的權限。

    icacls C:\QWitness\ /grant 'sql-cluster$:(OI)(CI)(M)'
    Grant-SmbShareAccess `
      -Name QWitness `
      -AccountName 'sql-cluster$' `
      -AccessRight Full `
      -Force
    
  6. 返回 node-1 的 PowerShell 工作階段,並將叢集設為使用 witness 上的檔案共用功能做為叢集法定人數。

    Set-ClusterQuorum -FileShareWitness \\witness\QWitness
    
  7. 確認是否已成功建立叢集。

    Test-Cluster
    

    您可能會看到以下警告,但可以放心忽略。

    WARNING: System Configuration - Validate All Drivers Signed: The test reported some warnings..
    WARNING: Network - Validate Network Communication: The test reported some warnings..
    WARNING:
    Test Result:
    HadUnselectedTests, ClusterConditionallyApproved
    Testing has completed for the tests you selected. You should review the warnings in the Report.  A cluster solution is
    supported by Microsoft only if you run all cluster validation tests, and all tests succeed (with or without warnings).
    

    您也可以執行 cluadmin.msc,藉此啟動容錯叢集管理員 MMC 外掛程式,並查看叢集的健康狀態。

  8. 如果您使用的是 Managed AD,請將 Windows 叢集使用的電腦帳戶新增至「Cloud Service Domain Join Accounts」群組,這樣才能將電腦加入網域。

    Add-ADGroupMember `
      -Identity "Cloud Service Domain Join Accounts" `
      -Members sql-cluster$
    
  9. 在兩個節點上啟用 Always On 可用性群組。

    Enable-SqlAlwaysOn -ServerInstance node-1 -Force
    Enable-SqlAlwaysOn -ServerInstance node-2 -Force
    

建立可用性群組

您現在可以建立範例資料庫 bookshelf,將其納入名為 bookshelf-ag 的新可用性群組,並設定高可用性。

建立資料庫

建立新的資料庫。為配合本教學課程,資料庫不需要包含任何資料。

  1. 返回 node-1 的遠端桌面工作階段。
  2. 開啟 SQL Server Management Studio
  3. 在「連線到伺服器」對話方塊中,確認伺服器名稱已設為 node-1,然後選取「連線」
  4. 在選單中,依序選取「File」>「New」>「Query with current connection」
  5. 將下列 SQL 指令碼貼到編輯器中:

    -- Create a sample database
    CREATE DATABASE bookshelf ON PRIMARY (
      NAME = 'bookshelf',
      FILENAME='d:\Data\bookshelf.mdf',
      SIZE = 256MB,
      MAXSIZE = UNLIMITED,
      FILEGROWTH = 256MB)
    LOG ON (
      NAME = 'bookshelf_log',
      FILENAME='d:\Logs\bookshelf.ldf',
      SIZE = 256MB,
      MAXSIZE = UNLIMITED,
      FILEGROWTH = 256MB)
    GO
    
    USE [bookshelf]
    SET ANSI_NULLS ON
    SET QUOTED_IDENTIFIER ON
    GO
    
    -- Create sample table
    CREATE TABLE [dbo].[Books] (
      [Id] [bigint] IDENTITY(1,1) NOT NULL,
      [Title] [nvarchar](max) NOT NULL,
      [Author] [nvarchar](max) NULL,
      [PublishedDate] [datetime] NULL,
      [ImageUrl] [nvarchar](max) NULL,
      [Description] [nvarchar](max) NULL,
      [CreatedById] [nvarchar](max) NULL,
      CONSTRAINT [PK_dbo.Books] PRIMARY KEY CLUSTERED ([Id] ASC) WITH (
        PAD_INDEX = OFF,
        STATISTICS_NORECOMPUTE = OFF,
        IGNORE_DUP_KEY = OFF,
        ALLOW_ROW_LOCKS = ON,
        ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
    
    -- Create a backup
    EXEC dbo.sp_changedbowner @loginame = 'sa', @map = false;
      ALTER DATABASE [bookshelf] SET RECOVERY FULL;
      GO
      BACKUP DATABASE bookshelf to disk = '\\witness\Backup\bookshelf.bak' WITH INIT
    GO
    

    這個指令碼會建立包含單一資料表的新資料庫,並執行 witness 的初始備份作業。

  6. 選取「執行」即可執行 SQL 指令碼。

設定高可用性

您現在可以使用 T-SQL 或 SQL Server Management Studio 為可用性群組設定高可用性。

使用 T-SQL

如要使用 T-SQL 為可用性群組設定高可用性,請按照下列步驟操作:

  1. 連線至 node-1,然後執行下列指令碼,建立 bookshelf-ag 可用性群組。

    CREATE LOGIN [NET_DOMAIN\sql_server] FROM WINDOWS;
    GO
    
    USE [bookshelf];
    CREATE USER [NET_DOMAIN\sql_server] FOR LOGIN [NET_DOMAIN\sql_server];
    GO
    
    USE [master];
    CREATE ENDPOINT bookshelf_endpoint
      STATE=STARTED
      AS TCP (LISTENER_PORT=5022)
      FOR DATABASE_MIRRORING (ROLE=ALL);
    GO
    
    GRANT CONNECT ON ENDPOINT::[bookshelf_endpoint] TO [NET_DOMAIN\sql_server]
    GO
    
  2. 連線至 node-2 並執行下列指令碼。

    CREATE LOGIN [NET_DOMAIN\sql_server] FROM WINDOWS;
    GO
    
    CREATE ENDPOINT bookshelf_endpoint
      STATE=STARTED
      AS TCP (LISTENER_PORT=5022)
      FOR DATABASE_MIRRORING (ROLE=ALL);
    GO
    
    GRANT CONNECT ON ENDPOINT::[bookshelf_endpoint] TO [NET_DOMAIN\sql_server]
    GO
    
  3. node-1 上執行下列指令碼,建立 bookshelf-ag 可用性群組。

    USE master;
    GO
    
    CREATE AVAILABILITY GROUP [bookshelf-ag]
    WITH (AUTOMATED_BACKUP_PREFERENCE = SECONDARY,
    CLUSTER_TYPE = WSFC,
    DB_FAILOVER = ON
    )
    FOR DATABASE [bookshelf]
    REPLICA ON
      N'node-1' WITH (
          ENDPOINT_URL = 'TCP://node-1:5022',
          AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
          FAILOVER_MODE = AUTOMATIC,
          BACKUP_PRIORITY = 50,
          SEEDING_MODE = AUTOMATIC,
          SECONDARY_ROLE(ALLOW_CONNECTIONS = NO)
      ),
      N'node-2' WITH (
          ENDPOINT_URL = 'TCP://node-2:5022',
          AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
          FAILOVER_MODE = AUTOMATIC,
          BACKUP_PRIORITY = 50,
          SEEDING_MODE = AUTOMATIC,
          SECONDARY_ROLE(ALLOW_CONNECTIONS = NO)
      );
    GO
    
  4. 在下列指令碼中,將 LISTENER_IP 替換為您先前為內部負載平衡器保留的 IP 位址,然後執行指令碼。

    USE master;
    GO
    
    ALTER AVAILABILITY GROUP [bookshelf-ag]
    ADD LISTENER N'bookshelf' (
    WITH IP (
      (N'LISTENER_IP', N'255.255.255.0')
    ),
    PORT = 1433);
    GO
    
  5. 連線至 node-2,然後執行下列指令碼,將次要複本加入可用性群組並啟用自動播種功能。

    USE master;
    GO
    
    ALTER AVAILABILITY GROUP [bookshelf-ag] JOIN;
    ALTER AVAILABILITY GROUP [bookshelf-ag] GRANT CREATE ANY DATABASE;
    
    
  6. 檢查可用性群組的狀態。

    SELECT * FROM sys.dm_hadr_availability_group_states;
    GO
    

    您應該會看到 synchronization_health_descHEALTHY

使用 SQL Server Management Studio

如要使用 SQL Server Management Studio 為可用性群組設定高可用性,請按照下列步驟操作:

  1. 在「Object Explorer」視窗中,按一下「Always On High Availability」,然後選取「New Availability Group Wizard」
  2. 在「Specify Options」頁面上,將可用性群組名稱設為 bookshelf-ag,然後選取「Next」
  3. 在「Select Databases」(選取資料庫) 頁面上,選取 bookshelf 資料庫,然後選取「Next」(下一步)
  4. 在「指定複本」頁面中,選取「複本」分頁標籤。

    1. 選取「新增備援機器」
    2. 在「連線至伺服器」對話方塊中,輸入伺服器名稱 node-2,然後選取「連線」

      可用性備援機制清單現在包含 SQL Server 執行個體、node-1node-2

    3. 將兩個執行個體的可用性模式設為同步認可

    4. 將兩個執行個體的「自動備援」設為「已啟用」

    5. 選取「Listener」分頁標籤

      1. 選取「建立可用性群組監聽器」
      2. 輸入下列設定。

        • Listener DNS 名稱bookshelf
        • Port (通訊埠):1433
        • 網路模式Static IP
      3. 選取「Add」,然後輸入您先前為內部負載平衡器預留的 listener IP 位址 (LISTENER_IP)。然後選取「確定」

    6. 選取「下一步」

  5. 在「Select Data Synchronization」(選取資料同步處理) 頁面上,選取「Automatic Seeding」(自動播種)

  6. 在「驗證」頁面上,確認所有檢查都成功。

  7. 在「摘要」頁面中選取「完成」

  8. 在「結果」頁面上,選取「關閉」

建立內部負載平衡器和健康檢查

叢集 IP 代表 Windows 容錯叢集的單一端點。您可以用來執行管理作業和管理叢集資源。叢集 IP 一律會指向叢集的主機 (或主要) 節點。您部署的內部負載平衡器會使用健康狀態檢查,確保流量會導向叢集的主機節點。由於 WSFC 工具需要多個通訊協定才能轉送 (ICMP、UDP 和 TCP),因此建議您部署內部負載平衡器,並支援所有通訊埠的多個通訊協定

如要部署內部負載平衡器,請按照下列步驟操作:

  1. 返回現有的 Cloud Shell 工作階段。
  2. 建立兩個非代管執行個體群組,每個區域一個,然後將兩個節點新增至群組。

    REGION=$(gcloud config get-value compute/region)
    
    gcloud compute instance-groups unmanaged create wsfc-group-1 --zone $ZONE1
    gcloud compute instance-groups unmanaged add-instances wsfc-group-1 --zone $ZONE1 \
      --instances node-1
    
    gcloud compute instance-groups unmanaged create wsfc-group-2 --zone $ZONE2
    gcloud compute instance-groups unmanaged add-instances wsfc-group-2 --zone $ZONE2 \
      --instances node-2
    
  3. 為叢集 IP 建立健康狀態檢查,供負載平衡器用來從 Windows 叢集的角度判斷哪個是有效節點。Compute Engine 訪客代理程式回應健康狀態檢查的預設連接埠為 59998。健康狀態檢查會在要求中提供叢集 IP 位址,並預期從運作中的節點傳回 1 做為回應。

    gcloud compute health-checks create tcp wsfc-healthcheck \
      --request=$CLUSTER_IP \
      --response=1 \
      --check-interval="2s" \
      --healthy-threshold=2 \
      --unhealthy-threshold=2 \
      --port=59998 \
      --timeout="1s"
    
  4. 建立後端服務,並新增兩個現有的執行個體群組。

    gcloud compute backend-services create wsfc-backend \
      --load-balancing-scheme internal \
      --region $REGION \
      --health-checks wsfc-healthcheck \
      --protocol UNSPECIFIED
    
    gcloud compute backend-services add-backend wsfc-backend \
      --instance-group wsfc-group-1 \
      --instance-group-zone $ZONE1 \
      --region $REGION
    
    gcloud compute backend-services add-backend wsfc-backend \
      --instance-group wsfc-group-2 \
      --instance-group-zone $ZONE2 \
      --region $REGION
    
  5. 建立與叢集 IP 相關聯的內部負載平衡器。

    gcloud compute forwarding-rules create wsfc \
      --load-balancing-scheme internal \
      --address $CLUSTER_IP \
      --ports ALL \
      --network $VPC_NAME \
      --subnet $SUBNET_NAME \
      --region $REGION \
      --ip-protocol L3_DEFAULT \
      --backend-service wsfc-backend
    

如要為想連線至 bookshelf 可用性群組中任何資料庫的 SQL Server 用戶端提供單一端點,請部署專屬於該可用性群組的新內部負載平衡器,並按照下列步驟操作:

  1. 為可用性群組的事件方塊建立健康狀態檢查,供負載平衡器用來判斷 bookshelf SQL Server 可用性群組中的主節點。

    gcloud compute health-checks create tcp wsfc-bookshelf-healthcheck \
      --request=$LISTENER_IP \
      --response=1 \
      --check-interval="2s" \
      --healthy-threshold=1 \
      --unhealthy-threshold=2 \
      --port=59998 \
      --timeout="1s"
    

    健康狀態檢查會使用相同的 Compute Engine 訪客代理程式通訊埠,但會在要求中提供 bookshelf 可用性群組的收聽器 IP 位址。

  2. 建立新的後端服務,並新增兩個執行個體群組。

    gcloud compute backend-services create wsfc-bookshelf-backend \
      --load-balancing-scheme internal \
      --region $REGION \
      --health-checks wsfc-bookshelf-healthcheck \
      --protocol UNSPECIFIED
    
    gcloud compute backend-services add-backend wsfc-bookshelf-backend \
      --instance-group wsfc-group-1 \
      --instance-group-zone $ZONE1 \
      --region $REGION
    
    gcloud compute backend-services add-backend wsfc-bookshelf-backend \
      --instance-group wsfc-group-2 \
      --instance-group-zone $ZONE2 \
      --region $REGION
    
  3. 建立與 SQL Server bookshelf-ag 可用性群組接聽程式相關聯的內部負載平衡器。

    gcloud compute forwarding-rules create wsfc-bookshelf \
      --load-balancing-scheme internal \
      --address $LISTENER_IP \
      --ports ALL \
      --network $VPC_NAME \
      --subnet $SUBNET_NAME \
      --region $REGION \
      --ip-protocol L3_DEFAULT \
      --backend-service wsfc-bookshelf-backend
    

您現在可以使用在書架可用性群組事件監聽器中定義的 DNS 名稱 bookshelf 及其通訊埠,連線至 SQL Server 可用性群組事件監聽器。內部負載平衡器會將流量導向 bookshelf 可用性群組的主要節點。

如要在單一容錯叢集中建立多個可用性群組,您必須使用個別的後端服務和負載平衡器,並為每個可用性群組設定專屬的健康狀態檢查。

每個可用性群組可能會將不同的節點指定為主要節點,且這些節點可能與 Windows 叢集的主機節點不同。如果有多個可用性群組,則需要下列項目:

  • 內部負載平衡器使用的可用性群組偵聽器的預留靜態 IP 位址。為每個可用性群組保留一個地址。

  • 為每個可用性群組設定不同的健康狀態檢查規則。健康檢查要求會提供可用性群組接聽器的靜態 IP 位址 (這也是先前步驟中保留的 IP 位址)。健康狀態檢查會探測 GCE 代理程式傳回的回應 1。所有健康狀態檢查都會使用 59998 通訊埠。

  • 為每個可用性群組建立個別的後端服務,並將現有的兩個運算執行個體群組新增至這些可用性群組。後端服務會使用在上一個步驟中定義的健康狀態檢查。

  • 在前一個步驟中建立的後端服務,每個可用性群組都有一個內部負載平衡器。負載平衡器會與可用性群組事件監聽器的靜態 IP 位址建立關聯。

測試容錯移轉

您現在可以測試容錯移轉功能是否正常運作:

  1. 返回 witness 的 PowerShell 工作階段。
  2. 執行下列指令碼。

    while ($True){
      $Conn = New-Object System.Data.SqlClient.SqlConnection
      $Conn.ConnectionString = "Server=tcp:bookshelf,1433;Integrated Security=true;Initial Catalog=master"
      $Conn.Open()
    
      $Cmd = New-Object System.Data.SqlClient.SqlCommand
      $Cmd.Connection = $Conn
      $Cmd.CommandText = "SELECT SERVERPROPERTY('ServerName')"
    
      $Adapter = New-Object System.Data.SqlClient.SqlDataAdapter $Cmd
      $Data = New-Object System.Data.DataSet
      $Adapter.Fill($Data) | Out-Null
      $Data.Tables[0] + (Get-Date -Format "MM/dd/yyyy HH:mm:ss")
    
      Start-Sleep -Seconds 2
    }
    

    在本指南中,我們使用 DNS 名稱 bookshelf 和通訊埠值 1433 為伺服器定義 tcp:bookshelf,1433 中的可用性群組偵聽器。

    每隔 2 秒,指令碼就會使用可用性群組偵聽器連線至 SQL Server,並查詢伺服器名稱。

    讓指令碼繼續執行。

  3. 返回 node-1 的遠端桌面工作階段,觸發容錯移轉。

    1. SQL Server Management Studio 中,依序前往「Always On 高可用性」>「可用性群組」>「bookshelf-ag (Primary)」,然後以滑鼠右鍵按一下節點。
    2. 選取「Failover」
    3. 在「Select new primary replica」頁面上,確認已選取 node-2 做為新的主副本,且「Failover readiness」欄顯示 No data loss。然後選取「下一步」
    4. 在「連線至複本」頁面上,選取「連線」
    5. 在「連線到伺服器」對話方塊中,確認伺服器名稱為 node-2,然後按一下「連線」
    6. 依序選取「下一步」和「完成」
    7. 在「結果」頁面上,確認備援機制是否已成功。
  4. 返回 witness 的 PowerShell 工作階段。

  5. 觀察執行中指令碼的輸出內容,並注意伺服器名稱因備援而從 node-1 變更為 node-2

  6. 按下 Ctrl+C 即可停止指令碼。

清除所用資源

完成教學課程後,您可以清除所建立的資源,這樣資源就不會占用配額並產生費用。下列各節將說明如何刪除或關閉這些資源。

刪除專案

如要避免付費,最簡單的方法就是刪除您為了本教學課程所建立的專案。

如要刪除專案:

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

後續步驟