14 QDeviceおよびQNetd #
QDeviceおよびQNetdはクォーラムの決定に参加します。アービトレータcorosync-qnetd
からの支援により、corosync-qdevice
は設定可能な投票数を提供するため、クラスタは標準のクォーラムルールで許可されているよりも多くのノード障害に耐えることができます。ノード数が偶数であるクラスタ、特に2ノードクラスタについては、corosync-qnetd
およびcorosync-qdevice
の展開をお勧めします。
14.1 概念の概要 #
クラスタノード間のクォーラを計算するのと比較して、QDevice-and-QNetdアプローチには次の利点があります。
ノード障害が発生した場合の持続可能性が向上します。
投票に影響する独自のヒューリスティックススクリプトを作成できます。これは、SAPアプリケーションなどの複雑なセットアップに特に役立ちます。
複数のクラスタに投票を提供するようにQNetdサーバを設定できます。
2ノードクラスタでディスクレスSBDを使用できます。
スプリットブレイン状況下で偶数のノードを持つクラスタ、特に2ノードクラスタのクォーラムの決定に役立ちます。
QDevice/QNetdを含むセットアップは、次のコンポーネントおよびメカニズムから構成されます。
- QNetd (
corosync-qnetd
) クラスタの一部ではないsystemdサービス(デーモン、「QNetdサーバ」)。systemdサービスは、
corosync-qdevice
デーモンに投票を提供します。セキュリティを向上させるため、
corosync-qnetd
は、クライアント証明書の確認にTLSと連携することができます。- QDevice (
corosync-qdevice
) Corosyncとともに実行されている各クラスタノード上のsystemdサービス(デーモン)。これは
corosync-qnetd
のクライアントです。その主な用途は、クラスタが標準のクォーラムルールが許可するよりも多くのノード障害に耐えることができるようにすることです。QDeviceはさまざまなアービトレータと連携するように設計されています。ただし、現在では、QNetdのみがサポートされています。
- アルゴリズム
QDeviceは投票の割り当て方法の動作を決定する、さまざまなアルゴリズムをサポートしています。現在は、以下が存在します。
FFSplit (「fifty-fifty split」)がデフォルトです。これは、ノード数が偶数のクラスタに使用されます。クラスタが2つのよく似たパーティションに分割される場合、このアルゴリズムは、ヒューリスティックチェックおよびその他の要因の結果に基づいて、パーティションの1つに1票投票します。
LMS (「last man standing」)では、QNetdサーバを確認できる残っている唯一のノードに1票が与えられます。QNetdサーバを確認できる残っている唯一のノードである場合に、1票が返されます。したがって、このアルゴリズムは、アクティブな1つのノードのみを持つクラスタがクォーラムに達した状態を維持する必要がある場合に役立ちます。
- ヒューリスティックス
QDeviceは一連のコマンド(「heuristics」)をサポートしています。コマンドは、クラスタサービスの起動、クラスタメンバーシップの変更、
corosync-qnetd
への接続の成功時にローカルで実行されるか、オプションで定期的に実行されます。ヒューリスティックスは、quorum.device.heuristicsキー(corosync.conf
ファイル内)または--qdevice-heuristics-mode
オプションを使用して設定できます。どちらも設定可能な値は、off
(デフォルト)、sync
、およびon
です。sync
とon
の違いは、onでは定期的に上記のコマンドを追加で実行できる点です。すべてのコマンドが正常に実行された場合にのみ、ヒューリスティックスは合格したとみなされ、そうでない場合は、失敗したとみなされます。ヒューリスティックスの結果は、
corosync-qnetd
に送信され、そこでクォーラムに達するパーティションを決定するための計算に使用されます。- Tiebreaker
これは同じヒューリスティックスの結果の場合でも、クラスタパーティションが完全に等しい場合のフォールバックとして使用されます。最小、最大、または特定のノード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 []QDeviceを設定することを
y
で確定し、QNetdサーバのホスト名またはIPアドレスを入力します。残りのフィールドについては、デフォルト値を受け入れるか、必要に応じて変更できます。重要: ディスクレスSBDおよびQDeviceのSBD_WATCHDOG_TIMEOUT
ディスクレスSBDを含むQDeviceを使用する場合、
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
を提供します。絶対パスを使用して1つ以上のコマンド(セミコロンで区切る)を渡すことができます。
たとえば、ヒューリスティックチェック用の独自のコマンドが/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
同一の結果の代替として、 | |
予想されるノード数。この例では、2ノードクラスタです。 | |
| |
クォーラムステータス。この場合、クラスタにはクォーラムがあります。 | |
各クラスタノードのステータスは以下を意味します。
|
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)のマニュアルページを参照してください。