共用方式為


教學課程:在 Azure 中為 SLES 虛擬機器上的 SQL Server 設定可用性群組

適用於:Azure VM 上的 SQL Server

注意

雖然本教學課程使用 SQL Server 2022 (16.x) 搭配 SUSE Linux Enterprise Server (SLES) v15 來設定高可用性,不過也可以使用 SQL Server 2019 (15.x) 搭配 SLES v12 或 SLES v15。

在本教學課程中,您會了解如何:

  • 建立新的資源群組、可用性設定組及 Azure Linux 虛擬機器 (VM)
  • 啟用高可用性 (HA)
  • 建立 Pacemaker 叢集
  • 藉由建立 STONITH 裝置來設定隔離代理程式
  • 在 SLES 上安裝 SQL Server 和 mssql-tools
  • 設定 SQL Server Always On 可用性群組
  • 在 Pacemaker 叢集中設定可用性群組 (AG) 資源
  • 測試容錯移轉和隔離代理程式

本教學課程使用 Azure CLI 在 Azure 中部署資源。

如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶

必要條件

  • 本文需要 2.0.30 版或更新版本的 Azure CLI。 如果您是使用 Azure Cloud Shell,就已安裝最新版本。

建立資源群組

如果您有多個訂用帳戶,請設定要部署這些資源的訂用帳戶

使用下列命令,在區域中建立資源群組 <resourceGroupName>。 請將 <resourceGroupName> 取代為您選擇的名稱。 本教學課程使用 East US 2。 如需詳細資訊,請參閱下列快速入門

az group create --name <resourceGroupName> --location eastus2

建立可用性設定組

接下來要建立可用性設定組。 請在 Azure Cloud Shell 中執行下列命令,並以您的資源群組名稱取代 <resourceGroupName>。 選擇 <availabilitySetName> 的名稱。

az vm availability-set create \
    --resource-group <resourceGroupName> \
    --name <availabilitySetName> \
    --platform-fault-domain-count 2 \
    --platform-update-domain-count 2

命令完成後,您應該會得到下列結果:

{
  "id": "/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/availabilitySets/<availabilitySetName>",
  "location": "eastus2",
  "name": "<availabilitySetName>",
  "platformFaultDomainCount": 2,
  "platformUpdateDomainCount": 2,
  "proximityPlacementGroup": null,
  "resourceGroup": "<resourceGroupName>",
  "sku": {
    "capacity": null,
    "name": "Aligned",
    "tier": null
  },
  "statuses": null,
  "tags": {},
  "type": "Microsoft.Compute/availabilitySets",
  "virtualMachines": []
}

建立虛擬網路和子網路

  1. 使用預先指派的 IP 位址範圍建立具名的子網路。 在下列命令中更改以下的值:

    • <resourceGroupName>
    • <vNetName>
    • <subnetName>
    az network vnet create \
        --resource-group <resourceGroupName> \
        --name <vNetName> \
        --address-prefix 10.1.0.0/16 \
        --subnet-name <subnetName> \
        --subnet-prefix 10.1.1.0/24
    

    以上命令會建立內含自訂 IP 範圍的 VNet 和子網路。

在可用性設定組中建立 SLES VM

  1. 取得提供 SLES v15 SP4 和 BYOS (自備訂用帳戶) 的虛擬機器映像清單。 您也可以使用 SUSE Enterprise Linux 15 SP4 和修補 VM (sles-15-sp4-basic)。

    az vm image list --all --offer "sles-15-sp3-byos"
    # if you want to search the basic offers you could search using the command below
    az vm image list --all --offer "sles-15-sp3-basic"
    

    搜尋 BYOS 映像時,您應該會看見以下結果:

    [
       {
          "offer": "sles-15-sp3-byos",
          "publisher": "SUSE",
          "sku": "gen1",
          "urn": "SUSE:sles-15-sp3-byos:gen1:2022.05.05",
          "version": "2022.05.05"
       },
       {
          "offer": "sles-15-sp3-byos",
          "publisher": "SUSE",
          "sku": "gen1",
          "urn": "SUSE:sles-15-sp3-byos:gen1:2022.07.19",
          "version": "2022.07.19"
       },
       {
          "offer": "sles-15-sp3-byos",
          "publisher": "SUSE",
          "sku": "gen1",
          "urn": "SUSE:sles-15-sp3-byos:gen1:2022.11.10",
          "version": "2022.11.10"
       },
       {
          "offer": "sles-15-sp3-byos",
          "publisher": "SUSE",
          "sku": "gen2",
          "urn": "SUSE:sles-15-sp3-byos:gen2:2022.05.05",
          "version": "2022.05.05"
       },
       {
          "offer": "sles-15-sp3-byos",
          "publisher": "SUSE",
          "sku": "gen2",
          "urn": "SUSE:sles-15-sp3-byos:gen2:2022.07.19",
          "version": "2022.07.19"
       },
       {
          "offer": "sles-15-sp3-byos",
          "publisher": "SUSE",
          "sku": "gen2",
          "urn": "SUSE:sles-15-sp3-byos:gen2:2022.11.10",
          "version": "2022.11.10"
       }
    ]
    

    本教學課程使用 SUSE:sles-15-sp3-byos:gen1:2022.11.10

    重要

    機器名稱的長度不得超過 15 個字元,才能設定可用性群組。 使用者名稱不能包含大寫字元,且密碼必須介於 12 到 72 個字元之間。

  2. 在可用性設定組中建立三個 VM。 在下列命令中更改以下的值:

    • <resourceGroupName>
    • <VM-basename>
    • <availabilitySetName>
    • <VM-Size> - 例如 "Standard_D16s_v3"
    • <username>
    • <adminPassword>
    • <vNetName>
    • <subnetName>
    for i in `seq 1 3`; do
        az vm create \
           --resource-group <resourceGroupName> \
           --name <VM-basename>$i \
           --availability-set <availabilitySetName> \
           --size "<VM-Size>" \
           --os-disk-size-gb 128 \
           --image "SUSE:sles-15-sp3-byos:gen1:2022.11.10" \
           --admin-username "<username>" \
           --admin-password "<adminPassword>" \
           --authentication-type all \
           --generate-ssh-keys \
           --vnet-name "<vNetName>" \
           --subnet "<subnetName>" \
           --public-ip-sku Standard \
           --public-ip-address ""
        done
    

