在 Linux 上設定 Always On 可用性群組和 Pacemaker 的 SQL Server 叢集


本教學課程說明如何在 Linux 上部署 Microsoft SQL Server 資料庫系統,並使用 Always On 可用性群組 (AOAG) 和 Pacemaker 做為高可用性 (HA) 和災難復原 (DR) 解決方案。在本文件中,災難是指主要資料庫發生故障或無法使用的事件。

主要資料庫所在的區域發生故障或無法存取時,可能會發生故障。即使區域可用且運作正常,主要資料庫仍可能因系統錯誤而失敗。在這種情況下,災難復原程序就是讓用戶端可以繼續使用次要資料庫的過程。

本教學課程適用於資料庫架構師、管理員和工程師。

目標

費用

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

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

事前準備

本教學課程需要 Google Cloud 專案。您可以建立新專案,或選取已建立的專案:

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

    Go to project selector

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

  3. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

準備專案和網路

如要為 SQL Server Always On 可用性群組部署作業準備 Google Cloud 專案和虛擬私有雲,請按照下列步驟操作:

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

    前往 Google Cloud 控制台

  2. 設定預設的專案 ID

    gcloud config set project PROJECT_ID
    

    PROJECT_ID 替換為您的 Google Cloud 專案 ID。

  3. 設定預設區域:

    gcloud config set compute/region REGION
    

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

  4. 設定預設可用區:

    gcloud config set compute/zone ZONE
    

    ZONE 替換為您要部署的區域 ID。該區域必須是前一個步驟中指定區域內的有效區域。

建立 Linux VM

如要為 SQL Server 叢集提供高可用性和仲裁機制,請部署三部 Linux 虛擬機器 (VM) 來代管 SQL Server 叢集。

  1. 初始化下列變數:

    PD_SIZE=30
    MACHINE_TYPE=n2-standard-8
    
  2. 建立 Linux VM:

    gcloud compute instances create node-1 \
    --project=PROJECT_ID \
    --zone REGION-a \
    --machine-type $MACHINE_TYPE \
    --subnet SUBNET_NAME \
    --create-disk=auto-delete=yes,boot=yes,device-name=node-1,image=projects/ubuntu-os-cloud/global/images/ubuntu-2004-focal-v20240426,mode=rw,size=$PD_SIZE,type=projects/PROJECT_ID/zones/REGION-a/diskTypes/pd-balanced \
    --scopes=https://www.googleapis.com/auth/compute,https://www.googleapis.com/auth/servicecontrol,https://www.googleapis.com/auth/service.management.readonly,https://www.googleapis.com/auth/logging.write,https://www.googleapis.com/auth/monitoring.write,https://www.googleapis.com/auth/trace.append,https://www.googleapis.com/auth/devstorage.read_write
    
    gcloud compute instances create node-2 \
    --project=PROJECT_ID \
    --zone REGION-b \
    --machine-type $MACHINE_TYPE \
    --subnet SUBNET_NAME \
    --create-disk=auto-delete=yes,boot=yes,device-name=node-2,image=projects/ubuntu-os-cloud/global/images/ubuntu-2004-focal-v20240426,mode=rw,size=$PD_SIZE,type=projects/PROJECT_ID/zones/REGION-b/diskTypes/pd-balanced \
    --scopes=https://www.googleapis.com/auth/compute,https://www.googleapis.com/auth/servicecontrol,https://www.googleapis.com/auth/service.management.readonly,https://www.googleapis.com/auth/logging.write,https://www.googleapis.com/auth/monitoring.write,https://www.googleapis.com/auth/trace.append,https://www.googleapis.com/auth/devstorage.read_write
    
    gcloud compute instances create node-3 \
    --project=PROJECT_ID \
    --zone REGION-c \
    --machine-type $MACHINE_TYPE \
    --subnet SUBNET_NAME \
    --create-disk=auto-delete=yes,boot=yes,device-name=node-3,image=projects/ubuntu-os-cloud/global/images/ubuntu-2004-focal-v20240426,mode=rw,size=$PD_SIZE,type=projects/PROJECT_ID/zones/REGION-c/diskTypes/pd-balanced \
    --scopes=https://www.googleapis.com/auth/compute,https://www.googleapis.com/auth/servicecontrol,https://www.googleapis.com/auth/service.management.readonly,https://www.googleapis.com/auth/logging.write,https://www.googleapis.com/auth/monitoring.write,https://www.googleapis.com/auth/trace.append,https://www.googleapis.com/auth/devstorage.read_write
    

    SUBNET_NAME 替換為您的虛擬私人雲端子網路名稱。

  3. 更新 node-1node-2node-3 的主機檔案:

    1. 使用 SSH 連線至每個 VM。詳情請參閱「連線至 Linux VM」說明文件
    2. 開啟主機檔案進行編輯。

      sudo vi /etc/hosts
      
    3. 找出每個 Linux VM 的內部 IP 位址,然後在檔案底部附加主機項目。

      前往 Compute Engine

      NODE1_INTERNAL_IP node-1
      NODE2_INTERNAL_IP node-2
      NODE3_INTERNAL_IP node-3
      

      NODE1_INTERNAL_IPNODE2_INTERNAL_IPNODE3_INTERNAL_IP 替換為每個 Linux VM 的內部 IP 位址。

  4. 檢查 VM 之間的通訊。所有加入 Always On 可用性群組的 VM 都必須能夠與其他 VM 通訊:

    1. 返回各個 Linux VM,在各個 VM 中執行指令,並驗證所有 VM 是否能相互通訊。

      ping -c 4 node-1
      ping -c 4 node-2
      ping -c 4 node-3
      

