共用方式為


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

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

  • 建立虛擬機器,將它們放在可用性設定組中
  • 啟用高可用性 (HA)
  • 建立 Pacemaker 叢集
  • 藉由建立 STONITH 裝置來設定隔離代理程式
  • 在 Ubuntu 上安裝 SQL Server 和 mssql-tools
  • 設定 SQL Server Always On 可用性群組
  • 在 Pacemaker 叢集中設定可用性群組 (AG) 資源
  • 測試容錯移轉和隔離代理程式

注意

無偏差通訊

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

本教學課程使用 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 和子網路。

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

  1. 取得在 Azure 中提供 Ubuntu 型 OS 的虛擬機器映像清單。

     az vm image list --all --offer "sql2022-ubuntupro2004"
    

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

    [
      {
        "architecture": "x64",
        "offer": "sql2022-ubuntupro2004",
        "publisher": "MicrosoftSQLServer",
        "sku": "enterprise_upro",
        "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:enterprise_upro:16.0.221108",
        "version": "16.0.221108"
      },
      {
        "architecture": "x64",
        "offer": "sql2022-ubuntupro2004",
        "publisher": "MicrosoftSQLServer",
        "sku": "enterprise_upro",
        "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:enterprise_upro:16.0.230207",
        "version": "16.0.230207"
      },
      {
        "architecture": "x64",
        "offer": "sql2022-ubuntupro2004",
        "publisher": "MicrosoftSQLServer",
        "sku": "enterprise_upro",
        "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:enterprise_upro:16.0.230808",
        "version": "16.0.230808"
      },
      {
        "architecture": "x64",
        "offer": "sql2022-ubuntupro2004",
        "publisher": "MicrosoftSQLServer",
        "sku": "sqldev_upro",
        "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:sqldev_upro:16.0.221108",
        "version": "16.0.221108"
      },
      {
        "architecture": "x64",
        "offer": "sql2022-ubuntupro2004",
        "publisher": "MicrosoftSQLServer",
        "sku": "sqldev_upro",
        "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:sqldev_upro:16.0.230207",
        "version": "16.0.230207"
      },
      {
        "architecture": "x64",
        "offer": "sql2022-ubuntupro2004",
        "publisher": "MicrosoftSQLServer",
        "sku": "sqldev_upro",
        "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:sqldev_upro:16.0.230808",
        "version": "16.0.230808"
      },
      {
        "architecture": "x64",
        "offer": "sql2022-ubuntupro2004",
        "publisher": "MicrosoftSQLServer",
        "sku": "standard_upro",
        "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:standard_upro:16.0.221108",
        "version": "16.0.221108"
      },
      {
        "architecture": "x64",
        "offer": "sql2022-ubuntupro2004",
        "publisher": "MicrosoftSQLServer",
        "sku": "standard_upro",
        "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:standard_upro:16.0.230207",
        "version": "16.0.230207"
      },
      {
        "architecture": "x64",
        "offer": "sql2022-ubuntupro2004",
        "publisher": "MicrosoftSQLServer",
        "sku": "standard_upro",
        "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:standard_upro:16.0.230808",
        "version": "16.0.230808"
      },
      {
        "architecture": "x64",
        "offer": "sql2022-ubuntupro2004",
        "publisher": "MicrosoftSQLServer",
        "sku": "web_upro",
        "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:web_upro:16.0.221108",
        "version": "16.0.221108"
      },
      {
        "architecture": "x64",
        "offer": "sql2022-ubuntupro2004",
        "publisher": "MicrosoftSQLServer",
        "sku": "web_upro",
        "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:web_upro:16.0.230207",
        "version": "16.0.230207"
      },
      {
        "architecture": "x64",
        "offer": "sql2022-ubuntupro2004",
        "publisher": "MicrosoftSQLServer",
        "sku": "web_upro",
        "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:web_upro:16.0.230808",
        "version": "16.0.230808"
      }
    ]
    

    本教學課程使用 Ubuntu 20.04

    重要

    機器名稱的長度不得超過 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 "Canonical:0001-com-ubuntu-server-jammy:20_04-lts-gen2:latest" \
           --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/ubuntu1",
  "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>@ubuntu1 ~]$

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

設定節點之間的無密碼 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>@ubuntu1
sudo ssh-copy-id <username>@ubuntu2
sudo ssh-copy-id <username>@ubuntu3

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

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

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

ssh <username>@ubuntu2
ssh <username>@ubuntu3

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

設定名稱解析

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

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

重要

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

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

  • ubuntu1:10.0.0.85
  • ubuntu2:10.0.0.86
  • ubuntu3:10.0.0.87