上述命令會使用先前定義的 VNet 來建立 VM。 如需不同設定的詳細資訊,請參閱 az vm create 一文。

此命令也包含 --os-disk-size-gb 參數,以建立 128 GB 的自訂 OS 磁碟機。 如果您稍後增加此大小,請擴充適當的資料夾磁片區,以容納您的安裝內容,並設定邏輯磁片區管理員 (LVM)

對每個 VM 完成此命令後,應該會產生如下的結果:

{
  "fqdns": "",
  "id": "/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachines/sles1",
  "location": "westus",
  "macAddress": "<Some MAC address>",
  "powerState": "VM running",
  "privateIpAddress": "<IP1>",
  "resourceGroup": "<resourceGroupName>",
  "zones": ""
}

測試與已建立的 VM 之間的連線

在 Azure Cloud Shell 中使用下列命令,連線至每一個 VM。 如果您找不到 VM IP,請依照此 Azure Cloud Shell 快速入門的指示操作。

ssh <username>@<publicIPAddress>

如果連線成功,您應會看見下列表示 Linux 終端機的輸出:

[<username>@sles1 ~]$

輸入 exit 以退出 SSH 工作階段。

向 SUSEConnect 註冊並安裝高可用性套件

若要完成本教學課程,您的 VM 必須向 SUSEConnect 註冊,才能接收更新和支援。 接著,您就可以安裝高可用性延伸模組或可啟用 HA 的套件 pattern

同時開啟每個 VM (節點) 的 SSH 工作階段,會比較方便作業,因為在這整篇文章中,都必須在每個 VM 上執行相同的命令。

如果您複製多個 sudo 命令並貼上,且系統提示您輸入密碼,系統將不會執行其他命令。 請個別執行每個命令。

連線到每個 VM 節點,以執行下列步驟。

向 SUSEConnect 註冊 VM

若要向 SUSEConnect 註冊 VM 節點,請在所有節點上更改下列命令中的這些值:

  • <subscriptionEmailAddress>
  • <registrationCode>
sudo SUSEConnect
    --url=https://scc.suse.com
    -e <subscriptionEmailAddress> \
    -r <registrationCode>

安裝高可用性延伸模組

若要安裝高可用性延伸模組,請在所有節點上執行下列命令:

sudo SUSEConnect -p sle-ha/15.3/x86_64 -r <registration code for Partner Subscription for High Availability Extension>

設定節點之間的無密碼 SSH 存取

無密碼 SSH 存取可讓您的 VM 使用 SSH 公開金鑰彼此通訊。 您必須在每個節點上設定 SSH 金鑰,並將這些金鑰複製到每個節點。

產生新的 SSH 金鑰

所需的 SSH 金鑰大小為 4,096 位元。 在每個 VM 上,變更為 /root/.ssh 資料夾,然後執行下列命令:

ssh-keygen -t rsa -b 4096

在此步驟中,系統可能會提示您覆寫現有的 SSH 檔案。 您必須同意此提示。 您不需要輸入複雜密碼。

複製公開 SSH 金鑰

在每個 VM 上,您必須使用 ssh-copy-id 命令,從您剛才建立的節點複製公開金鑰。 如果您想在目標 VM 上指定目標目錄,您可使用 -i 參數。

在下列命令中,<username> 帳戶可以是您在建立 VM 時,針對每個節點所設定的同一個帳戶。 您也可以使用 root 帳戶,但不建議在生產環境中使用此帳戶。

sudo ssh-copy-id <username>@sles1
sudo ssh-copy-id <username>@sles2
sudo ssh-copy-id <username>@sles3

確認每個節點的無密碼存取

若要確認 SSH 公開金鑰已複製到每個節點,請使用每個節點的 ssh 命令。 如果您已正確複製金鑰,系統就不會提示您輸入密碼,且會連線成功。

在此範例中,我們會從第一個 VM (sles1) 連線到第二個和第三個節點。 同樣地,<username> 帳戶可以是您在建立 VM 時,針對每個節點所設定的同一個帳戶。

ssh <username>@sles2
ssh <username>@sles3

從這三個節點重複執行此程序,讓每個節點都能在不使用密碼的情況下與其他節點通訊。

設定名稱解析

您可以使用 DNS 或手動編輯各個節點上的 etc/hosts 檔案,藉以設定名稱解析。

如需 DNS 和 Active Directory 的詳細資訊,請參閱將 Linux 主機上的 SQL Server 加入 Active Directory 網域

重要

建議您在上一個範例中使用 私人 IP 位址。 在此設定中使用公用 IP 位址會導致設定失敗,將 VM 公開至外部網路。

此範例中使用的 VM 及其 IP 位址如下所示:

  • sles1:10.0.0.85
  • sles2:10.0.0.86
  • sles3:10.0.0.87

設定叢集

本教學課程中,您的第一個 VM (sles1) 是節點 1、第二個 VM (sles2) 是節點 2,第三個 VM (sles3) 是節點 3。 如需叢集安裝的詳細資訊,請參閱在 Azure 中的 SUSE Linux Enterprise Server 上設定 Pacemaker