安裝及設定 SQL Server

在將加入 Always On 可用性群組的三部 Linux VM 上,下載、安裝及設定 SQL Server 引擎。

  1. 透過 SSH 連線至 node-1node-2node-3,然後執行下列步驟:

    1. 匯入公開存放區金鑰。

      wget -qO- https://packages.microsoft.com/keys/microsoft.asc \
      | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc
      
    2. 註冊 SQL Server Ubuntu 存放區。

      sudo add-apt-repository \
      "$(wget -qO- https://packages.microsoft.com/config/ubuntu/20.04/mssql-server-2019.list)"
      
    3. 更新套件索引檔案並安裝 SQL Server。

      sudo apt-get update
      sudo apt-get install -y mssql-server
      
      
  2. 設定 SQL Server:

    1. 執行 mssql-conf 工具。

      sudo /opt/mssql/bin/mssql-conf setup
      
    2. 選擇 SQL Server 的「Developer」版本,並接受授權協議。

      開發人員版包含所有企業功能,但只能用於非正式環境。如要進一步瞭解 SQL Server 版本Microsoft 授權,請參閱相關文章。

    3. 指定 SA 帳戶的密碼。

    4. 確認 mssql-server 服務是否正在執行。

      systemctl status mssql-server --no-pager
      
  3. 如果您在 VM 上啟用防火牆,請為 SQL Server 開啟防火牆:

    1. 執行下列指令,檢查 Uncomplicated Firewall 是否已安裝及啟用。

      sudo ufw status
      
    2. 如果狀態為啟用,請執行下列指令開啟通訊埠。

      sudo ufw allow 1433
      sudo ufw allow 5022
      sudo ufw reload
      

連線至 SQL Server

此時,SQL Server 已安裝完成。如要連線至該執行個體,請在相同的 VPC 中建立 Windows 機器,並安裝 SQL Server Management Studio (SSMS),以便連線至 VM 上新建立的 SQL Server 執行個體:

  1. 建立 Windows VM:

    1. 返回 Cloud Shell 並執行下列指令。

      gcloud compute instances create node4 \
      --project=PROJECT_ID \
      --zone ZONE \
      --subnet SUBNET_NAME \
      --machine-type=n2-standard-4 \
      --create-disk=auto-delete=yes,boot=yes,device-name=node4,image=projects/windows-cloud/global/images/windows-server-2022-dc-v20240415,mode=rw,size=50,type=projects/p3rf-sqlserver/zones/ZONE/diskTypes/pd-balanced
      
  2. 使用遠端桌面連線至 node-4 上的 Windows VM:

  3. 更新 node-4 上的主機檔案:

    1. 在管理員模式下開啟記事本。
    2. 依序點選「File」 >「Open」,然後開啟主機檔案。

      c:\Windows\System32\drivers\etc\hosts
      
    3. 將主機項目附加至檔案底部。

      NODE1_INTERNAL_IP node-1
      NODE2_INTERNAL_IP node-2
      NODE3_INTERNAL_IP node-3
      

      NODE1_INTERNAL_IPNODE2_INTERNAL_IPNODE3_INTERNAL_IP 替換為各個 VM 的內部 IP 位址。

    4. 儲存並結束。

  4. 驗證 Linux VM 的連線能力:

    1. 連線至 node-4 上的 Windows VM
    2. 按一下「開始」按鈕,然後在搜尋列中輸入 powershell。
    3. 按一下即可開啟 Windows PowerShell ISE 應用程式。
    4. 執行下列指令來測試連線情形。

      ping node-1
      ping node-2
      ping node-3
      
  5. 請按照下列步驟安裝 Microsoft SQL Server Management Studio (SSMS):

    1. 使用遠端桌面連線至 node-4 上的 Windows VM。

    2. 在 RDP 工作階段中,將所有視窗最小化,然後啟動 Windows PowerShell ISE 應用程式。

    3. 在 PowerShell 提示中,下載並執行 SSMS 安裝程式。

      Start-BitsTransfer `
      -Source "https://aka.ms/ssmsfullsetup" `
      -Destination "$env:Temp\ssms-setup.exe"
      & $env:Temp\ssms-setup.exe
      
    4. 在 SSMS 安裝程式中,按一下「Install」

    5. 接受提示,允許進行變更。

    6. 安裝完成後,請按一下「Restart」重新啟動遠端機器。這麼做會關閉 RDP 工作階段。

  6. 連線至節點 1 上的 SQL Server 執行個體:

    1. 使用 RDP 返回 node-4 VM。

    2. 開啟 SSMS,並使用下列參數連線至 node-1

      Server name: node-1
      Authentication: SQL Server Authentication
      Login: sa
      

      如需更多資訊,請參閱SQL Server Management Studio 說明文件,瞭解如何連線至 SQL Server 執行個體

    3. 輸入在安裝期間建立的 SA 帳戶密碼。

    4. 選取「信任伺服器憑證」

    5. 按一下「連線」

啟用 Always On 可用性群組

