你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
本教程介绍以下操作:
- 创建虚拟机,将其置于可用性集中
- 实现高可用性 (HA)
- 创建 Pacemaker 群集
- 通过创建 STONITH 设备来配置隔离代理
- 在 Ubuntu 上安装 SQL Server 和 mssql 工具
- 配置 SQL Server Always On 可用性组
- 在 Pacemaker 群集中配置可用性组 (AG) 资源
- 测试故障转移和隔离代理
注释
本文包含对术语“从属”的引用,这是 Microsoft 不再使用的术语。 从软件中删除术语后,我们会将其从本文中删除。
本教程使用 Azure CLI 在 Azure 中部署资源。
如果没有 Azure 订阅,请在开始之前创建一个免费帐户。
先决条件
在 Azure Cloud Shell 中使用 Bash 环境。 有关详细信息,请参阅 Azure Cloud Shell 入门。
如需在本地运行 CLI 参考命令,请安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅如何在 Docker 容器中运行 Azure CLI。
如果使用的是本地安装,请使用 az login 命令登录到 Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅 使用 Azure CLI 向 Azure 进行身份验证。
出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展的详细信息,请参阅 使用和管理 Azure CLI 中的扩展。
运行az version命令,以查看已安装的版本和依赖库。 若要升级到最新版本,请运行az upgrade。
- 本文需要 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": []
}
创建虚拟网络和子网
创建具有预分配 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 虚拟机
获取在 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 个字符之间。
在可用性集中创建三个 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
配置隔离代理
在群集上配置隔离。 隔离 是群集中失败节点的隔离。 它重新启动失败的节点,允许其关闭、重置,然后重新启动并加入群集。
若要配置隔离,请执行以下步骤:
- 在 Microsoft Entra ID 中注册新应用程序并创建机密
- 在 powershell/CLI 中从 json 文件创建自定义角色
- 将角色和应用程序分配到群集中的 VM
- 设置隔离代理属性
在 Microsoft Entra ID 中注册新应用程序并创建机密
- 请进入门户中的 Microsoft Entra ID,记录租户 ID。
- 在左侧菜单中选择 “应用注册” ,然后选择“ 新建注册”。
- 输入 名称 ,然后 仅选择此组织目录中的帐户。
- 对于 应用程序类型,请选择 “Web”,输入
http://localhost
为登录 URL,然后选择“ 注册”。 - 在左侧菜单中选择 “证书和机密 ”,然后选择“ 新建客户端密码”。
- 输入说明并选择到期期限。
- 记下机密的值,它用作以下密码和机密 ID,它用作以下用户名。
- 选择“概述”并记下应用程序 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
- 对于群集中的每个 VM,请从侧菜单中选择 访问控制(IAM )。
- 选择 “添加角色分配 ”(使用经典体验)。
- 选择之前创建的角色。
- 在“选择”列表中,输入之前创建的应用程序的名称。
现在,可以使用以前的值和订阅 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:
导入公共存储库 GPG 密钥:
curl https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc
注册 Ubuntu 存储库:
sudo add-apt-repository "$(wget -qO- https://packages.microsoft.com/config/ubuntu/20.04/mssql-server-2022.list)"
运行以下命令以安装 SQL Server:
sudo apt-get update sudo apt-get install -y mssql-server
包安装完成后,运行
mssql-conf setup
,按照提示设置 SA 密码并选择版本。 提醒一下,以下版本可以自由许可:评估版、开发人员版和 Express 版。sudo /opt/mssql/bin/mssql-conf setup
完成配置后,验证服务是否正在运行:
systemctl status mssql-server --no-pager
安装 SQL Server 命令行工具
若要创建数据库,则需要使用可在 SQL Server 上运行 Transact-SQL 语句的工具进行连接。 以下步骤安装 SQL Server 命令行工具: sqlcmd 和 bcp。
通过以下步骤在 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。
进入超级用户模式
sudo su
导入公共存储库 GPG 密钥。
curl https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc
注册 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
退出超级用户模式。
exit
更新源列表,并使用 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
可选:在 bash shell 中向环境变量添加
/opt/mssql-tools18/bin/
。若要使 sqlcmd 和 bcp 能从登录会话的 bash shell 进行访问,请使用下列命令修改
PATH
文件中的~/.bash_profile
:echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bash_profile
若要使 sqlcmd 和 bcp 能从交互式/非登录会话的 bash shell 进行访问,请使用下列命令修改
PATH
文件中的~/.bashrc
: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 终结点。
使用 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
- 请将
使用 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
- 请将
运行 命令退出 sqlcmd 会话,并返回到 SSH 会话。
将证书复制到次要副本并在服务器上创建证书
将创建的两个文件复制到所有要托管可用性副本的服务器上的同一位置。
在主服务器上,运行以下
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>
- 将
在目标服务器上运行以下命令:
- 请将
<username>
替换为你的用户名。 -
mv
命令将文件或目录从一个位置移到另一个位置。 -
chown
命令用于更改文件、目录或链接的所有者和组。 - 针对所有次要副本运行这些命令。
sudo -i mv /home/<username>/dbm_certificate.* /var/opt/mssql/data/ cd /var/opt/mssql/data chown mssql:mssql dbm_certificate.*
- 请将
以下 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 名称。 - 请将
ubuntu1
、ubuntu2
和ubuntu3
值替换为托管副本的 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 登录名使用的凭据。
创建文件:
sudo vi /var/opt/mssql/secrets/passwd
将以下两行添加到文件中:
pacemakerLogin <password>
若要退出 vi 编辑器,请先按 Esc 键,然后输入命令
:wq
以写入文件并退出。使该文件只能由 root 用户读取:
sudo chown root:root /var/opt/mssql/secrets/passwd sudo chmod 400 /var/opt/mssql/secrets/passwd
将次要副本加入可用性组
在次要副本上,运行以下命令以将其加入 AG:
ALTER AVAILABILITY GROUP [ag1] JOIN WITH (CLUSTER_TYPE = EXTERNAL); GO ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE; GO
在主要副本和每个次要副本上运行以下 Transact-SQL 脚本:
GRANT ALTER, CONTROL, VIEW DEFINITION ON AVAILABILITY GROUP::ag1 TO pacemakerLogin; GO GRANT VIEW SERVER STATE TO pacemakerLogin; GO
加入次要副本后,在 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 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_desc
将 db1
的状态列为 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