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) 的 man 頁面。