在 Linux 上,您必須先建立可用性群組,才能將其新增為 Pacemaker 管理的資源:

  1. 為參與可用性群組的每個 SQL Server 執行個體啟用 Always On 可用性群組功能。在 node-1node-2node-3 上執行下列指令:

    sudo /opt/mssql/bin/mssql-conf set hadr.hadrenabled 1
    sudo systemctl restart mssql-server
    
  2. 使用 SSMS 連線至可用性群組中的主要主機執行個體:

    1. 開啟新的查詢視窗。

    2. 執行下列程式碼片段,建立加密金鑰、憑證和私密金鑰。

      USE MASTER;
      
      CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'ENCRYPTION_KEY_PASSWORD';
      CREATE CERTIFICATE my_ag_certificate WITH SUBJECT = 'my_ag_cert';
      BACKUP CERTIFICATE my_ag_certificate
      TO FILE = '/var/opt/mssql/data/my_ag_certificate.cer'
      WITH PRIVATE KEY (
          FILE = '/var/opt/mssql/data/my_ag_certificate.pvk',
          ENCRYPTION BY PASSWORD = 'PRIVATE_KEY_PASSWORD'
      );
      

      ENCRYPTION_KEY_PASSWORDPRIVATE_KEY_PASSWORD 替換成加密金鑰和私密金鑰的密碼。

轉移憑證和金鑰檔案

在先前步驟中建立的憑證和金鑰檔案,必須移至 SQL Server 的次要節點。您可以透過多種方式,將憑證和金鑰檔案移至 node-2node-3 的次要節點。

如要瞭解其他傳輸選項,請參閱「將檔案傳輸至 Linux VM

使用 Cloud Storage 轉移憑證和金鑰檔案

建立 Cloud Storage,將檔案從主要叢集節點轉移至次要叢集節點。

  1. 建立 Cloud Storage bucket:

    1. 返回 Cloud Shell,執行下列指令:

      gcloud storage buckets create gs://BUCKET_NAME \
      --project=PROJECT_ID \
      --location=REGION \
      --public-access-prevention
      

      BUCKET_NAME 替換為要建立的值區名稱。將 PROJECT_ID 替換為 Google Cloud 專案的 ID,並將 REGION 替換為您要部署值區的區域 ID。

    詳情請參閱「建立值區」。

  2. 返回 node-1node-2node-3 的 SSh,初始化 Google Cloud CLI:

    1. 執行下列指令,初始化 Google Cloud CLI。

      gcloud init
      
    2. 選擇 option [1] 即可使用預先安裝的服務帳戶。

    3. 輸入專案名稱。

    4. 輸入 n 即可設定預設的地區和區域。

  3. 返回 node-1 將檔案複製到 Cloud Storage:

    1. 執行下列指令,將兩個新建立的檔案上傳至 Cloud Storage。

      sudo gcloud storage cp /var/opt/mssql/data/my_ag_certificate.cer gs://BUCKET_NAME/
      sudo gcloud storage cp /var/opt/mssql/data/my_ag_certificate.pvk gs://BUCKET_NAME/
      

      請將 BUCKET_NAME 替換為已建立的值區名稱。

  4. 返回 node-2node-3,從 Cloud Storage 複製檔案:

    1. 請將這兩個檔案從 Cloud Storage 下載到 node-2

      sudo gcloud storage cp gs://BUCKET_NAME/my_ag_certificate.cer /var/opt/mssql/data/
      sudo gcloud storage cp gs://BUCKET_NAME/my_ag_certificate.pvk /var/opt/mssql/data/
      

      請將 BUCKET_NAME 替換為已建立的值區名稱。

    2. 在根目錄殼層中執行指令,變更 node-2node-3 上的檔案擁有權。

      chown mssql:mssql /var/opt/mssql/data/my_ag_certificate.*
      chmod 660 /var/opt/mssql/data/my_ag_certificate.*
      
      

設定資料庫鏡像端點

在本節中,您將使用 SQL Server 叢集中每個節點共用的加密金鑰和憑證,建立資料庫端點,確保資料複製作業安全無虞。

  1. 返回 node-4 上的 Windows VM,建立資料庫鏡像端點:

    1. 使用 SSMS 連線至 node-1node-2node-3 上的 SQL Server 資料庫。請按照「連線至 SQL Server」中的步驟操作,使用 node-1node-2node-3 做為伺服器名稱,以及您為 SA 帳戶設定的相對應密碼。

    2. 使用複製的檔案,在次要 VM node-2node-3 上建立憑證。使用您在主要節點上建立憑證和金鑰時提供的密碼。

      USE MASTER;
      
      CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'ENCRYPTION_KEY_PASSWORD';
      CREATE CERTIFICATE my_ag_certificate
      FROM FILE = '/var/opt/mssql/data/my_ag_certificate.cer'
      WITH PRIVATE KEY (
          FILE = '/var/opt/mssql/data/my_ag_certificate.pvk',
          DECRYPTION BY PASSWORD = 'PRIVATE_KEY_PASSWORD'
      );
      

      ENCRYPTION_KEY_PASSWORDPRIVATE_KEY_PASSWORD 替換成加密金鑰和私密金鑰的密碼。

    3. 返回 SSMS,針對 node-1node-2node-3 執行 T-SQL 指令,建立資料庫鏡像端點。

      CREATE ENDPOINT [my_ag_endpoint]
          AS TCP (LISTENER_PORT = 5022)
          FOR DATABASE_MIRRORING (
              ROLE = ALL,
              AUTHENTICATION = CERTIFICATE my_ag_certificate,
              ENCRYPTION = REQUIRED ALGORITHM AES
          );
      
      ALTER ENDPOINT [my_ag_endpoint] STATE = STARTED;
      

建立及設定 Always On 可用性群組