叢集安裝

  1. 執行下列命令,在節點 1 上安裝 ha-cluster-bootstrap 套件,然後重新啟動節點。 在此範例中,它是 sles1 VM。

    sudo zypper install ha-cluster-bootstrap
    

    節點重新啟動後,請執行下列命令來部署叢集:

    sudo crm cluster init --name sqlcluster
    

    您會看到類似下列範例的輸出內容:

    Do you want to continue anyway (y/n)? y
      Generating SSH key for root
      The user 'hacluster' will have the login shell configuration changed to /bin/bash
    Continue (y/n)? y
      Generating SSH key for hacluster
      Configuring csync2
      Generating csync2 shared key (this may take a while)...done
      csync2 checking files...done
      Detected cloud platform: microsoft-azure
    
    Configure Corosync (unicast):
      This will configure the cluster messaging layer.  You will need
      to specify a network address over which to communicate (default
      is eth0's network, but you can use the network address of any
      active interface).
    
      Address for ring0 [10.0.0.85]
      Port for ring0 [5405]
    
    Configure SBD:
      If you have shared storage, for example a SAN or iSCSI target,
      you can use it avoid split-brain scenarios by configuring SBD.
      This requires a 1 MB partition, accessible to all nodes in the
      cluster.  The device path must be persistent and consistent
      across all nodes in the cluster, so /dev/disk/by-id/* devices
      are a good choice.  Note that all data on the partition you
      specify here will be destroyed.
    
    Do you wish to use SBD (y/n)? n
    WARNING: Not configuring SBD - STONITH will be disabled.
      Hawk cluster interface is now running. To see cluster status, open:
        https://10.0.0.85:7630/
      Log in with username 'hacluster', password 'linux'
    WARNING: You should change the hacluster password to something more secure!
      Waiting for cluster..............done
      Loading initial cluster configuration
    
    Configure Administration IP Address:
      Optionally configure an administration virtual IP
      address. The purpose of this IP address is to
      provide a single IP that can be used to interact
      with the cluster, rather than using the IP address
      of any specific cluster node.
    
    Do you wish to configure a virtual IP address (y/n)? y
      Virtual IP []10.0.0.89
      Configuring virtual IP (10.0.0.89)....done
    
    Configure Qdevice/Qnetd:
      QDevice participates in quorum decisions. With the assistance of
      a third-party arbitrator Qnetd, it provides votes so that a cluster
      is able to sustain more node failures than standard quorum rules
      allow. It is recommended for clusters with an even number of nodes
      and highly recommended for 2 node clusters.
    
    Do you want to configure QDevice (y/n)? n
    Done (log saved to /var/log/crmsh/ha-cluster-bootstrap.log)
    
  2. 使用下列命令檢查節點 1 上的叢集狀態:

    sudo crm status
    

    如果成功輸出,輸出內容應會包含下列文字:

    1 node configured
    1 resource instance configured
    
  3. 所有節點上,使用下列命令將 hacluster 的密碼變更成更安全的內容。 您也必須變更 root 使用者密碼:

    sudo passwd hacluster
    
    sudo passwd root
    
  4. 節點 2節點 3 上執行下列命令,以便先安裝 crmsh 套件:

    sudo zypper install crmsh
    

    現在,請執行命令以加入叢集:

    sudo crm cluster join
    

    預期產生的一些互動如下:

    Join This Node to Cluster:
    You will be asked for the IP address of an existing node, from which
    configuration will be copied.  If you have not already configured
    passwordless ssh between nodes, you will be prompted for the root
    password of the existing node.
    
      IP address or hostname of existing node (e.g.: 192.168.1.1) []10.0.0.85
      Configuring SSH passwordless with root@10.0.0.85
      root@10.0.0.85's password:
      Configuring SSH passwordless with hacluster@10.0.0.85
      Configuring csync2...done
    Merging known_hosts
    WARNING: scp to sles2 failed (Exited with error code 1, Error output: The authenticity of host 'sles2 (10.1.1.5)' can't be established.
    ECDSA key fingerprint is SHA256:UI0iyfL5N6X1ZahxntrScxyiamtzsDZ9Ftmeg8rSBFI.
    Are you sure you want to continue connecting (yes/no/[fingerprint])?
    lost connection
    ), known_hosts update may be incomplete
    Probing for new partitions...done
      Address for ring0 [10.0.0.86]
    
    Hawk cluster interface is now running. To see cluster status, open:
        https://10.0.0.86:7630/
      Log in with username 'hacluster', password 'linux'
    WARNING: You should change the hacluster password to something more secure!
    Waiting for cluster.....done
    Reloading cluster configuration...done
      Done (log saved to /var/log/crmsh/ha-cluster-bootstrap.log)
    
  5. 將所有機器加入叢集之後,請檢查您的資源,查看所有 VM 是否都在線上:

    sudo crm status
    

    您應該會看見下列輸出:

    Stack: corosync
     Current DC: sles1 (version 2.0.5+20201202.ba59be712-150300.4.30.3-2.0.5+20201202.ba59be712) - partition with quorum
     Last updated: Mon Mar  6 18:01:17 2023
     Last change:  Mon Mar  6 17:10:09 2023 by root via cibadmin on sles1
    
    3 nodes configured
    1 resource instance configured
    
    Online: [ sles1 sles2 sles3 ]
    
    Full list of resources:
    
     admin-ip       (ocf::heartbeat:IPaddr2):       Started sles1
    
  6. 安裝叢集資源元件。 在所有節點上執行下列命令。

    sudo zypper in socat
    
  7. 安裝 azure-lb 元件。 在所有節點上執行下列命令。

    sudo zypper in resource-agents
    
  8. 設定作業系統。 在所有節點上快速執行下列步驟。

    1. 編輯設定檔。

      sudo vi /etc/systemd/system.conf
      
    2. DefaultTasksMax 值變更為 4096

      #DefaultTasksMax=512
      DefaultTasksMax=4096
      
    3. 儲存並結束 vi 編輯器。

    4. 若要啟用此設定,請執行下列命令:

      sudo systemctl daemon-reload
      
    5. 測試變更是否成功:

      sudo systemctl --no-pager show | grep DefaultTasksMax
      
  9. 縮減已變更的快取大小。 在所有節點上快速執行下列步驟。

    1. 編輯系統控制設定檔:

      sudo vi /etc/sysctl.conf
      
    2. 將下列兩行新增至檔案中:

      vm.dirty_bytes = 629145600
      vm.dirty_background_bytes = 314572800
      
    3. 儲存並結束 vi 編輯器。

  10. 使用下列命令,在所有節點上安裝 Azure Python SDK:

    sudo zypper install fence-agents
    # Install the Azure Python SDK on SLES 15 or later:
    # You might need to activate the public cloud extension first. In this example, the SUSEConnect command is for SLES 15 SP1
    SUSEConnect -p sle-module-public-cloud/15.1/x86_64
    sudo zypper install python3-azure-mgmt-compute
    sudo zypper install python3-azure-identity
    

設定隔離代理程式

STONITH 裝置提供隔離代理程式。 以下是針對本教學課程進行修改的指示。 如需詳細資訊,請參閱建立 Azure 柵欄代理程式 STONITH 裝置

檢查 Azure 柵欄代理程式的版本,以確保版本已更新。 使用下列命令:

sudo zypper info resource-agents

您應該會看到類似於下列範例的輸出。

Information for package resource-agents:
----------------------------------------
Repository     : SLE-Product-HA15-SP3-Updates
Name           : resource-agents
Version        : 4.8.0+git30.d0077df0-150300.8.37.1
Arch           : x86_64
Vendor         : SUSE LLC <https://www.suse.com/>
Support Level  : Level 3
Installed Size : 2.5 MiB
Installed      : Yes (automatically)
Status         : up-to-date
Source package : resource-agents-4.8.0+git30.d0077df0-150300.8.37.1.src
Upstream URL   : http://linux-ha.org/
Summary        : HA Reusable Cluster Resource Scripts
Description    : A set of scripts to interface with several services
                 to operate in a High Availability environment for both
                 Pacemaker and rgmanager service managers.

在 Microsoft Entra ID 中註冊新的應用程式

若要在 Microsoft Entra ID (先前稱為 Azure Active Directory) 中註冊新的應用程式,請依循下列步驟:

  1. 移至 https://portal.azure.com
  2. 開啟 [Microsoft Entra ID 屬性] 窗格,並記下 Tenant ID
  3. 選取 應用程式註冊
  4. 選取新增註冊
  5. 輸入名稱,例如 <resourceGroupName>-app。 若為支援的帳戶類型,請選取 [僅此組織目錄中的帳戶 (僅 Microsoft – 單一租用戶)]
  6. 選取 Web 作為 [重新導向 URI],然後輸入 URL (例如,http://localhost)) 並選取 [新增]。 登入網址可以是任何有效的網址。 完成後,請選取 [註冊]。
  7. 選擇新應用程式註冊的 [憑證和祕密],然後選取 [新用戶端密碼]
  8. 輸入新金鑰 (用戶端密碼) 的說明,然後選取 [新增]
  9. 記下秘密的值。 此值會作為服務主體的密碼使用。
  10. 選取 [概觀]。 記下應用程式識別碼。 它用作服務主體的使用者名稱 (以下步驟中的登入識別碼)。

為柵欄代理程式建立自訂角色

遵循教學課程來使用 Azure CLI 建立 Azure 自訂角色

您的 JSON 檔案應會類似於下列範例:

  • <username> 取代為您選擇的名稱。 這是為了避免在建立此角色定義時出現重複的狀況。
  • <subscriptionId> 取代為您的 Azure 訂用帳戶識別碼。
{
  "Name": "Linux Fence Agent Role-<username>",
  "Id": null,
  "IsCustom": true,
  "Description": "Allows to power-off and start virtual machines",
  "Actions": [
    "Microsoft.Compute/*/read",
    "Microsoft.Compute/virtualMachines/powerOff/action",
    "Microsoft.Compute/virtualMachines/start/action"
  ],
  "NotActions": [
  ],
  "AssignableScopes": [
    "/subscriptions/<subscriptionId>"
  ]
}

