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 SP5。
使用
SUSEConnect --list-extensions
中列出的指令啟用 SUSE Linux Enterprise High Availability Extension。安裝 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) 的手冊頁。