本文介绍如何使用 Pacemaker 在 Linux 上创建三节点群集,以及如何将先前创建的可用性组添加为群集中的资源。 若要实现高可用性,Linux 上的可用性组需要三个节点,请参阅可用性组配置的高可用性和数据保护。
SQL Server 与 Linux 上的 Pacemaker 没有像它与 Windows Server 故障转移群集 (WSFC) 那样紧密集成。 SQL Server 实例不知道群集,所有的业务流程都是从外向内的。 Pacemaker 提供群集资源业务流程。 此外,虚拟网络名称特定于 Windows Server 故障转移群集;Pacemaker 中没有等效项。 查询集群信息的可用性组动态管理视图 (DMV) 在 Pacemaker 集群上返回空行。 要在故障转移后创建透明重新连接的侦听器,请使用用于创建虚拟 IP 资源的 IP 在 DNS 中手动注册侦听器名称。
集群层基于在 Pacemaker 的基础上构建的 Red Hat Enterprise Linux (RHEL) HA 加载项。
注意
访问 Red Hat 完整文档需要有效订阅。
有关群集配置、资源代理选项和管理的详细信息,请访问 RHEL 参考文档。
路线图
在 Linux 服务器上创建可用性组以获得高可用性的步骤与 Windows Server 故障转移群集上的步骤不同。 下面的列表对高级步骤进行了说明:
在群集节点上配置 SQL Server。
创建可用性组。
配置 Pacemaker 等群集资源管理器。 本文中包含这些说明。
配置群集资源管理器的方式取决于特定的 Linux 分发版。
重要
生产环境需要隔离代理以实现高可用性。 本文档中的演示不使用隔离代理。 演示仅用于测试和验证目的。
Linux 群集使用隔离将群集返回到某个已知状态。 配置隔离的方式取决于分发版和环境。 目前,在某些云环境中无法使用隔离。 有关详细信息,请参阅 RHEL 高可用性群集的支持策略 - 虚拟化平台。
将可用性组添加为群集中的资源。
若要为 RHEL 配置高可用性,请启用高可用性订阅,然后配置 Pacemaker。
为 RHEL 启用高可用性订阅
群集中的每个节点都必须具有适当的 RHEL 订阅和高可用性添加项。 在如何在 Red Hat Enterprise Linux 中安装高可用性群集包中查看要求。 请按照以下步骤配置订阅和存储库:
注册系统。
sudo subscription-manager register
提供用户名和密码。
列出可用的注册池。
sudo subscription-manager list --available
从可用池列表中,请注意高可用性订阅的池 ID。
更新以下脚本。 使用池 ID 替换 <pool id>
以获得上一步中的高可用性。 运行脚本以附加订阅。
sudo subscription-manager attach --pool=<pool id>
启用存储库。
RHEL 7
sudo subscription-manager repos --enable=rhel-ha-for-rhel-7-server-rpms
RHEL 8
sudo subscription-manager repos --enable=rhel-8-for-x86_64-highavailability-rpms
有关详细信息,请参阅 Pacemaker - 开源、高可用性群集。
配置订阅后,请完成以下步骤以配置 Pacemaker:
注册订阅后,请完成以下步骤以配置 Pacemaker:
在所有群集节点上,打开 Pacemaker 防火墙端口。 若要使用 firewalld
打开这些端口,请运行以下命令:
sudo firewall-cmd --permanent --add-service=high-availability
sudo firewall-cmd --reload
如果防火墙没有内置高可用性配置,请打开 Pacemaker 的以下端口。
- TCP:端口 2224、3121、21064
- UDP:端口 5405
在所有节点上安装 Pacemaker 包。
sudo yum install pacemaker pcs fence-agents-all resource-agents
为安装 Pacemaker 和 Corosync 包时创建的默认用户设置密码。 在所有节点上使用相同的密码。
sudo passwd hacluster
若要在重启后允许节点重新加入群集,请启用并启动 pcsd
服务和 Pacemaker。 在所有节点上运行以下命令。
sudo systemctl enable pcsd
sudo systemctl start pcsd
sudo systemctl enable pacemaker
创建群集。 若要创建群集,请运行以下命令:
RHEL 7
sudo pcs cluster auth <node1> <node2> <node3> -u hacluster -p <password for hacluster>
sudo pcs cluster setup --name <clusterName> <node1> <node2> <node3>
sudo pcs cluster start --all
sudo pcs cluster enable --all
RHEL 8
对于 RHEL 8,需要单独对节点进行身份验证。 出现系统提示时,请手动输入 hacluster 的用户名和密码。
sudo pcs host auth <node1> <node2> <node3>
sudo pcs cluster setup <clusterName> <node1> <node2> <node3>
sudo pcs cluster start --all
sudo pcs cluster enable --all
备注
如果以前已在相同节点上配置了群集,则需要在运行 pcs cluster setup
时使用“--force
”选项。 此选项等同于运行 pcs cluster destroy
。 若要重新启用 Pacemaker,请运行 sudo systemctl enable pacemaker
。
为 SQL Server 安装 SQL Server 资源代理。 在所有节点上运行以下命令。
sudo yum install mssql-server-ha
配置 Pacemaker 后,请使用 pcs
与群集进行交互。 在群集中的一个节点上执行所有命令。
有关多个网络接口 (NIC) 的注意事项
使用具有多个 NIC 的服务器设置高可用性时,请遵循以下建议:
确保已设置 hosts
文件,这样多个 NIC 的服务器 IP 地址就能解析为每个节点上 Linux 服务器的主机名。
使用 Pacemaker 设置群集时,应使用服务器的主机名配置 Corosync 来设置所有 NIC 的配置。 我们只希望通过单个 NIC 进行 Pacemaker/Corosync 通信。 配置 Pacemaker 群集后,修改 corosync.conf
文件中的配置,并更新要用于 Pacemaker/Corosync 通信的专用 NIC 的 IP 地址。
corosync.conf
文件中给出的 <hostname>
应该与执行反向查找 (ping -a <ip_address>
) 时给出的输出相同,并且应该是主机上配置的短名称。 确保 hosts
文件同时表示名称解析的正确 IP 地址。
下面突出显示了对 corosync.conf
文件示例的更改:
nodelist {
node {
ring0_addr: <ip_address_of_node1_NIC1>
name: <hostname_of_node1>
nodeid: 1
}
node {
ring0_addr: <ip_address_of_node2_NIC1>
name: <hostname_of_node2>
nodeid: 2
}
node {
ring0_addr: <ip_address_of_node3_NIC1>
name: <hostname_of_node3>
nodeid: 3
}
}
Pacemaker 群集供应商需要隔离故障节点,并为受支持的群集安装程序配置隔离设备。 群集资源管理器无法确定节点的状态或节点上资源的状态时,隔离用于使群集再次处于已知状态。
隔离设备提供隔离代理。 有关如何在 Azure 中为此群集创建隔离设备的示例,请参阅在 Azure 中的 Red Hat Enterprise Linux 上设置 Pacemaker。 修改环境的说明。
资源级别隔离确保在因配置资源引起服务中断时,不会发生数据损坏。 例如,可以使用资源级别隔离在通信链接出现故障时将节点上的磁盘标记为过时。
节点级别隔离可确保节点不会运行任何资源。 这是通过重置节点来完成的。 Pacemaker 支持各种隔离设备。 示例包括不间断电源或服务器的管理接口卡。
有关如何隔离故障节点的信息,请参阅以下文章:
注意
由于节点级别隔离配置在很大程度上取决于你的环境,因此请在本教程中禁用它(稍后可以对其进行配置)。 以下脚本禁用节点级别隔离:
sudo pcs property set stonith-enabled=false
禁用隔离仅出于测试目的。 如果计划在生产环境中使用 Pacemaker,则应根据环境来计划隔离实现,并使其处于启用状态。
设置群集属性 cluster-recheck-interval
cluster-recheck-interval
表示群集检查资源参数、约束或其他群集选项中的更改的轮询间隔。 如果副本发生故障,群集将尝试按 failure-timeout
值和 cluster-recheck-interval
值所绑定的间隔重启副本。 例如,如果 failure-timeout
设置为 60 秒且 cluster-recheck-interval
设置为 120 秒,则会在 60 秒至 120 秒的间隔内尝试重启。 建议将 failure-timeout 设置为 60 秒,将 cluster-recheck-interval
设置为大于 60 秒的值。 不建议将 cluster-recheck-interval
设置为较小的值。
若要将属性值更新为 2 minutes
,请运行:
sudo pcs property set cluster-recheck-interval=2min
如果已拥有由 Pacemaker 群集管理的可用性组资源,则当 Pacemaker 包 1.1.18-11.el7 的值为 false
时,该包引入了 start-failure-is-fatal
群集设置的行为更改。 此更改会影响故障转移工作流。 如果主要副本发生中断,群集应故障转移到其中一个可用的次要副本。 然而,用户会注意到群集一直尝试启动发生故障的主要副本。 如果该主要副本由于永久性中断而永远不联机,群集就永远不会将故障转移到另一个可用的次要副本。 由于此更改,先前建议使用的用于设置 start-failure-is-fatal
的配置不再有效,并且必须将该设置还原为其默认值 true
。
此外,必须更新 AG 资源以包含 failure-timeout
属性。
若要将属性值更新为 true
,请运行:
sudo pcs property set start-failure-is-fatal=true
若要将 ag_cluster
资源属性 failure-timeout
更新为 60s
,请运行:
pcs resource update ag_cluster meta failure-timeout=60s
有关 Pacemaker 群集属性的信息,请参阅 Pacemaker 群集属性。
为 Pacemaker 创建 SQL Server 登录名
在所有 SQL Server 实例上,为 Pacemaker 创建服务器登录名。
以下 Transact-SQL 创建登录名:
USE [master]
GO
CREATE LOGIN [pacemakerLogin] with PASSWORD= N'ComplexP@$$w0rd!';
ALTER SERVER ROLE [sysadmin] ADD MEMBER [pacemakerLogin];
创建可用性组时,在创建该可用性组之后到向其中添加任何节点之前,pacemaker 用户需要对可用性组的 ALTER
、CONTROL
和 VIEW DEFINITION
权限。
在所有 SQL Server 实例上,保存 SQL Server 登录名的凭据。
echo 'pacemakerLogin' >> ~/pacemaker-passwd
echo 'ComplexP@$$w0rd!' >> ~/pacemaker-passwd
sudo mv ~/pacemaker-passwd /var/opt/mssql/secrets/passwd
sudo chown root:root /var/opt/mssql/secrets/passwd
sudo chmod 400 /var/opt/mssql/secrets/passwd # Only readable by root
创建可用性组资源
若要创建可用性组资源,请使用 pcs resource create
命令并设置资源属性。 以下命令将为可用性组创建一个名为 ag1
的 ocf:mssql:ag
master/subordinate 类型的资源。
RHEL 7
sudo pcs resource create ag_cluster ocf:mssql:ag ag_name=ag1 meta failure-timeout=60s master notify=true
RHEL 8
随着 RHEL 8 可用,create 语法已发生了更改。 如果使用的是 RHEL 8,术语 master
已更改为 promotable
。 使用以下 create 命令,而不是上面的命令:
sudo pcs resource create ag_cluster ocf:mssql:ag ag_name=ag1 meta failure-timeout=60s promotable notify=true
备注
创建资源并在之后定期更新,Pacemaker 资源代理会根据可用性组的配置自动设置可用性组上的 REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT
值。 例如,如果可用性组具有三个同步副本,则代理将 REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT
设置为 1
。 有关详细信息和其他配置选项,请参阅可用性组配置的高可用性和数据保护。
创建虚拟 IP 资源
若要创建虚拟 IP 地址资源,请在一个节点上运行以下命令。 使用网络中的可用静态 IP 地址。 将 <10.128.16.240>
之间的 IP 地址替换为一个有效的 IP 地址。
sudo pcs resource create virtualip ocf:heartbeat:IPaddr2 ip=<10.128.16.240>
Pacemaker 中不存在等效的虚拟服务器名称。 若要使用指向字符串服务器名称而不是 IP 地址的连接字符串,请在 DNS 中注册虚拟 IP 资源地址和所需的虚拟服务器名称。 对于 DR 配置,请在主站点和 DR 站点上使用 DNS 服务器注册所需的虚拟服务器名称和 IP 地址。
加主机托管约束
Pacemaker 群集中的几乎所有决策(例如,选择资源运行的位置)都通过比较分数来完成。 分数按资源计算。 群集资源管理器选择特定资源分数最高的节点。 如果节点的某一资源分数为负,则该资源无法在此节点上运行。
在 pacemaker 群集上,可以使用约束来控制群集的决定。 约束具有一个分数。 如果约束的分数低于 INFINITY
,则 Pacemaker 将其视为建议项。 INFINITY
的分数是必需项。
要确保主副本和虚拟 IP 资源在同一主机上运行,请定义分数为 INFINITY 的主机托管约束。 若要添加主机托管约束,请在一个节点上运行以下命令。
RHEL 7
在 RHEL 7 中创建 ag_cluster
资源时,它会将资源创建为 ag_cluster-master
。 对于 RHEL 7,请使用以下命令:
sudo pcs constraint colocation add virtualip ag_cluster-master INFINITY with-rsc-role=Master
RHEL 8
在 RHEL 8 中创建 ag_cluster
资源时,它会将资源创建为 ag_cluster-clone
。 对于 RHEL 8,请使用以下命令:
sudo pcs constraint colocation add virtualip with master ag_cluster-clone INFINITY with-rsc-role=Master
添加排序约束
主机托管约束具有隐式排序约束。 在移动可用性组资源前,它会移动虚拟 IP 资源。 默认情况下的事件序列为:
用户发出 pcs resource move
,将资源从节点 1 的可用性组主要副本移动到节点 2。
虚拟 IP 资源在节点 1 上停止。
虚拟 IP 资源在节点 2 上启动。
注意
此时,IP 地址暂时指向节点 2,同时节点 2 仍为故障转移前的次要副本。
节点 1 上的可用性组主要副本降级为次要副本。
节点 2 上的可用性组次要副本升级为主要副本。
若要防止 IP 地址暂时指向具有故障转移前的次要副本的节点,请添加排序约束。
若要添加排序约束,请在一个节点上运行以下命令:
RHEL 7
sudo pcs constraint order promote ag_cluster-master then start virtualip
RHEL 8
sudo pcs constraint order promote ag_cluster-clone then start virtualip
重要
配置群集并将可用性组添加为群集资源后,无法使用 Transact-SQL 对可用性组资源进行故障转移。 Linux 上的 SQL Server 群集资源与此操作系统的耦合性不及在 Windows Server 故障转移群集 (WSFC) 上的耦合性高。 SQL Server 服务无法识别此群集是否存在。 所有业务流程都通过群集管理工具完成。 在 RHEL 或 Ubuntu 中使用 pcs
,在 SLES 中使用 crm
工具。
使用 pcs
手动对可用性组进行故障转移。 请勿使用 Transact-SQL 启动故障转移。 有关说明,请参阅故障转移。
相关内容
此群集层基于在 Pacemaker 之上生成的 SUSE High Availability Extension (HAE)。
有关群集配置、资源代理选项、管理、最佳做法和建议的详细信息,请参阅 SUSE Linux Enterprise 高可用性扩展。
路线图
为实现高可用性而创建可用性组的过程因 Linux 服务器和 Windows Server 故障转移群集而异。 下面的列表对高级步骤进行了说明:
在群集节点上配置 SQL Server。
创建可用性组。
配置 Pacemaker 等群集资源管理器。 本文中包含这些说明。
配置群集资源管理器的方式取决于特定的 Linux 分发版。
将可用性组添加为群集中的资源
先决条件
要完成下面的端到端方案,需要三台计算机来部署三个节点群集。 下面的步骤概述了配置这些服务器的方法。
第一步是在群集节点上配置操作系统。 对于此演练,使用具有适用于 HA 加载项的有效订阅的 SLES 12 SP3。
在所有节点上安装和设置 SQL Server 服务。 有关详细说明,请参阅 Linux 上的 SQL Server 的安装指南。
将一个节点指定为主节点,将其他节点指定为辅助节点。 本指南中将使用这些术语。
确保将成为群集一部分的节点可互相通信。
下面的示例显示了 /etc/hosts
,以及名为 SLES1、SLES2 和 SLES3 的三个节点。
127.0.0.1 localhost
10.128.16.33 SLES1
10.128.16.77 SLES2
10.128.16.22 SLES3
所有群集节点都必须能够通过 SSH 相互访问。 hb_report
或 crm_report
(用于故障排除)和 Hawk 的历史记录浏览器等工具需要在节点之间进行无密码的 SSH 访问,否则它们只能收集当前节点的数据。 如果使用非标准 SSH 端口,请使用 -X 选项(请参阅 man
页)。 例如,如果 SSH 端口为 3479,请使用以下命令调用 crm_report
:
sudo crm_report -X "-p 3479" [...]
有关详细信息,请参阅 SLES 管理指南 - 杂项部分。
为 Pacemaker 创建 SQL Server 登录名
在所有 SQL Server 实例上,为 Pacemaker 创建服务器登录名。
以下 Transact-SQL 创建登录名:
USE [master]
GO
CREATE LOGIN [pacemakerLogin] with PASSWORD= N'ComplexP@$$w0rd!';
ALTER SERVER ROLE [sysadmin] ADD MEMBER [pacemakerLogin];
创建可用性组时,在创建该可用性组之后到向其中添加任何节点之前,pacemaker 用户需要对可用性组的 ALTER
、CONTROL
和 VIEW DEFINITION
权限。
在所有 SQL Server 实例上,保存 SQL Server 登录名的凭据。
echo 'pacemakerLogin' >> ~/pacemaker-passwd
echo 'ComplexP@$$w0rd!' >> ~/pacemaker-passwd
sudo mv ~/pacemaker-passwd /var/opt/mssql/secrets/passwd
sudo chown root:root /var/opt/mssql/secrets/passwd
sudo chmod 400 /var/opt/mssql/secrets/passwd # Only readable by root
在 Linux 服务器上配置可用性组,然后配置群集资源。 若要配置可用性组,请参阅在 Linux 上配置 SQL Server Always On 可用性组
安装 High Availability Extension
有关参考,请参阅安装 SUSE Linux Enterprise Server 和高可用性扩展。
在这两个节点上安装 SQL Server 资源代理包。
sudo zypper install mssql-server-ha
设置第一个节点
请参阅 SLES 安装说明。
以 root
用户身份登录到要将其用作群集节点的物理计算机或虚拟机。
执行如下命令,启动该启动脚本:
sudo ha-cluster-init
如果 NTP 尚未配置为在启动时启动,则会显示一条消息。
如果仍要继续,脚本会自动生成用于 SSH 访问和用于 Csync2 同步工具的密钥,然后启动这二者所需的服务。
配置群集通信层 (Corosync):
输入要绑定到的网络地址。 默认情况下,该脚本建议使用 eth0 网络地址。 或者,输入其他网络地址(例如,bond0 地址)。
输入一个多播地址。 该脚本建议使用可用作默认地址的随机地址。
输入一个多播端口。 该脚本建议将 5405 用作默认端口。
若要配置 SBD ()
,请为要用于 SBD 的块设备的分区输入一个持久路径。 该路径在群集中所有节点之间必须一致。
最后,该脚本将启动 Pacemaker 服务,从而使此单节点群集处于联机状态并启用 Web 管理接口 Hawk2。 要用于 Hawk2 的 URL 将显示在屏幕上。
有关安装过程的任何详细信息,请查看 /var/log/sleha-bootstrap.log
。 现在已有一个正在运行的单节点群集。 使用 crm status 检查群集状态:
sudo crm status
也可以通过 crm configure show xml
或 crm configure show
查看群集配置。
此启动过程创建一个名为 hacluster 的 Linux 用户,其密码为 linux。 请尽快使用安全密码替换此默认密码:
sudo passwd hacluster
将节点添加到现有群集
如果运行的群集包含一个或多个节点,可使用 ha-cluster-join 启动脚本添加更多群集节点。 该脚本只需要访问现有的群集节点,并且将自动完成当前计算机上的基本设置。 请使用以下步骤:
如果已使用 YaST
群集模块配置现有群集节点,在运行 ha-cluster-join
之前,请确保满足以下先决条件:
以 root
用户身份登录到要加入群集的物理计算机或虚拟机。
执行如下命令,启动该启动脚本:
sudo ha-cluster-join
如果 NTP 尚未配置为在启动时启动,则会显示一条消息。
如果仍要继续,系统将提示输入现有节点的 IP 地址。 输入 IP 地址。
如果尚未配置这两个计算机之间的无密码 SSH 访问,系统还将提示输入现有节点的根密码。
登录到指定节点后,该脚本将复制 Corosync 配置,配置 SSH 和 Csync2
,以及将当前联机的计算机作为新群集节点。 此外,该脚本还会启用 Hawk 所需的服务。 如果已配置 OCFS2
的共享存储,该脚本也自动为 OCFS2
文件系统创建装入点目录。
对要添加到群集中的所有计算机重复上述步骤。
有关该过程的详细信息,请查看 /var/log/ha-cluster-bootstrap.log
。
使用 sudo crm status
检查群集状态。 如果已成功添加第二个节点,输出内容大致如下所示:
sudo crm status
将会看到类似于以下示例的输出。
3 nodes configured
1 resource configured
Online: [ SLES1 SLES2 SLES3]
Full list of resources:
admin_addr (ocf::heartbeat:IPaddr2): Started node1
注意
admin_addr
是在最初单节点群集设置期间配置的虚拟 IP 群集资源。
添加所有节点后,检查是否需要调整全局群集选项中的 no-quorum-policy。 这对双节点群集尤为重要。
设置群集属性 cluster-recheck-interval
cluster-recheck-interval
表示群集检查资源参数、约束或其他群集选项中的更改的轮询间隔。 如果副本发生故障,群集将尝试按 failure-timeout
值和 cluster-recheck-interval
值所绑定的间隔重启副本。 例如,如果 failure-timeout
设置为 60 秒且 cluster-recheck-interval
设置为 120 秒,则会在 60 秒至 120 秒的间隔内尝试重启。 建议将 failure-timeout 设置为 60 秒,将 cluster-recheck-interval
设置为大于 60 秒的值。 不建议将 cluster-recheck-interval
设置为较小的值。
若要将属性值更新为 2 minutes
,请运行:
crm configure property cluster-recheck-interval=2min
如果已拥有由 Pacemaker 群集管理的可用性组资源,则当 Pacemaker 包 1.1.18-11.el7 的值为 false
时,该包引入了 start-failure-is-fatal
群集设置的行为更改。 此更改会影响故障转移工作流。 如果主要副本发生中断,群集应故障转移到其中一个可用的次要副本。 然而,用户会注意到群集一直尝试启动发生故障的主要副本。 如果该主要副本由于永久性中断而永远不联机,群集就永远不会将故障转移到另一个可用的次要副本。 由于此更改,先前建议使用的用于设置 start-failure-is-fatal
的配置不再有效,并且必须将该设置还原为其默认值 true
。
此外,必须更新 AG 资源以包含 failure-timeout
属性。
若要将属性值更新为 true
,请运行:
crm configure property start-failure-is-fatal=true
若要将现有 AG 资源属性 failure-timeout
更新为 60s
,请运行以下命令(将 ag1
替换为你的可用性组资源的名称):
crm configure edit ag1
在文本编辑器中,在任何 param
之后和任何 op
之前添加 meta failure-timeout=60s
。
有关 Pacemaker 群集属性的详细信息,请参阅配置群集资源。
有关多个网络接口 (NIC) 的注意事项
使用具有多个 NIC 的服务器设置高可用性时,请遵循以下建议:
确保已设置 hosts
文件,这样多个 NIC 的服务器 IP 地址就能解析为每个节点上 Linux 服务器的主机名。
使用 Pacemaker 设置群集时,应使用服务器的主机名配置 Corosync 来设置所有 NIC 的配置。 我们只希望通过单个 NIC 进行 Pacemaker/Corosync 通信。 配置 Pacemaker 群集后,修改 corosync.conf
文件中的配置,并更新要用于 Pacemaker/Corosync 通信的专用 NIC 的 IP 地址。
corosync.conf
文件中给出的 <hostname>
应该与执行反向查找 (ping -a <ip_address>
) 时给出的输出相同,并且应该是主机上配置的短名称。 确保 hosts
文件同时表示名称解析的正确 IP 地址。
下面突出显示了对 corosync.conf
文件示例的更改:
nodelist {
node {
ring0_addr: <ip_address_of_node1_NIC1>
name: <hostname_of_node1>
nodeid: 1
}
node {
ring0_addr: <ip_address_of_node2_NIC1>
name: <hostname_of_node2>
nodeid: 2
}
node {
ring0_addr: <ip_address_of_node3_NIC1>
name: <hostname_of_node3>
nodeid: 3
}
}
Pacemaker 群集供应商需要隔离故障节点,并为受支持的群集安装程序配置隔离设备。 群集资源管理器无法确定节点的状态或节点上资源的状态时,隔离用于使群集再次处于已知状态。
资源级别隔离主要通过配置资源来确保在中断期间不会发生数据损坏。 例如,可将资源级别隔离用于 DRBD(分布式复制块设备),从而在通信链接出现故障时将节点上的磁盘标记为过时。
节点级别隔离可确保节点不会运行任何资源。 重置节点可实现此目的,Pacemaker 实现被称为 STONITH。 Pacemaker 支持多种隔离设备,例如不间断电源或服务器的管理接口卡。
有关详细信息,请参阅:
在群集初始化时,如果未检测到任何配置,则禁用隔离。 以后可通过运行以下命令将其启用:
sudo crm configure property stonith-enabled=true
重要
禁用隔离仅出于测试目的。 如果计划在生产环境中使用 Pacemaker,则应根据环境来计划隔离实现,并使其处于启用状态。 SUSE 不为任何云环境(包括 Azure)或 Hyper-V 提供隔离代理。 因此,群集供应商不提供在这些环境中运行生产群集相关的支持。 我们正在研究解决方案以弥补该漏洞,并在将来版本中推出。
请参阅 SLES 管理指南。
启用 Pacemaker
启用 Pacemaker 以使其自动启动。
请在群集中的每个节点上运行以下命令。
systemctl enable pacemaker
创建可用性组资源
以下命令为可用性组 [ag1] 的三个副本创建并配置可用性组资源。 监视操作和超时必须在 SLES 中显式指定,这是因为超时与工作负荷高度相关,因此必须针对每个部署进行仔细调整。
在群集中的某个节点上运行命令:
请运行 crm configure
以打开 crm 提示符:
sudo crm configure
在 crm 提示符中,运行以下命令以配置资源属性。
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
备注
创建资源并在之后定期更新,Pacemaker 资源代理会根据可用性组的配置自动设置可用性组上的 REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT
值。 例如,如果可用性组具有三个同步副本,则代理将 REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT
设置为 1
。 有关详细信息和其他配置选项,请参阅可用性组配置的高可用性和数据保护。
创建虚拟 IP 资源
如果在运行 ha-cluster-init
时未创建虚拟 IP 资源,则可以现在创建此资源。 以下命令创建一个虚拟 IP 资源。 使用自己的网络中的可用地址替换 <**0.0.0.0**>
,使用 CIDR 子网掩码中的位数替换 <**24**>
。 在一个节点上运行。
crm configure \
primitive admin_addr \
ocf:heartbeat:IPaddr2 \
params ip=<**0.0.0.0**> \
cidr_netmask=<**24**>
加主机托管约束
Pacemaker 群集中的几乎所有决策(例如,选择资源运行的位置)都通过比较分数来完成。 分数按资源计算,群集资源管理器选择特定资源分数最高的节点。 (如果节点的某一资源分数为负,则该资源无法在此节点上运行。)我们可以使用约束来控制群集的决策。 约束具有一个分数。 如果约束的分数低于 INFINITY,则它仅作为建议项。 分数为 INFINITY 则表明它是必需项。 我们需要确保可用性组主要副本和虚拟 IP 资源在同一主机上运行,因此我们定义一个分数为 INFINITY 的主机托管约束。
要将虚拟 IP 的主机托管约束设置为在与主节点相同的节点上运行,请在一个节点上运行以下命令:
crm configure
colocation vip_on_master inf: \
admin_addr ms-ag_cluster:Master
commit
添加排序约束
主机托管约束具有隐式排序约束。 在移动可用性组资源前,它会移动虚拟 IP 资源。 默认情况下的事件序列为:
- 用户发出
resource migrate
,将资源从节点 1 的可用性组主要副本移动到节点 2。
- 虚拟 IP 资源在节点 1 上停止。
- 虚拟 IP 资源在节点 2 上启动。 此时,IP 地址暂时指向节点 2,同时节点 2 仍为故障转移前的次要副本。
- 节点 1 上的可用性组主要副本降级。
- 节点 2 上的可用性组升级为主要副本。
若要防止 IP 地址暂时指向具有故障转移前的次要副本的节点,请添加排序约束。
若要添加排序约束,请在一个节点上运行以下命令:
sudo crm configure \
order ag_first inf: ms-ag_cluster:promote admin_addr:start
重要
配置群集并将可用性组添加为群集资源后,无法使用 Transact-SQL 对可用性组资源进行故障转移。 Linux 上的 SQL Server 群集资源与此操作系统的耦合性不及在 Windows Server 故障转移群集 (WSFC) 上的耦合性高。 SQL Server 服务无法识别此群集是否存在。 所有业务流程都通过群集管理工具完成。 在 SLES 中使用 crm
。
使用 crm
手动对可用性组进行故障转移。 请勿使用 Transact-SQL 启动故障转移。 有关详细信息,请参阅故障转移。
有关详细信息,请参阅:
相关内容
路线图
在 Linux 服务器上创建可用性组以获得高可用性的步骤与 Windows Server 故障转移群集上的步骤不同。 下面的列表对高级步骤进行了说明:
Linux 上的 SQL Server 的安装指南。
配置 SQL Server Always On 可用性组以在 Linux 上实现高可用性。
配置 Pacemaker 等群集资源管理器。 本文中包含这些说明。
配置群集资源管理器的方式取决于特定的 Linux 分发版。
重要
生产环境需要隔离代理以实现高可用性。 本文中的示例不使用隔离代理。 它们仅用于测试和验证目的。
Linux 群集使用隔离将群集返回到某个已知状态。 配置隔离的方式取决于分发版和环境。 目前,在某些云环境中无法使用隔离。
通常在操作系统上实现隔离,并取决于环境。 在操作系统分销商文档中查找有关隔离的说明。
将可用性组添加为群集中的资源。
在所有节点上,打开防火墙端口。 对 Pacemaker 高可用性服务、SQL Server 实例和可用性组终结点打开此端口。 运行 SQL Server 的服务器的默认 TCP 端口是 1433
。
sudo ufw allow 2224/tcp
sudo ufw allow 3121/tcp
sudo ufw allow 21064/tcp
sudo ufw allow 5405/udp
sudo ufw allow 1433/tcp # Replace with TDS endpoint
sudo ufw allow 5022/tcp # Replace with DATA_MIRRORING endpoint
sudo ufw reload
或者,可以禁用防火墙,但在生产环境中不建议这样做:
sudo ufw disable
安装 Pacemaker 包。 在所有节点上,针对 Ubuntu 20.04 运行以下命令。 有关在早期版本上进行安装的详细信息,请参阅 Azure 上的 Ubuntu HA - MS SQL Server。
sudo apt-get install -y pacemaker pacemaker-cli-utils crmsh resource-agents fence-agents corosync python3-azure
为安装 Pacemaker 和 Corosync 包时创建的默认用户设置密码。 在所有节点上使用相同的密码。
sudo passwd hacluster
创建群集
在创建群集之前,必须在主服务器上创建身份验证密钥,并将其复制到参与 AG 的其他服务器。
使用以下脚本在主服务器上创建身份验证密钥:
sudo corosync-keygen
可以使用 scp
将生成的密钥复制到其他服务器:
sudo scp /etc/corosync/authkey dbadmin@server-02:/etc/corosync
sudo scp /etc/corosync/authkey dbadmin@server-03:/etc/corosync
若要创建群集,请在主服务器上编辑 /etc/corosync/corosync.conf
文件:
sudo vim /etc/corosync/corosync.conf
corosync.conf
文件应类似于以下示例:
totem {
version: 2
cluster_name: agclustername
transport: udpu
crypto_cipher: none
crypto_hash: none
}
logging {
fileline: off
to_stderr: yes
to_logfile: yes
logfile: /var/log/corosync/corosync.log
to_syslog: yes
debug: off
logger_subsys {
subsys: QUORUM
debug: off
}
}
quorum {
provider: corosync_votequorum
}
nodelist {
node {
name: server-01
nodeid: 1
ring0_addr: 10.0.0.4
}
node {
name: server-02
nodeid: 2
ring0_addr: 10.0.0.5
}
node {
name: server-03
nodeid: 3
ring0_addr: 10.0.0.6
}
}
替换其他节点上的 corosync.conf
文件:
sudo scp /etc/corosync/corosync.conf dbadmin@server-02:/etc/corosync
sudo scp /etc/corosync/corosync.conf dbadmin@server-03:/etc/corosync
重启 pacemaker
和 corosync
服务:
sudo systemctl restart pacemaker corosync
确认群集的状态并验证配置:
sudo crm status
有关多个网络接口 (NIC) 的注意事项
使用具有多个 NIC 的服务器设置高可用性时,请遵循以下建议:
确保已设置 hosts
文件,这样多个 NIC 的服务器 IP 地址就能解析为每个节点上 Linux 服务器的主机名。
使用 Pacemaker 设置群集时,应使用服务器的主机名配置 Corosync 来设置所有 NIC 的配置。 我们只希望通过单个 NIC 进行 Pacemaker/Corosync 通信。 配置 Pacemaker 群集后,修改 corosync.conf
文件中的配置,并更新要用于 Pacemaker/Corosync 通信的专用 NIC 的 IP 地址。
corosync.conf
文件中给出的 <hostname>
应该与执行反向查找 (ping -a <ip_address>
) 时给出的输出相同,并且应该是主机上配置的短名称。 确保 hosts
文件同时表示名称解析的正确 IP 地址。
下面突出显示了对 corosync.conf
文件示例的更改:
nodelist {
node {
ring0_addr: <ip_address_of_node1_NIC1>
name: <hostname_of_node1>
nodeid: 1
}
node {
ring0_addr: <ip_address_of_node2_NIC1>
name: <hostname_of_node2>
nodeid: 2
}
node {
ring0_addr: <ip_address_of_node3_NIC1>
name: <hostname_of_node3>
nodeid: 3
}
}
Pacemaker 群集供应商需要隔离故障节点,并为受支持的群集安装程序配置隔离设备。 群集资源管理器无法确定节点的状态或节点上资源的状态时,隔离用于使群集再次处于已知状态。
资源级别隔离可确保发生中断时,不会发生任何数据损坏。 例如,可将资源级别隔离用于 DRBD(分布式复制块设备),从而在通信链接出现故障时将节点上的磁盘标记为过时。
节点级别隔离可确保节点不会运行任何资源。 重置节点可实现此目的,Pacemaker 实现被称为 STONITH。 Pacemaker 支持多种隔离设备,例如,不间断电源或服务器的管理接口卡。
有关详细信息,请参阅从头构建 Pacemaker 群集和隔离和 Stonith。
由于节点级别隔离配置在很大程度上取决于你的环境,因此我们在本教程中禁用它(稍后可以对其进行配置)。 在主要节点上运行以下脚本:
sudo crm configure property stonith-enabled=false
在本例中,禁用隔离仅出于测试目的。 如果计划在生产环境中使用 Pacemaker,则应根据环境来计划隔离实现,并使其处于启用状态。 有关针对任何特定分发隔离代理的详细信息,请与操作系统供应商联系。
设置群集属性 cluster-recheck-interval
cluster-recheck-interval
属性表示群集检查资源参数、约束或其他群集选项中的更改的轮询间隔。 如果副本发生故障,群集将尝试按 failure-timeout
值和 cluster-recheck-interval
值所绑定的间隔重启副本。 例如,如果 failure-timeout
设置为 60 秒且 cluster-recheck-interval
设置为 120 秒,则会在 60 秒至 120 秒的间隔内尝试重启。 应将 failure-timeout
设置为 60 秒,并将 cluster-recheck-interval
设置为一个大于 60 秒的值。 不建议将 cluster-recheck-interval
设置为较小的值。
若要将属性值更新为 2 minutes
,请运行:
sudo crm configure property cluster-recheck-interval=2min
如果已拥有由 Pacemaker 群集管理的可用性组资源,则当 Pacemaker 包 1.1.18-11.el7 的值为 false
时,该包引入了 start-failure-is-fatal
群集设置的行为更改。 此更改会影响故障转移工作流。 如果主要副本发生中断,群集应故障转移到其中一个可用的次要副本。 然而,用户会注意到群集一直尝试启动发生故障的主要副本。 如果该主要副本由于永久性中断而永远不联机,群集就永远不会将故障转移到另一个可用的次要副本。 由于此更改,先前建议使用的用于设置 start-failure-is-fatal
的配置不再有效,并且必须将该设置还原为其默认值 true
。
此外,必须更新 AG 资源以包含 failure-timeout
属性。
若要将属性值更新为 true
,请运行:
sudo crm configure property start-failure-is-fatal=true
若要将现有 AG 资源属性 failure-timeout
更新为 60s
,请运行以下命令(将 ag1
替换为你的可用性组资源的名称):
sudo crm configure meta failure-timeout=60s
安装 SQL Server 资源代理以与 Pacemaker 集成
在所有节点上运行以下命令。
sudo apt-get install mssql-server-ha
为 Pacemaker 创建 SQL Server 登录名
在所有 SQL Server 实例上,为 Pacemaker 创建服务器登录名。
以下 Transact-SQL 创建登录名:
USE [master]
GO
CREATE LOGIN [pacemakerLogin] with PASSWORD= N'ComplexP@$$w0rd!';
ALTER SERVER ROLE [sysadmin] ADD MEMBER [pacemakerLogin];
创建可用性组时,在创建该可用性组之后到向其中添加任何节点之前,pacemaker 用户需要对可用性组的 ALTER
、CONTROL
和 VIEW DEFINITION
权限。
在所有 SQL Server 实例上,保存 SQL Server 登录名的凭据。
echo 'pacemakerLogin' >> ~/pacemaker-passwd
echo 'ComplexP@$$w0rd!' >> ~/pacemaker-passwd
sudo mv ~/pacemaker-passwd /var/opt/mssql/secrets/passwd
sudo chown root:root /var/opt/mssql/secrets/passwd
sudo chmod 400 /var/opt/mssql/secrets/passwd # Only readable by root
创建可用性组资源
若要创建可用性组资源,请使用 sudo crm configure
命令设置资源属性。 以下示例将为可用性组创建一个名为 ag1
的主要/副本类型的资源 ocf:mssql:ag
。
~$ 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
注意
创建资源并在之后定期更新,Pacemaker 资源代理会根据可用性组的配置自动设置可用性组上的 REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT
值。 例如,如果可用性组具有三个同步副本,则代理将 REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT
设置为 1
。 有关详细信息和其他配置选项,请参阅可用性组配置的高可用性和数据保护。
创建虚拟 IP 资源
若要创建虚拟 IP 地址资源,请在一个节点上运行以下命令。 使用网络中的可用静态 IP 地址。 运行此脚本前,请使用有效的 IP 地址替换 < ... >
之内的值。
sudo crm configure primitive virtualip \
ocf:heartbeat:IPaddr2 \
params ip=10.128.16.240
Pacemaker 中不存在等效的虚拟服务器名称。 若要使用指向字符串服务器名称的连接字符串,而不是使用 IP 地址,请在 DNS 中注册 IP 资源地址和所需的虚拟服务器名称。 对于 DR 配置,请在主站点和 DR 站点上使用 DNS 服务器注册所需的虚拟服务器名称和 IP 地址。
加主机托管约束
Pacemaker 群集中的几乎所有决策(例如,选择资源运行的位置)都通过比较分数来完成。 分数按资源计算,群集资源管理器选择特定资源分数最高的节点。 (如果节点的某一资源分数为负,则该资源无法在此节点上运行。)
使用约束来配置群集的决策。 约束具有一个分数。 如果约束的分数低于 INFINITY,则它仅作为建议项。 分数为 INFINITY 则表明它是必需项。
若要确保主要副本和虚拟 IP 资源位于同一主机上,请定义一个分数为 INFINITY 的主机托管约束。 若要添加主机托管约束,请在一个节点上运行以下命令。
sudo crm configure colocation ag-with-listener INFINITY: virtualip-group ms-ag1:Master
添加排序约束
主机托管约束具有隐式排序约束。 在移动可用性组资源前,它会移动虚拟 IP 资源。 默认情况下的事件序列为:
用户发出 pcs resource move
,将资源从 node1
的可用性组主要副本移动到 node2
。
虚拟 IP 资源在 node1
上停止。
虚拟 IP 资源在 node2
上启动。
此时,IP 地址暂时指向 node2
,同时 node2
仍为故障转移前的次要副本。
node1
上的可用性组主要副本降级为次要副本。
node2
上的可用性组次要副本提升为主要副本。
若要防止 IP 地址暂时指向具有故障转移前的次要副本的节点,请添加排序约束。
若要添加排序约束,请在一个节点上运行以下命令:
sudo crm configure order ag-before-listener Mandatory: ms-ag1:promote virtualip-group:start
配置群集并将可用性组添加为群集资源后,无法使用 Transact-SQL 对可用性组资源进行故障转移。 Linux 上的 SQL Server 群集资源与此操作系统的耦合性不及在 Windows Server 故障转移群集 (WSFC) 上的耦合性高。 SQL Server 服务无法识别此群集是否存在。 所有业务流程都通过群集管理工具完成。
相关内容