若要新增角色,請執行下列命令:

  • <filename> 取代為檔案名稱。
  • 如果您不是從檔案儲存後所在的資料夾執行命令,而是從其他路徑執行命令,請在命令中放入檔案的資料夾路徑。
az role definition create --role-definition "<filename>.json"

您應該會看見下列輸出:

{
  "assignableScopes": [
    "/subscriptions/<subscriptionId>"
  ],
  "description": "Allows to power-off and start virtual machines",
  "id": "/subscriptions/<subscriptionId>/providers/Microsoft.Authorization/roleDefinitions/<roleNameId>",
  "name": "<roleNameId>",
  "permissions": [
    {
      "actions": [
        "Microsoft.Compute/*/read",
        "Microsoft.Compute/virtualMachines/powerOff/action",
        "Microsoft.Compute/virtualMachines/start/action"
      ],
      "dataActions": [],
      "notActions": [],
      "notDataActions": []
    }
  ],
  "roleName": "Linux Fence Agent Role-<username>",
  "roleType": "CustomRole",
  "type": "Microsoft.Authorization/roleDefinitions"
}

將自訂角色指派給服務主體

將您在上一個步驟中建立的自訂角色 Linux Fence Agent Role-<username> 指派給服務主體。 對所有節點重複執行這些步驟。