接著,請使用 SQL Server Management Studio 建立 SQL Server Always On 可用性群組,並使用先前建立的端點進行複製。

  1. 返回 Windows VM 並開啟 SSMS:

    1. 連線至 node-1 上的 SQL Server 資料庫引擎,並開啟新的查詢視窗。
  2. 建立資料庫並備份資料庫,為複製作業做好準備:

    USE MASTER;
    
    CREATE DATABASE [bookshelf];
    ALTER DATABASE [bookshelf] SET RECOVERY FULL;
    BACKUP DATABASE [bookshelf]
    TO DISK = N'/var/opt/mssql/data/bookshelf.bak';
    
  3. 建立 Always On 可用性群組:

    1. node-1node-2node-3 上,在 SSMS 中執行下列 T-SQL 指令。這可確保已啟用端點,且每個節點上的 SQL Server 都已準備好進行資料複製。

      IF (SELECT state FROM sys.endpoints WHERE name = N'my_ag_endpoint') <> 0
      BEGIN
          ALTER ENDPOINT [my_ag_endpoint] STATE = STARTED
      END
      GO
      
      IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='AlwaysOn_health')
      BEGIN
          ALTER EVENT SESSION [AlwaysOn_health] ON SERVER WITH (STARTUP_STATE=ON);
      END
      IF NOT EXISTS(SELECT * FROM sys.dm_xe_sessions WHERE name='AlwaysOn_health')
      BEGIN
          ALTER EVENT SESSION [AlwaysOn_health] ON SERVER STATE=START;
      END
      GO
      
    2. node-1 上執行下列 T-SQL 指令,建立 AOAG。

      USE [master]
      GO
      
      CREATE AVAILABILITY GROUP [aoag1]
      WITH (
          AUTOMATED_BACKUP_PREFERENCE = SECONDARY,
          DB_FAILOVER = OFF,
          DTC_SUPPORT = NONE,
          CLUSTER_TYPE = EXTERNAL,
          REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT = 0
      )
      FOR DATABASE [bookshelf]
      REPLICA ON N'node-1' WITH (
          ENDPOINT_URL = N'TCP://node-1:5022', FAILOVER_MODE = EXTERNAL, AVAILABILITY_MODE = SYNCHRONOUS_COMMIT, BACKUP_PRIORITY = 50, SEEDING_MODE = AUTOMATIC, SECONDARY_ROLE(ALLOW_CONNECTIONS = NO)),
          N'node-2' WITH (ENDPOINT_URL = N'TCP://node-2:5022', FAILOVER_MODE = EXTERNAL, AVAILABILITY_MODE = SYNCHRONOUS_COMMIT, BACKUP_PRIORITY = 50, SEEDING_MODE = AUTOMATIC, SECONDARY_ROLE(ALLOW_CONNECTIONS = NO)),
          N'node-3' WITH (ENDPOINT_URL = N'TCP://node-3:5022', FAILOVER_MODE = EXTERNAL, AVAILABILITY_MODE = SYNCHRONOUS_COMMIT, BACKUP_PRIORITY = 50, SEEDING_MODE = AUTOMATIC, SECONDARY_ROLE(ALLOW_CONNECTIONS = NO)
      );
      GO
      
    3. 針對每個 SQL Server 執行個體,在 node-2node-3 上執行下列 T-SQL 指令,以便加入新的可用性群組。

      ALTER AVAILABILITY GROUP [aoag1] JOIN WITH (CLUSTER_TYPE = EXTERNAL);
      GO
      
      ALTER AVAILABILITY GROUP [aoag1] GRANT CREATE ANY DATABASE;
      GO
      

    您已建立名為 bookshelf 的新資料庫,並將新資料庫新增至 node-1 上執行的 SQL Server 執行個體中名為 aoag1 的新可用性群組。Node-2node-3 已新增至可用性群組,且 bookshelf 資料庫中的資料會在所有三個節點的 SQL Server 執行個體中同步複製。

安裝及設定 Pacemaker

Pacemaker 是開放原始碼高可用性資源管理器軟體,可搭配 Corosync 叢集引擎使用。在本節中,您將在每個 VM 上安裝及設定 Pacemaker。

為 Pacemaker 叢集管理工具建立 SQL Server 登入

在本節中,您將建立新的 SQL Server 帳戶,供 Pacemaker 使用來登入每個 SQL Server 執行個體,並管理可用性群組。

  1. node-1node-2node-3 上執行下列 T-SQL 指令:

    USE [master];
    
    CREATE LOGIN [pacemaker] with PASSWORD= N'PACEMAKER_LOGIN_PASSWORD';
    GO
    

    PACEMAKER_LOGIN_PASSWORD 替換為 Pacemaker 帳戶的密碼。

  2. 執行 T-SQL 指令,將節拍器登入權限授予可用性群組:

    GRANT ALTER, CONTROL, VIEW DEFINITION ON AVAILABILITY GROUP::[aoag1] TO [pacemaker];
    GRANT VIEW SERVER STATE TO [pacemaker];
    GO
    
  3. 返回 node-1node-2node-3 的 SSH 並執行指令,將 Pacemaker 登入資訊和密碼儲存在 SQL Server 密鑰資料夾中:

    echo 'pacemaker' >> ~/pacemaker-passwd
    echo 'PACEMAKER_LOGIN_PASSWORD' >> ~/pacemaker-passwd
    sudo mv ~/pacemaker-passwd /var/opt/mssql/secrets/passwd
    sudo chown root:root /var/opt/mssql/secrets/passwd
    sudo chmod 400 /var/opt/mssql/secrets/passwd
    

    PACEMAKER_LOGIN_PASSWORD 替換為 Pacemaker 帳戶的密碼。

安裝 Pacemaker

