ウォッチドッグのサポート¶
複数のPostgreSQLサーバーをプライマリとして実行すると、タイムラインがずれるため、トランザクションが失われる可能性があります。この状況は、スプリットブレイン問題とも呼ばれます。スプリットブレインを避けるために、Patroniは、DCSでリーダーキーが期限切れになった後、PostgreSQLがトランザクションコミットを受け入れないことを保証する必要があります。通常の状況下では、Patroniは、リーダーロックの更新が何らかの理由で失敗したときにPostgreSQLを停止することにより、これを達成しようとします。ただし、これはさまざまな理由により失敗する場合があります。
Patroniは、バグ、メモリ不足、またはシステム管理者によって誤って強制終了されたためにクラッシュしました。
PostgreSQLのシャットダウンは遅すぎます。
システムの負荷が高い、ハイパーバイザーによってVMが一時停止されている、またはその他のインフラストラクチャの問題が原因で、Patroniを実行できません。
これらの条件下での正しい動作を保証するために、Patroniはウォッチドッグデバイスをサポートしています。ウォッチドッグデバイスは、指定された時間枠内にキープアライブハートビートを取得できない場合にシステム全体をリセットするソフトウェアまたはハードウェアメカニズムです。これにより、通常のPatroniスプリットブレイン保護メカニズムが失敗した場合のフェイルセーフの追加レイヤーが追加されます。
Patroniは、PostgreSQLをプライマリに昇格する前にウォッチドッグをアクティブ化しようとします。ウォッチドッグのアクティブ化が失敗し、ウォッチドッグモードが required の場合、ノードはリーダーになることを拒否します。リーダー選挙への参加を決定するとき、Patroniは、ウォッチドッグ構成によりリーダーになることを許可することも確認します。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は、ウォッチドッグが正常に有効にされると、ウォッチドッグに関する情報をログに記録します。