警告

從這裡開始,切勿使用擁有者角色。

  1. 移至 https://portal.azure.com
  2. 開啟 [所有資源] 窗格
  3. 選取第一個叢集節點的虛擬機器
  4. 選取 [存取控制 (IAM)]
  5. 選取 [新增角色指派]
  6. 從 [角色] 清單中選取角色 Linux Fence Agent Role-<username>
  7. 將 [指派存取權] 保留為預設值 Users, group, or service principal
  8. 在 [選取] 清單中,輸入您先前所建立應用程式的名稱,例如 <resourceGroupName>-app
  9. 選取 [儲存]。

建立 STONITH 裝置

  1. 節點 1 上執行下列命令:

    • <ApplicationID> 取代為您的應用程式註冊中的識別碼值。
    • <servicePrincipalPassword> 取代為用戶端密碼中的值。
    • 以本教學課程中所用之訂閱的資源群組取代 <resourceGroupName>
    • 取代您 Azure 訂用帳戶中的 <tenantID><subscriptionId>
  2. 執行 crm configure 以開啟 crm 提示:

    sudo crm configure
    
  3. crm 提示中,執行下列命令來設定資源屬性,這麼做會建立名為 rsc_st_azure 的資源,如下列範例所示:

    primitive rsc_st_azure stonith:fence_azure_arm params subscriptionId="subscriptionID" resourceGroup="ResourceGroup_Name" tenantId="TenantID" login="ApplicationID" passwd="servicePrincipalPassword" pcmk_monitor_retries=4 pcmk_action_limit=3 power_timeout=240 pcmk_reboot_timeout=900 pcmk_host_map="sles1:sles1;sles2:sles2;sles3:sles3" op monitor interval=3600 timeout=120
    commit
    quit
    
  4. 執行下列命令來設定柵欄代理程式:

    sudo crm configure property stonith-timeout=900
    sudo crm configure property stonith-enabled=true
    sudo crm configure property concurrent-fencing=true
    
  5. 檢查叢集的狀態,以查看 STONITH 是否已啟用:

    sudo crm status
    

    您應該會看到類似以下文字的輸出:

    Stack: corosync
     Current DC: sles1 (version 2.0.5+20201202.ba59be712-150300.4.30.3-2.0.5+20201202.ba59be712) - partition with quorum
     Last updated: Mon Mar  6 18:20:17 2023
     Last change:  Mon Mar  6 18:10:09 2023 by root via cibadmin on sles1
    
    3 nodes configured
    2 resource instances configured
    
    Online: [ sles1 sles2 sles3 ]
    
    Full list of resources:
    
    admin-ip       (ocf::heartbeat:IPaddr2):       Started sles1
    rsc_st_azure   (stonith:fence_azure_arm):      Started sles2
    

安裝 SQL Server 和 mssql-tools

依照下一節的指示操作,安裝 SQL Server 和 mssql-tools。 如需詳細資訊,請參閱在 SUSE Linux Enterprise Server 上安裝 SQL Server

在本節所有節點上執行這些步驟。

在 VM 上安裝 SQL Server

下列命令可用來安裝 SQL Server:

  1. 下載 Microsoft SQL Server 2019 SLES 存放庫設定檔:

    sudo zypper addrepo -fc https://packages.microsoft.com/config/sles/15/mssql-server-2022.repo
    
  2. 重新整理您的存放庫。

    sudo zypper --gpg-auto-import-keys refresh
    

    若要確定您的系統上是否已安裝 Microsoft 套件簽署金鑰,請使用下列命令來匯入金鑰:

    sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
    
  3. 執行下列命令安裝 SQL Server:

    sudo zypper install -y mssql-server
    
  4. 套件安裝完成之後,請執行 mssql-conf setup 並遵循提示設定 SA 密碼,然後選擇您的版本。

    sudo /opt/mssql/bin/mssql-conf setup
    

    注意

    請務必為 SA 帳戶指定強式密碼 (最小長度為 8 個字元,包括大小寫字母、以 10 為基底的數字及/或非英數字元符號)。

  5. 完成設定之後,請確認服務正在執行:

    systemctl status mssql-server
    

安裝 SQL Server 命令列工具

下列步驟會安裝 SQL Server 命令列工具,也就是 sqlcmdbcp

  1. 將 Microsoft SQL Server 存放庫新增至 Zypper。

    sudo zypper addrepo -fc https://packages.microsoft.com/config/sles/15/prod.repo
    
  2. 重新整理您的存放庫。

    sudo zypper --gpg-auto-import-keys refresh
    
  3. 使用 unixODBC 開發人員套件安裝 mssql-tools。 如需詳細資訊,請參閱安裝 Microsoft ODBC Driver for SQL Server (Linux)

    sudo zypper install -y mssql-tools unixODBC-devel
    

為了方便起見,您可以將 /opt/mssql-tools/bin/ 新增至您的 PATH 環境變數。 這可讓您不需要指定完整路徑,即可執行工具。 執行下列命令,以修改登入工作階段和互動式/非登入工作階段的 PATH:

echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
source ~/.bashrc

安裝 SQL Server 高可用性代理程式

所有節點上執行下列命令,以安裝 SQL Server 的高可用性代理程式套件:

sudo zypper install mssql-server-ha

為高可用性服務開啟連接埠

  1. 您可以在 SQL Server 和 HA 服務的所有節點上開啟下列防火牆連接埠:1433、2224、3121、5022、5405、21064。

    sudo firewall-cmd --zone=public --add-port=1433/tcp --add-port=2224/tcp --add-port=3121/tcp --add-port=5022/tcp --add-port=5405/tcp --add-port=21064 --permanent
    sudo firewall-cmd --reload
    

