你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

教程:为 Azure 中 Ubuntu 虚拟机上的 SQL Server 配置可用性组

本教程介绍以下操作:

  • 创建虚拟机,将其置于可用性集中
  • 实现高可用性 (HA)
  • 创建 Pacemaker 群集
  • 通过创建 STONITH 设备来配置隔离代理
  • 在 Ubuntu 上安装 SQL Server 和 mssql-tools
  • 配置 SQL Server Always On 可用性组
  • 在 Pacemaker 群集中配置可用性组 (AG) 资源
  • 测试故障转移和隔离代理

注意

无偏差通信

本文包含对术语“从属”的引用,Microsoft 认为该术语在此上下文中存在冒犯性。 本文使用该术语的原因是,当前软件中存在该术语。 在从软件中删除该术语后,我们会将其从本文中删除。

本教程使用 Azure CLI 在 Azure 中部署资源。

如果没有 Azure 订阅,请在开始之前创建一个免费帐户

先决条件

  • 本文需要 Azure CLI 版本 2.0.30 或更高版本。 如果使用 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
    

    上一个命令创建了一个 VNet 和一个包含自定义 IP 范围的子网。

在可用性集内创建 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

/etc/corosync/authkey 位置生成身份验证密钥。 将身份验证密钥复制到此位置中的辅助服务器:/etc/corosync/authkey

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

将身份验证密钥从主目录移动到 /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 为登录 URL,然后选择“注册”
  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 shell 中的 PATH 环境变量添加 /opt/mssql-tools18/bin/

    若要使 sqlcmdbcp 能从登录会话的 bash shell 进行访问,请使用下列命令修改 ~/.bash_profile 文件中的 PATH

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

    若要使 sqlcmdbcp 能从交互式/非登录会话的 bash shell 进行访问,请使用下列命令修改 ~/.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 可用性组。 有关详细信息,请参阅配置 SQL Server Always On 可用性组以在 Linux 上实现高可用性

启用可用性组并重启 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

如果 synchronization_state_descdb1 的状态列为 SYNCHRONIZED,则表示副本已同步。 次要副本在主要副本中显示 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

后续步骤