1

ステージング (2 台のサーバー) または実稼働 (4 台のサーバー) サーバーで約 15 分間アクティビティがない場合、エアブレーキで次のエラーが発生します。エラーメッセージは次のとおりです。

ActiveRecord::StatementInvalid: PG::Error: サーバーからデータを受信できませんでした: 接続がタイムアウトしました

また

PG::エラー: サーバーに接続できませんでした: 接続がタイムアウトしました サーバーはホスト "tci-db4.dev.prod" で実行されており、ポート 5432 で TCP/IP 接続を受け入れていますか?

データベースとして PostgreSQL を使用しています。サーバーの 1 つは db サーバーとしても機能します。

環境:

Ruby 1.9.3 (これは Ruby 1.8.7 でも発生しましたが、サーバー上の ruby​​ プロセスが 100% になり、サーバーが db 接続を失ったときに が終了するまで 100% のままになるため、アップグレード以降はさらに悪化しています。

レール 3.1.6

PG ジェム 0.13.2

ポストグル 9.1

フュージョン・パッセンジャー

この問題は1年以上発生しているので、誰かがそれを修正する方法について洞察を持っていることを願っています. ありがとう。

4

3 に答える 3

3

おそらく、NATルーター、接続追跡ファイアウォール、またはクライアントとサーバーの間に高品質の「レイヤー3スイッチ」があります。これらのデバイスは、タイムアウト後にテーブルから記憶された接続をフラッシュします。キープアライブを有効にする必要があります。

于 2012-07-17T00:02:59.147 に答える
3

アプリケーション サーバーとデータベース サーバー間のすべてのルーター/スイッチの TCP/IP ソケット タイムアウト設定を確認します。また、データベース側でログを有効にして、接続の完全なライフ サイクルを監視し、タイミングをアプリケーションのエラーと比較します。何を探すべきかがわかるまで、postgresql.conf で次の設定をオンにすることをお勧めします。

log_connections = on
log_disconnections = on
log_statement = all

これらは、postgres プロセスの SIGHUP (またはデータベース スーパーユーザーとして "SELECT pg_reload_conf();" を実行) でアクティブ化できます。

実際の切断がログに記録される前に、「リモートホストによって接続が閉じられました」または最後のメッセージと同様のメッセージが表示されます。

これは以前に見たことがありますが、中間スイッチのタイムアウト設定が原因でした。

于 2012-07-12T19:46:42.030 に答える
3

4 つのアプリケーション サーバーから多くの keepalived 接続を維持することは、非常に困難な場合があります (非常に多数の接続を表す可能性があります。pgpool と postgres サーバー間の適切な数の keepalived 接続を維持するために、PgPool-IIをチェックすることができます。pgPool は、また、あまりにも多くのプロセスが接続を要求したときに接続をキューに入れます. その後、アプリケーションで接続がどのように管理されているかを確認してください. アプリサーバーで管理されている接続のプールはありますか? まだ必要ですか? 長い時間が必要ですか?スタンディング接続ですか、それとも短いセッション接続を使用できますか?

PgPool と postgreSQl サーバー間のセッションがまだ切断されている場合は、TCP/IP の問題を確認する必要があります。このような問題は、OS の TCP/IP 設定に起因する可能性がありますが、postgreSQl 構成で微調整することもできます。そのランタイム構成マニュアル ページでtcp_keepalive 設定を確認します。pgpoolを使用している場合は、health_checkの設定を確認してください。

于 2012-07-18T07:25:12.923 に答える