設定可用性群組

使用下列步驟,為您的 VM 設定 SQL Server Always On 可用性群組。 如需詳細資訊,請參閱在 Linux 上設定 SQL Server Always On 可用性群組,以達高可用性

啟用可用性群組並重新啟動 SQL Server

在每個裝載 SQL Server 執行個體的節點上啟用可用性群組, 然後重新啟動 mssql-server 服務。 在每個節點上執行下列命令:

sudo /opt/mssql/bin/mssql-conf set hadr.hadrenabled 1
sudo systemctl restart mssql-server

建立憑證

Microsoft 不支援對 AG 端點執行 Active Directory 驗證, 因此您必須使用憑證為 AG 端點加密。

  1. 使用 SQL Server Management Studio (SSMS) 或 sqlcmd 連線至所有節點。 執行下列命令,以啟用 AlwaysOn_health 工作階段,並建立主要金鑰:

    重要

    如果您從遠端連線至 SQL Server 執行個體,則需要在防火牆上開啟連接埠 1433。 您也必須在每個 VM 的 NSG 中,允許對連接埠 1433 的輸入連線。 如需詳細資訊,請參閱建立安全性規則,以了解如何建立輸入安全性規則。

    • <MasterKeyPassword> 取代為您自己的密碼。
    ALTER EVENT SESSION AlwaysOn_health ON SERVER
        WITH (STARTUP_STATE = ON);
    GO
    
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<MasterKeyPassword>';
    GO
    
  2. 使用 SSMS 或 sqlcmd 連線至主要複本。 下列命令會在您主要 SQL Server 複本的 /var/opt/mssql/data/dbm_certificate.cer 建立憑證,並在 var/opt/mssql/data/dbm_certificate.pvk 建立私密金鑰:

    • <PrivateKeyPassword> 取代為您自己的密碼。
    CREATE CERTIFICATE dbm_certificate
        WITH SUBJECT = 'dbm';
    GO
    
    BACKUP CERTIFICATE dbm_certificate TO FILE = '/var/opt/mssql/data/dbm_certificate.cer'
    WITH PRIVATE KEY (
            FILE = '/var/opt/mssql/data/dbm_certificate.pvk',
            ENCRYPTION BY PASSWORD = '<PrivateKeyPassword>'
            );
    GO
    

執行 exit 命令以結束 sqlcmd 工作階段,然後回到您的 SSH 工作階段。

將憑證複製到次要複本並在伺服器上建立憑證

  1. 將先前建立的兩個檔案複製到將裝載可用性複本的所有伺服器上的相同位置。

    在主要伺服器上執行下列 scp 命令,將憑證複製到目標伺服器:

    • <username>sles2 更改為您所使用的使用者名稱和目標 VM 名稱。
    • 對所有次要複本執行此命令。

    注意

    您不需要執行為您提供根環境的 sudo -i。 您可以改為在每個命令前面執行 sudo 命令。

    # The below command allows you to run commands in the root environment
    sudo -i
    
    scp /var/opt/mssql/data/dbm_certificate.* <username>@sles2:/home/<username>
    
  2. 在目標伺服器上,執行下列命令:

    • <username> 取代為您的使用者名稱。
    • mv 命令會將檔案或目錄移至另一個位置。
    • chown 命令可用來變更檔案、目錄或連結的擁有者和群組。
    • 對所有次要複本執行這些命令。
    sudo -i
    mv /home/<username>/dbm_certificate.* /var/opt/mssql/data/
    cd /var/opt/mssql/data
    chown mssql:mssql dbm_certificate.*
    
  3. 下列 Transact-SQL 指令碼會從您在 SQL Server 主要複本上建立的備份建立憑證。 請以強式密碼更新指令碼。 解密密碼與您在上一個步驟中用來建立 .pvk 檔案的密碼相同。 若要建立憑證,請使用 sqlcmd 或 SSMS 在所有次要伺服器上執行下列指令碼:

    CREATE CERTIFICATE dbm_certificate
        FROM FILE = '/var/opt/mssql/data/dbm_certificate.cer'
        WITH PRIVATE KEY (
        FILE = '/var/opt/mssql/data/dbm_certificate.pvk',
        DECRYPTION BY PASSWORD = '<PrivateKeyPassword>'
    );
    GO
    

在所有複本上建立資料庫鏡像端點

使用 sqlcmd 或 SSMS,在所有 SQL Server 執行個體上執行下列指令碼:

CREATE ENDPOINT [Hadr_endpoint]
   AS TCP (LISTENER_PORT = 5022)
   FOR DATABASE_MIRRORING (
   ROLE = ALL,
   AUTHENTICATION = CERTIFICATE dbm_certificate,
ENCRYPTION = REQUIRED ALGORITHM AES
);
GO

ALTER ENDPOINT [Hadr_endpoint] STATE = STARTED;
GO

建立可用性群組

使用 sqlcmd 或 SSMS,連線至裝載主要複本的 SQL Server 執行個體。 執行下列命令,以建立可用性群組:

  • ag1 更改成您想使用的 AG 名稱。
  • sles1sles2sles3 值取代為裝載複本的 SQL Server 執行個體的名稱。
CREATE AVAILABILITY
GROUP [ag1]
WITH (
        DB_FAILOVER = ON,
        CLUSTER_TYPE = EXTERNAL
        )
FOR REPLICA
    ON N'sles1'
WITH (
        ENDPOINT_URL = N'tcp://sles1:5022',
        AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
        FAILOVER_MODE = EXTERNAL,
        SEEDING_MODE = AUTOMATIC
        ),
    N'sles2'
