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