12 QDevice 和 QNetd #
QDevice 和 QNetd 会参与仲裁决定。在仲裁方 corosync-qnetd
的协助下,corosync-qdevice
会提供一个可配置的投票数,以使群集可以承受大于标准仲裁规则所允许的节点故障数量。我们强烈建议为双节点群集部署 corosync-qnetd
和 corosync-qdevice
,但对于所含节点数为偶数的群集,一般也建议使用 QNetd 和 QDevice。
12.1 概念概述 #
与计算各群集节点的定额相比,搭配使用 QDevice 和 QNetd 的方法具有以下优点:
发生节点故障时,会提供更好的可持续性。
您可以编写自己的启发脚本来影响投票。这非常适合用于复杂设置(例如 SAP 应用程序)。
可让您配置 QNetd 服务器来为多个群集提供投票。
允许为双节点群集使用无磁盘 SBD。
可帮助节点数为偶数且处于节点分裂状况下的群集(特别是双节点群集)做出仲裁决定。
使用 QDevice/QNetd 的设置由以下组件和机制构成:
- QNetd (
corosync-qnetd
) 一个不属于群集的 systemd 服务(一个守护程序,即 “QNetd 服务器”)。向
corosync-qdevice
守护程序提供投票的 systemd 守护程序。要提高安全性,可以将
corosync-qnetd
与 TLS 搭配使用以进行客户端证书检查。- QDevice (
corosync-qdevice
) 每个群集节点上与 Corosync 一起运行的 systemd 服务(守护程序)。这是
corosync-qnetd
的客户端。其主要用途是让群集能够承受大于标准仲裁规则所允许的节点故障数量。QDevice 可以与不同的仲裁方配合工作,但目前仅支持与 QNetd 配合工作。
- 算法
QDevice 支持多种不同的算法,而这些算法决定着如何分配投票的行为。目前提供的算法如下:
FFSplit (“fifty-fifty split”) 为默认算法,用于所含节点数为偶数的群集。如果群集分裂为两个相似的部分,此算法会根据启发检查结果和其他因素为其中一个部分提供一个投票。
LMS (“last man standing”) 允许仅剩的那个节点看到 QNetd 服务器以获取投票。因此此算法适用于只有一个活动节点应保留法定票数的群集。
- 启发
QDevice 支持一组命令(“启发”)。这些命令在群集服务启动、群集成员资格发生变化、成功连接到
corosync-qnetd
时或(可选)定期在本地执行。可以使用 quorum.device.heuristics 键(在corosync.conf
文件中)或--qdevice-heuristics-mode
选项来设置启发。这两种方式都可理解off
(默认值)、sync
和on
值。sync
与on
之间的区别在于,您可以另外定期执行以上命令。仅当所有命令都成功执行时,才会视为已通过启发,否则视为启发失败。启发的结果会发送到
corosync-qnetd
,用于进行计算以确定哪个部分应具有法定票数。- 决胜方
此项用作群集的几个部分完全均衡且启发结果相同的情况下的后备措施。它可配置为最小、最大或特定的节点 ID。
12.2 要求和先决条件 #
设置 QDevice 和 QNetd 之前,您需要按如下所示准备环境:
除了群集节点外,您需准备一个单独的计算机,将其作为 QNetd 服务器。请参见第 12.3 节 “设置 QNetd 服务器”。
与 Corosync 所使用的物理网络不同的物理网络。建议 QDevice 使用该网络来连接 QNetd 服务器。理想情况下,QNetd 服务器应位于与主群集不同的机架中,或者至少位于一个单独的 PSU 上,且不要位于与 Corosync 环相同的网段中。
12.3 设置 QNetd 服务器 #
QNetd 服务器不是群集堆栈的一部分,也不是群集的实际成员。因此,您无法将资源转移到此服务器。
QNetd 服务器几乎“无状态”。一般情况下,您无需更改配置文件 /etc/sysconfig/corosync-qnetd
中的任何内容。默认情况下,corosync-qnetd 服务以 coroqnetd
组中的 coroqnetd
用户身份运行守护程序。这可避免以 root
身份运行守护程序。
要创建 QNetd 服务器,请执行以下步骤:
在将作为 QNetd 服务器的计算机上,安装 SUSE Linux Enterprise Server 15 SP4。
登录 QNetd 服务器并安装以下软件包:
root #
zypper
install corosync-qnetd您不需要手动启动
corosync-qnetd
服务。引导脚本会负责 qdevice 阶段中的启动流程。
QNetd 服务器现已准备好接受来自 QDevice 客户端 corosync-qdevice
的连接。无需进行其他配置。
12.4 将 QDevice 客户端连接到 QNetd 服务器 #
设置好 QNetd 服务器后,您便可以设置并运行客户端。您可以在安装群集期间将客户端连接到 QNetd 服务器,也可以稍后再添加。在下面的过程中,我们将使用后一种方法。我们假设群集包含两个节点(alice 和 bob)和 QNetd 服务器 (charlie)。
在所有节点上,请确保您已安装软件包 corosync-qdevice:
root #
zypper
install corosync-qdevice在 alice 上初始化群集:
root #
crm
cluster init -y在 bob 上加入群集:
root #
crm
cluster join -c alice -y在 alice 和 bob 上,引导
qdevice
阶段。在大多数情况下,默认设置都可正常工作。至少提供--qnetd-hostname
和 QNetd 服务器(在本例中为 charlie)的主机名或 IP 地址:root #
crm
cluster init qdevice --qnetd-hostname=charlie如果您要更改默认设置,请使用
crm cluster init qdevice --help
命令获取所有可能的选项列表。与 QDevice 相关的所有选项都以--qdevice-NAME
开头。
如果您使用的是默认设置,上面的命令会创建启用了 TLS 并使用 FFSplit 算法的 QDevice。
12.5 使用启发设置 QDevice #
如果您需要对确定投票的方式进行额外的控制,请使用启发。启发是一组可并行执行的命令。
为了此目的,crm cluster init qdevice
命令提供了 --qdevice-heuristics
选项。您可以使用绝对路径传递一个或多个命令(以分号分隔)。
例如,如果您自己的启发检查命令位于 /usr/sbin/my-script.sh
,则可以在其中一个群集节点上按如下方式运行该命令:
root #
crm
cluster init qdevice --qdevice-hostname=charlie \ --qdevice-heuristics=/usr/sbin/my-script.sh \ --qdevice-heuristics-mode=on
命令可以任何语言编写,例如 Shell、Python 或 Ruby 语言。如果命令成功执行,将返回 0
(零),否则会返回错误代码。
您也可以传递一组命令。仅当所有命令都成功完成(返回代码为 0)后,启发才会通过。
--qdevice-heuristics-mode=on
选项可让启发命令定期运行。
12.6 检查和显示仲裁状态 #
您可以查询某个群集节点上的仲裁状态,如例 12.1 “QDevice 的状态”中所示。该示例显示了 QDevice 节点的状态。
root #
corosync-quorumtool
1 Quorum information ------------------ Date: ... Quorum provider: corosync_votequorum Nodes: 2 2 Node ID: 3232235777 3 Ring ID: 3232235777/8 Quorate: Yes 4 Votequorum information ---------------------- Expected votes: 3 Highest expected: 3 Total votes: 3 Quorum: 2 Flags: Quorate Qdevice Membership information ---------------------- Nodeid Votes Qdevice Name 3232235777 1 A,V,NMW 192.168.1.1 (local) 5 3232235778 1 A,V,NMW 192.168.1.2 5 0 1 Qdevice
或者,您也可以使用 | |
我们预计的节点数量。在此示例中,这是一个双节点群集。 | |
由于 | |
仲裁状态。在此例中,群集具有仲裁。 | |
每个群集节点的状态的含意如下:
|
如果您查询 QNetd 服务器的状态,会获得类似例 12.2 “QNetd 服务器的状态”中所示的输出:
root #
corosync-qnetd-tool -lv
1 Cluster "hacluster": 2 Algorithm: Fifty-Fifty split 3 Tie-breaker: Node with lowest node ID Node ID 3232235777: 4 Client address: ::ffff:192.168.1.1:54732 HB interval: 8000ms Configured node list: 3232235777, 3232235778 Ring ID: aa10ab0.8 Membership node list: 3232235777, 3232235778 Heuristics: Undefined (membership: Undefined, regular: Undefined) TLS active: Yes (client certificate verified) Vote: ACK (ACK) Node ID 3232235778: Client address: ::ffff:192.168.1.2:43016 HB interval: 8000ms Configured node list: 3232235777, 3232235778 Ring ID: aa10ab0.8 Membership node list: 3232235777, 3232235778 Heuristics: Undefined (membership: Undefined, regular: Undefined) TLS active: Yes (client certificate verified) Vote: No change (ACK)
12.7 更多信息 #
有关 QDevice 和 QNetd 的其他信息,请参见 corosync-qdevice(8) 和 corosync-qnetd(8) 的手册页。