WITH (
        ENDPOINT_URL = N'tcp://sles2:5022',
        AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
        FAILOVER_MODE = EXTERNAL,
        SEEDING_MODE = AUTOMATIC
        ),
    N'sles3'
WITH (
        ENDPOINT_URL = N'tcp://sles3:5022',
        AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
        FAILOVER_MODE = EXTERNAL,
        SEEDING_MODE = AUTOMATIC
        );
GO

ALTER AVAILABILITY GROUP [ag1]
GRANT CREATE ANY DATABASE;
GO

為 Pacemaker 建立 SQL Server 登入

在所有 SQL Server 執行個體上,建立 Pacemaker 的 SQL Server 登入。 下列 Transact-SQL 會建立登入。

  • <password> 取代為您自己的複雜密碼。
USE [master]
GO

CREATE LOGIN [pacemakerLogin]
    WITH PASSWORD = N'<password>';
GO

ALTER SERVER ROLE [sysadmin]
    ADD MEMBER [pacemakerLogin];
GO

在所有 SQL Server 執行個體上,儲存 SQL Server 登入所使用的認證。

  1. 建立檔案:

    sudo vi /var/opt/mssql/secrets/passwd
    
  2. 將下列兩行新增至檔案中:

    pacemakerLogin
    <password>
    

    若要結束 vi 編輯器,請先按 Esc 鍵,然後輸入命令 :wq 以寫入檔案並結束。

  3. 使該檔案只能由 root 讀取:

    sudo chown root:root /var/opt/mssql/secrets/passwd
    sudo chmod 400 /var/opt/mssql/secrets/passwd
    

將次要複本聯結至可用性群組

  1. 在次要複本上執行下列命令,以將其聯結至 AG:

    ALTER AVAILABILITY GROUP [ag1] JOIN WITH (CLUSTER_TYPE = EXTERNAL);
    GO
    
    ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE;
    GO
    
  2. 對主要複本與每個次要複本,執行下列 Transact-SQL 指令碼:

    GRANT ALTER, CONTROL, VIEW DEFINITION
        ON AVAILABILITY GROUP::ag1 TO pacemakerLogin;
    GO
    
    GRANT VIEW SERVER STATE TO pacemakerLogin;
    GO
    
  3. 聯結次要複本後,您可以在 SSMS 物件總管中加以檢視,方法是展開 Always On 高可用性節點:

    此螢幕擷取畫面顯示主要和次要可用性複本。

將資料庫新增至可用性群組

本節主要遵循將資料庫新增至可用性群組一文。

此步驟使用下列 Transact-SQL 命令。 在主要複本上執行下列命令:

CREATE DATABASE [db1]; -- creates a database named db1
GO

ALTER DATABASE [db1] SET RECOVERY FULL; -- set the database in full recovery model
GO

BACKUP DATABASE [db1] -- backs up the database to disk
    TO DISK = N'/var/opt/mssql/data/db1.bak';
GO

ALTER AVAILABILITY GROUP [ag1] ADD DATABASE [db1]; -- adds the database db1 to the AG
GO

確認已在次要伺服器上建立資料庫

在每個 SQL Server 次要複本上執行下列查詢,以確認 db1 資料庫是否已建立並處於 SYNCHRONIZED 狀態:

SELECT * FROM sys.databases
WHERE name = 'db1';
GO

SELECT DB_NAME(database_id) AS 'database',
    synchronization_state_desc
FROM sys.dm_hadr_database_replica_states;
GO

db1synchronization_state_desc 列示 [已同步],表示複本已同步。 次要複本會在主要複本中顯示 db1

在 Pacemaker 叢集中建立可用性群組資源

注意

無偏差通訊

本發行項包含字詞「奴隸」的參考;Microsoft 將此內容中使用該字詞視為有冒犯性。 因為該字詞目前出現在軟體中,所以也會出現在本發行項中。 當軟體移除該字詞時,我們也會將其從發行項中移除。

本文主要參考在 Pacemaker 叢集中建立可用性群組資源一文。

啟用 Pacemaker

啟用 Pacemaker,讓它能夠自動啟動。

在叢集的所有節點上執行下列命令。

sudo systemctl enable pacemaker

