14 QDevice 和 QNetd #
QDevice 和 QNetd 会参与仲裁决定。在仲裁方 corosync-qnetd
的协助下,corosync-qdevice
会提供一个可配置的投票数,以使群集可以承受大于标准仲裁规则所允许的节点故障数量。我们建议您对节点数为偶数的群集(特别是双节点群集)部署 corosync-qnetd
和 corosync-qdevice
。
14.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。
14.2 要求和先决条件 #
设置 QDevice 和 QNetd 之前,您需要按如下所示准备环境:
除了群集节点外,您需准备一个单独的计算机,将其作为 QNetd 服务器。请参见第 14.3 节 “设置 QNetd 服务器”。
与 Corosync 所使用的物理网络不同的物理网络。建议 QDevice 使用该网络来连接 QNetd 服务器。理想情况下,QNetd 服务器应位于与主群集不同的机架中,或者至少位于一个单独的 PSU 上,且不要位于与 Corosync 环相同的网段中。
14.3 设置 QNetd 服务器 #
QNetd 服务器不是群集堆栈的一部分,也不是群集的实际成员。因此,您无法将资源转移到此服务器。
QNetd 服务器几乎“无状态”。一般情况下,您无需更改配置文件 /etc/sysconfig/corosync-qnetd
中的任何内容。默认情况下,corosync-qnetd 服务以 coroqnetd
组中的 coroqnetd
用户身份运行守护程序。这可避免以 root
身份运行守护程序。
要创建 QNetd 服务器,请执行以下步骤:
在将作为 QNetd 服务器的计算机上,安装 SUSE Linux Enterprise Server 15 SP6。
使用
SUSEConnect --list-extensions
中列出的命令启用 SUSE Linux Enterprise High Availability。安装 corosync-qnetd 软件包:
#
zypper install corosync-qnetd
您不需要手动启动
corosync-qnetd
服务。当您在群集上配置 QDevice 时,该服务会自动启动。
QNetd 服务器现已准备好接受来自 QDevice 客户端 corosync-qdevice
的连接。无需进行其他配置。
14.4 将 QDevice 客户端连接到 QNetd 服务器 #
设置好 QNetd 服务器后,您便可以设置并运行客户端。您可以在安装群集的过程中将客户端连接到 QNetd 服务器,也可以稍后再添加。此过程会讲解如何在稍后添加客户端。
在所有节点上安装 corosync-qdevice 软件包:
#
zypper install corosync-qdevice
在一个节点上运行以下命令配置 QDevice:
#
crm cluster init qdevice
Do you want to configure QDevice (y/n)?y
HOST or IP of the QNetd server to be used []QNETD_SERVER
TCP PORT of QNetd server [5403] QNetd decision ALGORITHM (ffsplit/lms) [ffsplit] QNetd TIE_BREAKER (lowest/highest/valid node id) [lowest] Whether using TLS on QDevice/QNetd (on/off/required) [on] Heuristics COMMAND to run with absolute path; For multiple commands, use ";" to separate []按
y
确认您要配置 QDevice,然后输入 QNetd 服务器的主机名或 IP 地址。对于其余字段,您可以接受默认值,也可以根据需要更改。重要:无磁盘 SBD 和 QDevice 的SBD_WATCHDOG_TIMEOUT
如果您将 QDevice 和无磁盘 SBD 搭配使用,
SBD_WATCHDOG_TIMEOUT
值必须大于 QDevice 的sync_timeout
值,否则 SBD 将会超时并无法启动。sync_timeout
的默认值为 30 秒。因此,请确保在/etc/sysconfig/sbd
中将SBD_WATCHDOG_TIMEOUT
设置为更大的值(例如35
)。
14.5 使用启发设置 QDevice #
如果您需要对确定投票的方式进行额外的控制,请使用启发。启发是一组可并行执行的命令。
为了此目的,crm cluster init qdevice
命令提供了 --qdevice-heuristics
选项。您可以使用绝对路径传递一个或多个命令(以分号分隔)。
例如,如果您自己的启发检查命令位于 /usr/sbin/my-script.sh
,则可以在其中一个群集节点上按如下方式运行该命令:
#
crm cluster init qdevice --qnetd-hostname=charlie \
--qdevice-heuristics=/usr/sbin/my-script.sh \
--qdevice-heuristics-mode=on
命令可以任何语言编写,例如 Shell、Python 或 Ruby 语言。如果命令成功执行,将返回 0
(零),否则会返回错误代码。
您也可以传递一组命令。仅当所有命令都成功完成(返回代码为 0)后,启发才会通过。
--qdevice-heuristics-mode=on
选项可让启发命令定期运行。
14.6 检查和显示仲裁状态 #
您可以查询某个群集节点上的仲裁状态,如例 14.1 “QDevice 的状态”中所示。该示例显示了 QDevice 节点的状态。
#
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 服务器的状态,会获得类似例 14.2 “QNetd 服务器的状态”中所示的输出:
#
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)
14.7 更多信息 #
有关 QDevice 和 QNetd 的其他信息,请参见 corosync-qdevice(8) 和 corosync-qnetd(8) 的手册页。