JDBC マスター/スレーブとして構成された ActiveMQ システムの耐障害性をテストしています。この設定では、1 つの postgres データベースと 2 つのブローカーがあります。1 つはマスター ブローカー、もう 1 つはスレーブ ブローカーです。このメカニズムが機能する方法は、マスターがデータベース内のテーブルで排他ロックを取得することです。スレーブもこれを試み、ロックが使用可能になるまで待機します。マスターが停止した場合、ロックは解放され、スレーブが引き継ぎます。ただし、マスターがデータベースとのネットワーク接続を失うと、ロックが解放されず、デッドロック シナリオが発生します。ここで必要と思われるのは、指定された期間内に更新されない場合、Postgres に自動的にロックを解放するように指示する方法です。デザインパターンの POSA 3 ブックでは、これをリースパターンと呼んでいます。Postgresにこれをさせることは可能ですか? そうでない場合は、
1 に答える
これはデッドロックではなく、接続が失われた問題です。
デッドロックは、2 つのトランザクションが以前に相互にロックしていたリソースをロックしようとすると発生します。PostgreSQL
これらの状況を検出します。
あなたの場合、master
リソースをロックし、slave
待機しmaster
、master
接続が失われたために受信しないユーザー入力を待機します。
接続の切断が検出されるたびPostgreSQL
に、トランザクションが自動的にロールバックされます。
接続損失の検出を制御するには、次のPostgreSQL
接続オプションを使用できます。
tcp_keepalives_idle (integer)
TCP_KEEPIDLE
ソケット オプションをサポートするシステムで、アイドル状態の接続でキープアライブを送信する間隔を秒数で指定します。ゼロの値は、システムのデフォルトを使用します。がサポートされていない場合TCP_KEEPIDLE
、このパラメータはゼロにする必要があります。このパラメータは、Unix ドメイン ソケットを介して確立された接続では無視されます。
tcp_keepalives_interval (integer)
ソケット オプションをサポートするシステムで、
TCP_KEEPINTVL
再送信する前にキープアライブへの応答を待機する時間を秒単位で指定します。ゼロの値は、システムのデフォルトを使用します。がサポートされていない場合TCP_KEEPINTVL
、このパラメータはゼロにする必要があります。このパラメータは、Unix ドメイン ソケットを介して確立された接続では無視されます。
tcp_keepalives_count (integer)
ソケット オプションをサポートするシステムで
TCP_KEEPCNT
、接続が切断されたと見なされる前に失われるキープアライブの数を指定します。ゼロの値は、システムのデフォルトを使用します。がサポートされていない場合TCP_KEEPCNT
、このパラメータはゼロにする必要があります。このパラメータは、Unix ドメイン ソケットを介して確立された接続では無視されます。