啟用高可用性

使用 ssh 連線至 3 個 VM 中的每一個,連線後,執行下列命令以啟用高可用性。

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

安裝和設定 Pacemaker 叢集

若要開始設定 Pacemaker 叢集,您需要安裝必要套件和資源代理程式。 在每個 VM 上執行下列命令:

sudo apt-get install -y pacemaker pacemaker-cli-utils crmsh resource-agents fence-agents csync2 python3-azure

現在繼續在主要伺服器上建立驗證金鑰:

sudo corosync-keygen

authkey 是在 /etc/corosync/authkey 位置中產生的。 將 authkey 複製到以下位置中的次要伺服器:/etc/corosync/authkey

sudo scp /etc/corosync/authkey username@ubuntu2:~
sudo scp /etc/corosync/authkey username@ubuntu3:~

將 authkey 從主目錄移至 /etc/corosync

sudo mv authkey /etc/corosync/authkey

使用下方的命令繼續建立叢集:

cd /etc/corosync/
sudo vi corosync.conf

編輯 Corosync 檔案以如下所示描述內容:

totem {
    version: 2
    secauth: off
    cluster_name: demo
    transport: udpu
}

nodelist {
    node {
        ring0_addr: 10.0.0.85
        name: ubuntu1
        nodeid: 1
    }
    node {
        ring0_addr: 10.0.0.86
        name: ubuntu2
        nodeid: 2
    }
    node {
        ring0_addr: 10.0.0.87
        name: ubuntu3
        nodeid: 3
    }
}

quorum {
    provider: corosync_votequorum
    two_node: 0
}

qb {
    ipc_type: native
}

logging {
    fileline: on
    to_stderr: on
    to_logfile: yes
    logfile: /var/log/corosync/corosync.log
    to_syslog: no
    debug: off
}

corosync.conf 檔案複製到 /etc/corosync/corosync.conf 的其他節點:

sudo scp /etc/corosync/corosync.conf username@ubuntu2:~
sudo scp /etc/corosync/corosync.conf username@ubuntu3:~
sudo mv corosync.conf /etc/corosync/

重新啟動 Pacemaker 和 Corosync,並確認以下狀態:

sudo systemctl restart pacemaker corosync
sudo crm status

輸出會看似像以下範例:

Cluster Summary:
  * Stack: corosync
  * Current DC: ubuntu1 (version 2.0.3-4b1f869f0f) - partition with quorum
  * Last updated: Wed Nov 29 07:01:32 2023
  * Last change:  Sun Nov 26 17:00:26 2023 by hacluster via crmd on ubuntu1
  * 3 nodes configured
  * 0 resource instances configured

Node List:
  * Online: [ ubuntu1 ubuntu2 ubuntu3 ]

Full List of Resources:
  * No resources

設定隔離代理程式

在叢集上設定隔離。 隔離是指隔離叢集中的故障節點。 它會重新啟動故障節點,讓它關閉、重設,然後恢復,重新加入叢集。

為了設定隔離,請執行下方動作:

  1. 在 Microsoft Entra ID 中註冊新的應用程式,然後建立祕密
  2. 在 powershell/CLI 中從 json 檔案建立自訂角色
  3. 將角色和應用程式指派給在叢集中的 VM
  4. 設定隔離代理程式屬性

在 Microsoft Entra ID 中註冊新的應用程式,然後建立祕密

  1. 前往入口網站中的 Microsoft Entra ID,並記錄租用戶 ID。
  2. 在左側功能表中,選取 [應用程式註冊],然後選取 [新註冊]
  3. 輸入名稱,然後選取 [僅限此組織目錄中的帳戶]
  4. 針對 [應用程式類型],選取 [Web],輸入 http://localhost 作為登入網址,然後選取 [註冊]
  5. 從左側功能表中選取 [憑證和祕密],然後選取 [新增用戶端密碼]
  6. 輸入描述,然後選取到期期間。
  7. 請記下秘密的值,將它用作下列密碼和秘密 ID,並用作下列使用者名稱。
  8. 選取 [概觀],並記下應用程式 ID。 它用作下列登入。

建立稱為 fence-agent-role.json 的 JSON 檔案,並新增下列項目 (新增您的訂用帳戶 ID):

{
  "Name": "Linux Fence Agent Role-ap-server-01-fence-agent",
  "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/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
  ]
}

在 PowerShell/CLI 中從 JSON 檔案建立自訂角色

az role definition create --role-definition fence-agent-role.json