接下來,請在所有 Linux VM 上安裝 Pacemaker,並設定登入帳戶以便管理資源。

  1. 為 Pacemaker 開啟防火牆通訊埠:

    1. node-1node-2node-3 上執行下列指令,檢查 Uncomplicated Firewall 是否已安裝及啟用。

      sudo ufw status
      
    2. 如果已啟用 ufw,請在 node-1node-2node-3 上開啟防火牆通訊埠。

      sudo ufw allow 2224/tcp
      sudo ufw allow 3121/tcp
      sudo ufw allow 5405/udp
      sudo ufw allow 21064/tcp
      sudo ufw allow 1433/tcp
      sudo ufw allow 5022/tcp
      sudo ufw reload
      
  2. node-1node-2node-3 上安裝 Pacemaker:

    sudo apt-get install -y pacemaker pacemaker-cli-utils crmsh resource-agents  fence-agents corosync python3-azure pcs
    
  3. 請為 node-1node-2node-3hacluster 使用者設定新密碼:

    sudo passwd hacluster
    

設定 Corosync

您現在將設定 Corosync,以便管理叢集成員資格和叢集內的訊息傳遞。

  1. node-1 上建立 Corosync 的驗證金鑰:

    sudo corosync-keygen
    
  2. 修改 Corosync 設定檔:

    1. 返回 node-1 並修改 corosync.conf 檔案。

      sudo vi /etc/corosync/corosync.conf
      
    2. 更新醒目顯示的部分。編輯完成後,檔案應如下所示。

      # Please read the corosync.conf.5 manual page
      totem {
          version: 2
      
          # Corosync itself works without a cluster name, but DLM needs one.
          # The cluster name is also written into the VG metadata of newly
          # created shared LVM volume groups, if lvmlockd uses DLM locking.
          cluster_name: my_agcluster
      
          # crypto_cipher and crypto_hash: Used for mutual node authentication.
          # If you choose to enable this, then do remember to create a shared
          # secret with "corosync-keygen".
          # enabling crypto_cipher, requires also enabling of crypto_hash.
          # crypto works only with knet transport
          transport: udpu
          crypto_cipher: none
          crypto_hash: none
      }
      
      logging {
          # Log the source file and line where messages are being
          # generated. When in doubt, leave off. Potentially useful for
          # debugging.
          fileline: off
          # Log to standard error. When in doubt, set to yes. Useful when
          # running in the foreground (when invoking "corosync -f")
          to_stderr: yes
          # Log to a log file. When set to "no", the "logfile" option
          # must not be set.
          to_logfile: yes
          logfile: /var/log/corosync/corosync.log
          # Log to the system log daemon. When in doubt, set to yes.
          to_syslog: yes
          # Log debug messages (very verbose). When in doubt, leave off.
          debug: off
          # Log messages with time stamps. When in doubt, set to hires (or on)
          #timestamp: hires
          logger_subsys {
              subsys: QUORUM
              debug: off
          }
      }
      quorum {
          # Enable and configure quorum subsystem (default: off)
          # see also corosync.conf.5 and votequorum.5
          provider: corosync_votequorum
      }
      nodelist {
          # Change/uncomment/add node sections to match cluster configuration
      
          node {
              # Hostname of the node
              name: node-1
              # Cluster membership node identifier
              nodeid: 1
              # Address of first link
              ring0_addr: NODE1_INTERNAL_IP
              # When knet transport is used it's possible to define up to 8 links
              #ring1_addr: 192.168.1.1
          }
          node {
              name: node-2
              nodeid: 2
              ring0_addr: NODE2_INTERNAL_IP
          }
          node {
              name: node-3
              nodeid: 3
              ring0_addr: NODE3_INTERNAL_IP
          }
          # ...
      }
      

      NODE1_INTERNAL_IPNODE2_INTERNAL_IPNODE3_INTERNAL_IP 替換為各節點的內部 IP 位址。

使用 Cloud Storage 轉移設定檔

  1. 將產生的驗證金鑰和 corosync 設定檔從 node-1 上傳至 Cloud Storage 值區:

    sudo gcloud storage cp /etc/corosync/authkey gs://BUCKET_NAME/
    sudo gcloud storage cp  /etc/corosync/corosync.conf gs://BUCKET_NAME/
    

    BUCKET_NAME 替換為先前建立的值區名稱。

  2. 將 Authkey 和設定檔下載至 node-2node-3

    sudo gcloud storage cp gs://BUCKET_NAME/authkey /etc/corosync/
    sudo gcloud storage cp gs://BUCKET_NAME/corosync.conf /etc/corosync/
    

    BUCKET_NAME 替換為 Corosync 設定檔轉移的值區名稱。

  3. 更新 node-2node-3 上的檔案權限:

    sudo chmod 400 /etc/corosync/authkey
    sudo chmod 400 /etc/corosync/corosync.conf
    

重新啟動並驗證叢集通訊

  1. node-1node-2node-3 上重新啟動 Pacemaker 和 Corosync 服務:

    sudo systemctl restart pacemaker corosync
    
  2. node-1 上執行指令,確認叢集狀態:

    sudo crm status
    

    您應該會看到所有三個節點都已上線。

設定叢集