建立 AG 叢集資源

  1. 執行 crm configure 以開啟 crm 提示:

    sudo crm configure
    
  2. crm 提示中執行下列命令,以設定資源屬性。 下列命令會在可用性群組 ag1 中建立資源 ag_cluster

    primitive ag_cluster ocf:mssql:ag params ag_name="ag1" 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 interval=11s role="Master" op monitor timeout=60s interval=12s role="Slave" op notify timeout=60s ms ms-ag_cluster ag_cluster meta master-max="1" master-node-max="1" clone-max="3" clone-node-max="1" notify="true"
    commit
    quit
    

    提示

    輸入 quit 以結束 crm 提示。

  3. 設定虛擬 IP 的共同位置限制式,以便在與主要節點相同的節點上執行:

    sudo crm configure
    colocation vip_on_master inf: admin-ip ms-ag_cluster: Master
    commit
    quit
    
  4. 新增排序限制式,以防止 IP 位址暫時指向含容錯移轉前之次要複本的節點。 執行下列命令,以建立排序限制式:

    sudo crm configure
    order ag_first inf: ms-ag_cluster:promote admin-ip:start
    commit
    quit
    
  5. 使用命令檢查叢集的狀態:

    sudo crm status
    

    輸出內容應會類似於下列範例:

    Cluster Summary:
      * Stack: corosync
      * Current DC: sles1 (version 2.0.5+20201202.ba59be712-150300.4.30.3-2.0.5+20201202.ba59be712) - partition with quorum
      * Last updated: Mon Mar  6 18:38:17 2023
      * Last change:  Mon Mar  6 18:38:09 2023 by root via cibadmin on sles1
      * 3 nodes configured
      * 5 resource instances configured
    
    Node List:
      * Online: [ sles1 sles2 sles3 ]
    
    Full List of Resources:
      * admin-ip    (ocf::heartbeat:IPaddr2):                Started sles1
      * rsc_st_azure        (stonith:fence_azure_arm):       Started sles2
      * Clone Set: ms-ag_cluster [ag_cluster] (promotable):
        * Masters: [ sles1 ]
        * Slaves: [ sles2 sles3 ]
    
  6. 執行下列命令以檢閱限制式:

    sudo crm configure show
    

    輸出內容應會類似於下列範例:

    node 1: sles1
    node 2: sles2
    node 3: sles3
    primitive admin-ip IPaddr2 \
            params ip=10.0.0.93 \
            op monitor interval=10 timeout=20
    primitive ag_cluster ocf:mssql:ag \
            params ag_name=ag1 \
            meta failure-timeout=60s \
            op start timeout=60s interval=0 \
            op stop timeout=60s interval=0 \
            op promote timeout=60s interval=0 \
            op demote timeout=10s interval=0 \
            op monitor timeout=60s interval=10s \
            op monitor timeout=60s interval=11s role=Master \
            op monitor timeout=60s interval=12s role=Slave \
            op notify timeout=60s interval=0
    primitive rsc_st_azure stonith:fence_azure_arm \
            params subscriptionId=xxxxxxx resourceGroup=amvindomain tenantId=xxxxxxx login=xxxxxxx passwd="******" cmk_monitor_retries=4 pcmk_action_limit=3 power_timeout=240 pcmk_reboot_timeout=900 pcmk_host_map="sles1:sles1;les2:sles2;sles3:sles3" \
            op monitor interval=3600 timeout=120
    ms ms-ag_cluster ag_cluster \
            meta master-max=1 master-node-max=1 clone-max=3 clone-node-max=1 notify=true
    order ag_first Mandatory: ms-ag_cluster:promote admin-ip:start
    colocation vip_on_master inf: admin-ip ms-ag_cluster:Master
    property cib-bootstrap-options: \
            have-watchdog=false \
            dc-version="2.0.5+20201202.ba59be712-150300.4.30.3-2.0.5+20201202.ba59be712" \
            cluster-infrastructure=corosync \
            cluster-name=sqlcluster \
            stonith-enabled=true \
            concurrent-fencing=true \
            stonith-timeout=900
    rsc_defaults rsc-options: \
            resource-stickiness=1 \
            migration-threshold=3
    op_defaults op-options: \
            timeout=600 \
            record-pending=true
    

測試容錯移轉

為了確保設定到目前為止均順利進行,我們要執行容錯移轉測試。 如需詳細資訊,請參閱 Linux 上的 Always On 可用性群組容錯移轉

  1. 執行下列命令,手動將主要複本容錯移轉至 sles2。 將 sles2 取代為您伺服器名稱的值。

    sudo crm resource move ag_cluster sles2
    

    輸出內容應會類似於下列範例:

    INFO: Move constraint created for ms-ag_cluster to sles2
    INFO: Use `crm resource clear ms-ag_cluster` to remove this constraint
    
  2. 檢查叢集的狀態:

    sudo crm status
    

    輸出內容應會類似於下列範例:

    Cluster Summary:
      * Stack: corosync
      * Current DC: sles1 (version 2.0.5+20201202.ba59be712-150300.4.30.3-2.0.5+20201202.ba59be712) - partition with quorum
      * Last updated: Mon Mar  6 18:40:02 2023
      * Last change:  Mon Mar  6 18:39:53 2023 by root via crm_resource on sles1
      * 3 nodes configured
      * 5 resource instances configured
    
    Node List:
      * Online: [ sles1 sles2 sles3 ]
    
    Full List of Resources:
      * admin-ip    (ocf::heartbeat:IPaddr2):                Stopped
      * rsc_st_azure        (stonith:fence_azure_arm):       Started sles2
      * Clone Set: ms-ag_cluster [ag_cluster] (promotable):
        * Slaves: [ sles1 sles2 sles3 ]
    
  3. 一段時間後,sles2 VM 現在已是主要 VM,其他兩個 VM 則是次要 VM。 再次執行 sudo crm status 並檢閱輸出內容,該內容應會類似於下列範例:

    Cluster Summary:
      * Stack: corosync
      * Current DC: sles1 (version 2.0.5+20201202.ba59be712-150300.4.30.3-2.0.5+20201202.ba59be712) - partition with quorum
      * Last updated: Tue Mar  6 22:00:44 2023
      * Last change:  Mon Mar  6 18:42:59 2023 by root via cibadmin on sles1
      * 3 nodes configured
      * 5 resource instances configured
    
    Node List:
      * Online: [ sles1 sles2 sles3 ]
    
    Full List of Resources:
      * admin-ip    (ocf::heartbeat:IPaddr2):                Started sles2
      * rsc_st_azure        (stonith:fence_azure_arm):       Started sles2
      * Clone Set: ms-ag_cluster [ag_cluster] (promotable):
        * Masters: [ sles2 ]
        * Slaves: [ sles1 sles3 ]
    
  4. 使用 crm config show 再次檢查您的限制式。 觀察系統是否因為您執行了手動容錯移轉,而新增了另一個限制式。

  5. 使用下列命令,移除識別碼為 cli-prefer-ag_cluster 的限制式:

    crm configure
    delete cli-prefer-ms-ag_cluster
    commit
    

測試隔離

您可以執行下列命令來測試 STONITH。 請嘗試對 sles3 執行以下來自 sles1 的命令。

sudo crm node fence sles3

後續步驟