將角色和應用程式指派給在叢集中的 VM

  1. 針對叢集中的每個 VM,從側邊功能表中選取 [存取控制 (IAM)]
  2. 選取 [新增角色指派] (使用傳統體驗)。
  3. 選取之前建立的 [角色]。
  4. 在 [選取] 清單中,輸入先前建立的應用程式名稱。

現在,我們可以使用先前的值和您的訂用帳戶 ID 來建立隔離代理程式資源:

  sudo crm configure primitive fence-vm stonith:fence_azure_arm \
params \
action=reboot \
resourceGroup="resourcegroupname" \
resourceGroup="$resourceGroup" \
username="$secretId" \
login="$applicationId" \
passwd="$password" \
tenantId="$tenantId" \
subscriptionId="$subscriptionId" \
pcmk_reboot_timeout=900 \
power_timeout=60 \
op monitor \
interval=3600 \
timeout=120

設定隔離代理程式屬性

執行下列命令來設定隔離代理程式屬性:

sudo crm configure property cluster-recheck-interval=2min
sudo crm configure property start-failure-is-fatal=true
sudo crm configure property stonith-timeout=900
sudo crm configure property concurrent-fencing=true
sudo crm configure property stonith-enabled=true

並確認叢集狀態:

  sudo crm status

輸出會看似像以下範例:

Cluster Summary:
  * Stack: corosync
  * Current DC: ubuntu1 (version 2.0.3-4b1f869f0f) - partition with quorum
  * Last updated: Wed Nov 29 07:01:32 2023
  * Last change:  Sun Nov 26 17:00:26 2023 by root via cibadmin on ubuntu1
  * 3 nodes configured
  * 1 resource instances configured

Node List:
  * Online: [ ubuntu1 ubuntu2 ubuntu3 ]

Full List of Resources:
  * fence-vm     (stonith:fence_azure_arm):                        Started ubuntu1

安裝 SQL Server 和 mssql-tools

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

  1. 匯入公開存放庫 GPG 金鑰:

    curl https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc
    
  2. 註冊 Ubuntu 存放庫:

    sudo add-apt-repository "$(wget -qO- https://packages.microsoft.com/config/ubuntu/20.04/mssql-server-2022.list)"
    
  3. 執行下列命令安裝 SQL Server:

    sudo apt-get update
    sudo apt-get install -y mssql-server
    
  4. 套件安裝完成之後,請執行 mssql-conf setup 並遵循提示設定 SA 密碼,然後選擇您的版本。 提醒您,下列版本免費授權:Evaluation、Developer 及 Express。

    sudo /opt/mssql/bin/mssql-conf setup
    
  5. 完成設定之後,請確認服務正在執行:

    systemctl status mssql-server --no-pager
    
  6. 安裝 SQL Server 命令列工具

若要建立資料庫,您必須與可在 SQL Server 上執行 Transact-SQL 陳述式的工具連線。 下列步驟會安裝 SQL Server 命令列工具:sqlcmdbcp

使用下列步驟在 Ubuntu 上安裝 mssql-tools18

注意

  • 從 SQL Server 2019 CU 3 開始支援 Ubuntu 18.04。
  • 從 SQL Server 2019 CU 10 開始支援 Ubuntu 20.04。
  • 從 SQL Server 2022 CU 10 開始支援 Ubuntu 22.04。
  1. 進入超級使用者模式。

    sudo su
    
  2. 匯入公開存放庫 GPG 金鑰。

    curl https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc
    
  3. 註冊 Microsoft Ubuntu 存放庫。

    • 對於 Ubuntu 22.04,請使用下列命令:

      curl https://packages.microsoft.com/config/ubuntu/22.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
      
    • 對於 Ubuntu 20.04,請使用下列命令:

      curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
      
    • 對於 Ubuntu 18.04,請使用下列命令:

      curl https://packages.microsoft.com/config/ubuntu/18.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
      
    • 對於 Ubuntu 16.04,請使用下列命令:

      curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
      
  4. 結束超級使用者模式。

    exit
    
  5. 更新來源清單,並使用 unixODBC 開發人員套件執行安裝命令。

    sudo apt-get update
    sudo apt-get install mssql-tools18 unixodbc-dev
    

    注意

    若要更新為最新版本的 mssql-tools,請執行下列命令:

    sudo apt-get update  
    sudo apt-get install mssql-tools18
    
  6. 選用:在 Bash 殼層中將 /opt/mssql-tools18/bin/ 新增至您的 PATH 環境變數。

    若要讓登入工作階段的 Bash 殼層可存取 sqlcmdbcp,請使用下列命令修改您在 PATH 檔案中的 ~/.bash_profile

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

    若要讓互動式/非登入工作階段的 Bash 殼層可存取 sqlcmdbcp,請使用下列命令修改 ~/.bashrc 檔案中的 PATH

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

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

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