接下來,您將為 SQL Server Always On 可用性群組建立新資源,以設定 Pacemaker 叢集。

  1. node-1 上執行下列指令,設定叢集屬性:

    sudo crm configure property stonith-enabled=false
    sudo crm configure property cluster-recheck-interval=2min
    sudo crm configure property start-failure-is-fatal=true
    

    詳情請參閱「叢集選項」。

  2. node-1 上執行指令,授權叢集中的節點。使用先前為 hacluster 帳戶設定的密碼:

    sudo pcs cluster auth -u hacluster
    

    您應該會看到所有三個節點都已授權。

  3. 安裝 SQL Server 資源代理程式,以便在 node-1node-2node-3 上與 Pacemaker 整合:

    sudo apt-get install mssql-server-ha
    
  4. 返回 node-1,並在叢集中建立可用性群組資源:

    1. 執行叢集資源管理工具。

      sudo crm
      
    2. 輸入 configure 即可進入設定選單。

    3. 輸入下列設定。

      primitive aoag1-cluster \
      ocf:mssql:ag \
      params ag_name="aoag1" \
      meta failure-timeout=60s \
      op start timeout=60s \
      op stop timeout=60s \
      op promote timeout=60s \
      op demote timeout=10s \
      op monitor timeout=60s interval=10s \
      op monitor timeout=60s on-fail=demote interval=11s role="Master" \
      op monitor timeout=60s interval=12s role="Slave" \
      op notify timeout=60s
      ms ms-ag1 aoag1-cluster \
      meta master-max="1" master-node-max="1" clone-max="3" \
      clone-node-max="1" notify="true"
      
    4. 輸入 commit 即可提交變更。

    5. 輸入 exit 即可退出叢集資源管理工具。

    6. 驗證設定。

      sudo crm status
      

      您應該會看到 node-1 已升級為主要節點。Node-2node-3 應設為次要節點。

設定負載平衡器和可用性群組的事件監聽器

