Watchdogのサポート¶
複数のPostgreSQLサーバーをプライマリとして実行すると、タイムラインの相違によりトランザクションが失われる可能性があります。この状況はスプリットブレイン問題とも呼ばれます。スプリットブレインを回避するために、Patroniは、DCSでリーダーキーの有効期限が切れた後、PostgreSQLがトランザクションコミットを受け付けないようにする必要があります。通常の状況では、何らかの理由でリーダーロックの更新が失敗した場合、PatroniはPostgreSQLを停止することでこれを達成しようとします。ただし、次のようなさまざまな理由により、これが実行されない場合があります。
Patroniは、バグ、メモリ不足、またはシステム管理者による誤った強制終了によりクラッシュしました。
PostgreSQLのシャットダウンが遅すぎます。
システムの高負荷、ハイパーバイザーによるVMの一時停止、またはその他のインフラストラクチャの問題により、Patroniが実行できません。
このような状況下で正しい動作を保証するために、PatroniはWatchdogデバイスをサポートしています。Watchdogデバイスは、指定された時間枠内にキープアライブハートビートを取得できない場合にシステム全体をリセットするソフトウェアまたはハードウェアメカニズムです。これにより、通常のPatroniスプリットブレイン保護メカニズムが失敗した場合に備えて、フェイルセーフの層が追加されます。
Patroniは、PostgreSQLをプライマリに昇格する前に、Watchdogをアクティブ化しようとします。Watchdogのアクティブ化が失敗し、Watchdogモードが required の場合、ノードはリーダーになることを拒否します。リーダー選挙に参加することを決定するとき、PatroniはWatchdog構成によってリーダーになれるかどうかも確認します。PostgreSQLを降格した後(手動フェイルオーバーなどにより)、PatroniはWatchdogを再び無効にします。Patroniが一時停止状態にある間は、Watchdogも無効になります。
デフォルトでは、PatroniはTTLが期限切れになる5秒前にWatchdogが期限切れになるように設定します。 loop_wait=10 および ttl=30 のデフォルト設定では、システムが強制的にリセットされるまでにHAループが完了するまでに少なくとも15秒かかります( ttl - safety_margin - loop_wait )。デフォルトでは、DCSへのアクセスは10秒後にタイムアウトするように設定されています。これは、ネットワークの問題などによりDCSが利用できない場合、PatroniとPostgreSQLがすべてのクライアント接続が終了する状態になるまでに少なくとも5秒( ttl - safety_margin - loop_wait - retry_timeout )かかることを意味します。
安全マージンは、リーダーキーの更新とWatchdogキープアライブの間の時間としてPatroniが予約する時間です。Patroniは、リーダーキーの更新を確認した後、すぐにキープアライブの送信を試みます。Patroniプロセスがまさに適切な瞬間に長時間中断された場合、Watchdogがトリガーされずにキープアライブが安全マージンを超えて遅延する可能性があります。その結果、リーダーキーの有効期限が切れる前にWatchdogがトリガーされない時間が発生し、保証が無効になります。あらゆる状況でWatchdogが確実にトリガーされるようにするには、 safety_margin を-1に設定してWatchdogのタイムアウトを ttl // 2 に設定し、TTLの半分後にWatchdogが期限切れになるように設定します。この保証が必要な場合は、おそらく ttl を増やすか、 loop_wait と retry_timeout を減らす必要があります。
現在、WatchdogはLinuxWatchdogデバイスインターフェイスを使用した場合のみサポートされています。
LinuxでのソフトウェアWatchdogのセットアップ¶
Patroniにアクセスできる場合、デフォルトのPatroni設定はLinux上で /dev/watchdog を使用しようとします。ほとんどのユースケースでは、Linuxカーネルに組み込まれているソフトウェアWatchdogを使用するだけで十分に安全です。
ソフトウェアWatchdogを有効にするには、Patroniを起動する前にrootとして次のコマンドを発行します。
modprobe softdog
# Replace postgres with the user you will be running patroni under
chown postgres /dev/watchdog
テストの場合は、modprobeコマンドラインに soft_noboot=1 を追加して再起動を無効にすると役立つ場合があります。この場合、Watchdogはカーネルリングバッファに行を記録するだけで、`dmesg`経由で表示されます。
Patroniは、Watchdogが正常に有効になると、Watchdogに関する情報をログに記録します。