sudo apt-get install mssql-server-ha

設定可用性群組

使用下列步驟,為您的 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 名稱。
  • ubuntu1ubuntu2ubuntu3 值取代為裝載複本的 SQL Server 執行個體的名稱。
CREATE AVAILABILITY
GROUP [ag1]
WITH (
        DB_FAILOVER = ON,
        CLUSTER_TYPE = EXTERNAL
        )
FOR REPLICA
    ON N'ubuntu1'
WITH (
        ENDPOINT_URL = N'tcp://ubuntu1:5022',
        AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
        FAILOVER_MODE = EXTERNAL,
        SEEDING_MODE = AUTOMATIC
        ),
    N'ubuntu2'
WITH (
        ENDPOINT_URL = N'tcp://ubuntu2:5022',
        AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
        FAILOVER_MODE = EXTERNAL,
        SEEDING_MODE = AUTOMATIC
        ),
    N'ubuntu3'
WITH (
        ENDPOINT_URL = N'tcp://ubuntu3: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 高可用性節點:

    Screenshot shows the primary and secondary availability replicas.

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

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

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

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

ALTER DATABASE [db1] SET RECOVERY FULL; -- set the database in full recovery mode
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 叢集中建立可用性群組資源

若要在 Pacemaker 中建立可用性群組資源,請執行下列命令:

sudo crm

configure

primitive ag1_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 on-fail=demote interval=11s role="Master" \
op monitor timeout=60s interval=12s role="Slave" \
op notify timeout=60s

ms ms-ag1 ag1_cluster \
meta master-max="1" master-node-max="1" clone-max="3" \
clone-node-max="1" notify="true"

commit

上述命令會建立 ag1_cluster 資源,即可用性群組資源。 然後,它會建立 ms-ag1 資源 (Pacemaker 中的主要/次要資源,然後將 AG 資源新增至其中。這可確保 AG 資源在叢集中的所有三個節點上執行,但只有其中一個節點是主要節點。)

若要檢視 AG 群組資源,以及檢查叢集的狀態,請執行以下操作:

sudo crm resource status ms-ag1
sudo crm status

輸出會看似像以下範例:

resource ms-ag1 is running on: ubuntu1 Master
resource ms-ag1 is running on: ubuntu3
resource ms-ag1 is running on: ubuntu2

輸出看起來類似下列範例。 若要新增共置和升階條件約束,請參閱<教學課程:在 Linux 虛擬機器上設定可用性群組接聽程式>(機器翻譯)。

Cluster Summary:
  * Stack: corosync
  * Current DC: ubuntu1 (version 2.0.3-4b1f869f0f) - partition with quorum
  * Last updated: Wed Nov 29 07:01:32 2023
  * Last change:  Sun Nov 26 17:00:26 2023 by root via cibadmin on ubuntu1
  * 3 nodes configured
  * 4 resource instances configured

Node List:
  * Online: [ ubuntu1 ubuntu2 ubuntu3 ]

Full List of Resources:
  * Clone Set: ms-ag1 [ag1_cluster] (promotable):
  * Masters: [ ubuntu1 ]
  * Slaves : [ ubuntu2 ubuntu3 ]
  * fence-vm     (stonith:fence_azure_arm):                        Started ubuntu1

執行下列命令以建立群組資源,讓套用至接聽程式和負載平衡器的共置和升階條件約束不需要個別套用。

sudo crm configure group virtualip-group azure-load-balancer virtualip

crm status 的輸出看起來會類似下列範例:

Cluster Summary:
  * Stack: corosync
  * Current DC: ubuntu1 (version 2.0.3-4b1f869f0f) - partition with quorum
  * Last updated: Wed Nov 29 07:01:32 2023
  * Last change:  Sun Nov 26 17:00:26 2023 by root via cibadmin on ubuntu1
  * 3 nodes configured
  * 6 resource instances configured

Node List:
  * Online: [ ubuntu1 ubuntu2 ubuntu3 ]

Full List of Resources:
  * Clone Set: ms-ag1 [ag1_cluster] (promotable):
    * Masters: [ ubuntu1 ]
    * Slaves : [ ubuntu2 ubuntu3 ]
  * Resource Group:  virtual ip-group:
    * azure-load-balancer  (ocf  :: heartbeat:azure-lb):           Started ubuntu1     
    * virtualip     (ocf :: heartbeat: IPaddr2):                   Started ubuntu1
  * fence-vm     (stonith:fence_azure_arm):                        Started ubuntu1

後續步驟