在本節中,您將使用內部直通式 TCP 負載平衡器,在叢集中建立虛擬 IP 位址和健康狀態檢查資源,以便將流量轉送至可用性群組。

  1. 返回 Cloud Shell,並保留要用於叢集 IP 的靜態 IP 位址:

    gcloud compute addresses create aoag1-cluster \
    --region REGION \
    --subnet SUBNET_NAME
    CLUSTER_ADDRESS=$(gcloud compute addresses describe aoag1-cluster \
    --region $(gcloud config get-value compute/region) \
    --format=value\(address\)) && \
    echo "Cluster IP address: $CLUSTER_ADDRESS"
    

    REGIONSUBNET_NAME 替換為 Linux VM 部署所在的地區和子網路。

  2. 為每個叢集節點建立非代管執行個體群組,並將這些群組指派給新建立的執行個體群組。在 Cloud Shell 中執行下列指令:

    gcloud compute instance-groups unmanaged create node-1-uig \
    --zone=REGION-a
    gcloud compute instance-groups unmanaged add-instances node-1-uig \
    --zone=REGION-a \
    --instances=node-1
    
    gcloud compute instance-groups unmanaged create node-2-uig \
    --zone=REGION-b
    gcloud compute instance-groups unmanaged add-instances node-2-uig \
    --zone=REGION-b \
    --instances=node-2
    
    gcloud compute instance-groups unmanaged create node-3-uig \
    --zone=REGION-c
    gcloud compute instance-groups unmanaged add-instances node-3-uig \
    --zone=REGION-c \
    --instances=node-3
    

    REGION 替換為 Linux VM 部署的區域。

  3. 建立 TCP 健康狀態檢查。負載平衡器會使用健康狀態檢查功能,判斷哪些後端執行個體能夠適當回應流量。

    gcloud compute health-checks create tcp aoag1-healthcheck \
    --port=HEALTH_CHECK_PORT --proxy-header=NONE \
    --check-interval=10 --timeout=10 --unhealthy-threshold=2 \
    --healthy-threshold=2
    

    選擇並用空閒的通訊埠值取代 HEALTH_CHECK_PORT,該通訊埠必須位於 49152 至 65535 的私人範圍內。例如 60000。

    詳情請參閱健康狀態檢查總覽

  4. 將網路標記新增至叢集節點。防火牆規則會使用網路標記進行健康狀態檢查:

    gcloud compute instances add-tags node-1 \
    --tags NETWORK_TAG_NAME \
    --zone REGION-a
    gcloud compute instances add-tags node-2 \
    --tags NETWORK_TAG_NAME \
    --zone REGION-b
    gcloud compute instances add-tags node-3 \
    --tags NETWORK_TAG_NAME \
    --zone REGION-c
    

    NETWORK_TAG_NAME 替換為網路代碼的名稱。

  5. 建立防火牆規則,允許健康狀態檢查根據標記名稱存取叢集節點:

    gcloud compute firewall-rules create mssql-aoag1-fw-rule \
    --network VPC_NAME \
    --action ALLOW \
    --direction INGRESS \
    --source-ranges 35.191.0.0/16,130.211.0.0/22 \
    --target-tags NETWORK_TAG_NAME \
    --rules tcp:HEALTH_CHECK_PORT
    

    詳情請參閱「健康狀態檢查的防火牆規則」。

  6. 建立負載平衡器後端服務:

    gcloud compute backend-services create aoag1-backend \
    --load-balancing-scheme internal \
    --health-checks aoag1-healthcheck \
    --no-connection-drain-on-failover \
    --drop-traffic-if-unhealthy \
    --failover-ratio 1.0 \
    --region REGION \
    --global-health-checks
    
  7. 將三個非代管執行個體群組新增至後端服務:

    gcloud compute backend-services add-backend aoag1-backend \
    --instance-group node-1-uig \
    --instance-group-zone REGION-a \
    --region REGION
    
    gcloud compute backend-services add-backend aoag1-backend \
    --instance-group node-2-uig \
    --instance-group-zone REGION-b \
    --failover \
    --region REGION
    
    gcloud compute backend-services add-backend aoag1-backend \
    --instance-group node-3-uig \
    --instance-group-zone REGION-c \
    --failover \
    --region REGION
    
  8. 定義負載平衡器的轉送規則。轉送規則會指定負載平衡器接收流量的通訊協定和通訊埠:

    gcloud compute forwarding-rules create aoag1-fwd-rule \
    --load-balancing-scheme internal \
    --address CLUSTER_ADDRESS \
    --subnet SUBNET_NAME \
    --region REGION \
    --backend-service aoag1-backend \
    --ports ALL
    

    CLUSTER_ADDRESS 替換為先前保留的 IP 位址。

    詳情請參閱「轉送規則

  9. 如要完成設定並測試網路負載平衡器是否正確設定,請在 node-1node-2node-3 上安裝及設定 HAProxy tcp listener

    1. 安裝 HAProxy。

      sudo apt-get install haproxy
      

    2. 選擇 Y 即可完成安裝。

    3. 編輯 haproxy.cfg 檔案。

      sudo vi /etc/haproxy/haproxy.cfg
      
    4. haproxy.cfg file 的預設部分,將模式變更為 tcp

    5. haproxy.cfg 檔案結尾處附加以下部分

      #---------------------------------------------------------------
      # Set up health check listener for SQL Server Availability Group
      #---------------------------------------------------------------
      listen healthcheck
      bind *:HEALTH_CHECK_PORT
      

      HEALTH_CHECK_PORT 替換為先前選取的健康狀態檢查通訊埠。例如 6000。

    6. 啟動服務,確認設定正確無誤:

      sudo systemctl start haproxy.service
      sudo systemctl enable haproxy.service
      sudo systemctl restart haproxy.service
      
    7. 前往「負載平衡」頁面,按一下負載平衡器。觀察三個非代管執行個體群組,現在應該會回報為健康狀態。

      前往「負載平衡」

      • 或者,您也可以在 Cloud Shell 中執行下列指令,查看後端服務的狀態。

        gcloud compute backend-services get-health aoag1-backend \
        --region REGION
        

        REGION 替換為 Linux VM 部署的區域。

    8. 當所有三個未管理的執行個體群組都顯示為健康狀態時,請繼續進行下一個步驟。

      sudo systemctl restart haproxy.service
      
  10. 在 Pacemaker 中建立健康狀態檢查資源:

    1. 透過 SSH 連線至 node-1,並為 pacemaker 叢集中的 HAProxy 服務建立健康狀態檢查資源:

      sudo pcs resource create aoag1-healthcheck \
      service:haproxy \
      op monitor interval=10s timeout=20s
      
    2. 檢查健康資源是否已在主要節點 node-1 上啟動:

      sudo crm status
      
    3. 如果健康狀態檢查資源未在主要節點上啟動,請使用下列指令移動該資源:

      sudo pcs resource move aoag1-healthcheck node-1
      sudo pcs resource clear aoag1-healthcheck
      

      您會發現負載平衡器的健康狀態檢查只會針對 node-1 顯示健康狀態。

      前往「負載平衡」

  11. 在 Pacemaker 叢集中建立虛擬 IP 位址資源:

    1. 返回 node-1 上的 SSH,找出節點的網路介面名稱。在下一步中將會用到。

      ip -c link
      
    2. 建立虛擬 IP 位址資源。

      sudo pcs resource create aoag1-vip ocf:heartbeat:IPaddr2 \
      ip="CLUSTER_ADDRESS" nic=NIC_NAME cidr_netmask=32 \
      op monitor interval=3600s timeout=60s
      

      NIC_NAME 替換為上一個步驟中的網路介面名稱,並將 CLUSTER_ADDRESS 替換為保留的 IP 位址。

    3. 檢查虛擬 IP 位址資源是否已在主要主機上啟動。

      sudo crm status
      
    4. 如果虛擬 IP 位址資源未在主要節點上啟動,請使用下列指令移動該資源。

      sudo pcs resource move aoag1-vip node-1
      
    5. 將健康狀態檢查和虛擬 IP 位址資源分組。

      sudo pcs resource group add aoag1-group \
      aoag1-healthcheck aoag1-vip
      
    6. 建立限制,將新群組放在主要群組所在的節點上。

      sudo pcs constraint colocation add master aoag1-group with master ms-ag1 score=INFINITY
      

為 SQL Server 可用性群組建立監聽器

連線至含有可用性群組的 SQL Server 時,應使用可用性群組的監聽器名稱,而非伺服器名稱。如果發生容錯移轉,事件監聽器會自動將連線重新導向至叢集中的新主要節點。

  1. 返回 SSMS 並連線至 node-1 資料庫。

  2. 執行以下查詢:

    ALTER AVAILABILITY GROUP aoag1
    ADD LISTENER 'aoag1-listener' (
        WITH IP (('CLUSTER_ADDRESS','255.255.255.0')), PORT=1433
    );
    GO
    

    CLUSTER_ADDRESS 替換為保留的 IP 位址。

設定 STONITH 圍欄

STONITH 是一種隔離策略,可維持 HA 叢集中節點的完整性。STONITH 服務會在節點層級運作,保護叢集中的節點,避免發生節點無回應或處於不明狀態的情況。建議使用專為 Compute Engine 設計的 fence_gce 隔離裝置 Google Cloud。

設定圍欄裝置

  1. 檢查 node1 是否已安裝 fence_gce - Compute Engine 專用圍欄代理程式:

    sudo pcs stonith list | grep fence_gce
    

    如需詳細資訊,請參閱:

  2. node-1 上,為每個參與的節點建立 fence_gce 區隔類型資源:

    sudo pcs stonith create node-1-fence fence_gce \
    plug=node-1 \
    zone=REGION-a \
    project=PROJECT_ID \
    pcmk_reboot_timeout=300 pcmk_monitor_retries=4 pcmk_delay_max=30 \
    op monitor interval="300s" timeout="120s" \
    op start interval="0" timeout="60s"
    
    sudo pcs stonith create node-2-fence fence_gce \
    plug=node-2 \
    zone=REGION-b \
    project=PROJECT_ID \
    pcmk_reboot_timeout=300 pcmk_monitor_retries=4 pcmk_delay_max=30 \
    op monitor interval="300s" timeout="120s" \
    op start interval="0" timeout="60s"
    
    sudo pcs stonith create node-3-fence fence_gce \
    plug=node-3 \
    zone=REGION-c \
    project=PROJECT_ID \
    pcmk_reboot_timeout=300 pcmk_monitor_retries=4 pcmk_delay_max=30 \
    op monitor interval="300s" timeout="120s" \
    op start interval="0" timeout="60s"
    

    REGION 替換為 Linux VM 部署的地區,並將 PROJECT_ID 替換為專案 ID。

  3. 您可以執行狀態指令來測試圍欄代理程式的狀態:

    sudo fence_gce -o status -n node-1 --zone=REGION-a
    sudo fence_gce -o status -n node-2 --zone=REGION-b
    sudo fence_gce -o status -n node-3 --zone=REGION-c
    
  4. 為圍欄裝置建立位置限制,確保裝置只在指定的執行個體上執行:

    sudo pcs constraint location node-1-fence avoids node-1
    sudo pcs constraint location node-2-fence avoids node-2
    sudo pcs constraint location node-3-fence avoids node-3
    
  5. 在 Pacemaker 叢集中啟用圍欄功能,並設定叢集圍欄逾時時間:

    sudo pcs -f stonith_cfg property set stonith-enabled=true
    sudo pcs property set stonith-timeout="300s"
    
  6. 檢查叢集的狀態:

    sudo crm status
    

測試圍欄裝置

設定好圍欄裝置後,建議您按照下列步驟測試裝置。

  1. 停止在 node-2 上設定圍欄:

    1. 連線至 node-1 並執行下列指令,測試與叢集中 node-2 相關聯的圍欄裝置。

      fence_gce -o off -n node-2 --zone=REGION-b
      
    2. 檢查叢集的狀態。

      sudo crm status
      
    3. 您也會發現 node-2 已在 Compute Engine 中關閉。

      前往 Compute Engine

  2. node-2 上重新啟動圍欄:

    1. 返回 node-1,然後執行下列指令,再次重新啟動執行個體。

      fence_gce -o on -n node-2 --zone=REGION-b
      
    2. 請在 Pacemaker 和 Compute Engine 中檢查叢集狀態。過不久,您就會看到 node-2 已恢復連線。

      sudo crm status
      

設定 Corosync 以延遲重新啟動

為避免發生時間問題,並確保在發生圍欄動作時執行適當的作業順序,建議您將 Corosync 服務的重新啟動作業延遲 60 秒。

詳情請參閱 Red Hat 知識庫文章

  1. 建立 systemd 插入檔案,設定 node-1node-2node-3 的 Corosync 服務啟動延遲時間:

    1. 開啟 corosync.service 進行編輯。

      sudo systemctl edit corosync.service
      

    2. 接著附加下列幾行內容、儲存檔案並結束編輯器。

      [Service]
      ExecStartPre=/bin/sleep 60
      
    3. 重新載入服務管理工具,並檢查設定是否已納入考量。

      sudo systemctl daemon-reload
      systemctl status corosync.service --no-pager
      
      

      如果看到「Drop-In」部分,表示系統已成功納入 Drop-In 檔案中的設定

測試容錯移轉

您現在可以測試備援機制是否正常運作。

  1. 透過遠端桌面連線至 node-4 上的 Windows VM:
  2. 開啟 PowerShell 工作階段:
  3. 執行下列指令碼:

    while ($True){
      $Conn = New-Object System.Data.SqlClient.SqlConnection
      $Conn.ConnectionString = "Server=CLUSTER_ADDRESS;User ID=sa;Password=SA_PASSWORD;Initial Catalog=master"
      $Conn.Open()
    
      $Cmd = New-Object System.Data.SqlClient.SqlCommand
      $Cmd.Connection = $Conn
      $Cmd.CommandText = "SELECT @@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
    }
    

    CLUSTER_ADDRESS 替換為 Proxy 的 IP 位址,並將 SA_PASSWORD 替換為 SQL Server 上 SA 帳戶的密碼。

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

    讓指令碼繼續執行。

  4. 返回 node-1 的 SSH,並執行指令,觸發至 node-2 的備援:

    sudo pcs resource move ms-ag1 node-2 --master
    sudo pcs resource move aoag1-group  node-2
    sudo pcs resource move aoag1-vip node-2
    
  5. 返回 node-4 的 PowerShell 工作階段:

    1. 觀察執行中指令碼的輸出內容,並注意伺服器名稱因備援而從 node-1 變更為 node-2
  6. 返回 node-1 並啟動回復至 node-1 的程序:

    sudo pcs resource move ms-ag1 node-1 --master
    sudo pcs resource move aoag1-group  node-1
    sudo pcs resource move aoag1-vip node-1
    
  7. 返回 node-4 上的 Powershell,然後按下 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.