簡體   English   中英

在單獨的AWS實例上連接到PostGres數據庫時“無法從服務器接收數據:連接超時”或“連接未打開”錯誤

[英]“could not receive data from server: Connection timed out” or “connection not open” errors when connecting to PostGres DB on a separate AWS instance

我在我的應用服務器上使用Ruby 1.9.3,該服務器在AWS EC2實例上運行。 我在單獨的EC2實例上運行Postgres DB,但兩個實例都在同一個安全組中。 當Ruby代碼連接到DB時,它使用Sequel ORM gem( http://sequel.rubyforge.org/ )。

現在,我已將Postgres 9.1.4 DB配置為能夠從應用服務器實例正確接受連接。

但是,我時不時地在應用服務器的日志中注意到它將無法連接到Postgres數據庫實例,我會看到如下錯誤消息:

PG::Error: could not receive data from server: Connection timed out

要么

PG::Error: connection not open

所以我去了Postgres數據庫實例並查看了/var/log/postgresql/postgresql-9.1-main.log,我看到了一堆這樣的消息:

2012-11-07 08:15:17 UTC LOG:  could not receive data from client: Connection timed out
2012-11-07 08:15:17 UTC LOG:  unexpected EOF on client connection

我在網上搜索包括堆棧溢出,並確保我的PostgreSQL沒有啟用SSL(我的postgresql.conf文件中有“ssl = off”)

在這一點上,我不確定Postgres配置中究竟是什么問題。 如果沒有充分證明的原因,我不會弄亂生產服務器上的最大連接數或最大超時值。

應用服務器大多數時間都可以連接到數據庫,此問題只會間歇性地出現。

在Ruby方面,這是在進行Postgres調用時“連接未打開”的錯誤跟蹤:

PG::Error: connection not open
/var/lib/gems/1.9.1/gems/sequel-3.38.0/lib/sequel/adapters/postgres.rb:145:in `async_exec'
/var/lib/gems/1.9.1/gems/sequel-3.38.0/lib/sequel/adapters/postgres.rb:145:in `block in execute_query'
/var/lib/gems/1.9.1/gems/sequel-3.38.0/lib/sequel/database/logging.rb:33:in `log_yield'
/var/lib/gems/1.9.1/gems/sequel-3.38.0/lib/sequel/adapters/postgres.rb:145:in `execute_query'
/var/lib/gems/1.9.1/gems/sequel-3.38.0/lib/sequel/adapters/postgres.rb:132:in `block in execute'
/var/lib/gems/1.9.1/gems/sequel-3.38.0/lib/sequel/adapters/postgres.rb:111:in `check_disconnect_errors'
/var/lib/gems/1.9.1/gems/sequel-3.38.0/lib/sequel/adapters/postgres.rb:132:in `execute'
/var/lib/gems/1.9.1/gems/sequel-3.38.0/lib/sequel/adapters/postgres.rb:372:in `_execute'
/var/lib/gems/1.9.1/gems/sequel-3.38.0/lib/sequel/adapters/postgres.rb:234:in `block (2 levels) in execute'
/var/lib/gems/1.9.1/gems/sequel-3.38.0/lib/sequel/adapters/postgres.rb:379:in `check_database_errors'
/var/lib/gems/1.9.1/gems/sequel-3.38.0/lib/sequel/adapters/postgres.rb:234:in `block in execute'
/var/lib/gems/1.9.1/gems/sequel-3.38.0/lib/sequel/database/connecting.rb:229:in `block in synchronize'
/var/lib/gems/1.9.1/gems/sequel-3.38.0/lib/sequel/connection_pool/threaded.rb:105:in `hold'
/var/lib/gems/1.9.1/gems/sequel-3.38.0/lib/sequel/database/connecting.rb:229:in `synchronize'
/var/lib/gems/1.9.1/gems/sequel-3.38.0/lib/sequel/adapters/postgres.rb:234:in `execute'
/var/lib/gems/1.9.1/gems/sequel-3.38.0/lib/sequel/dataset/actions.rb:744:in `execute'
/var/lib/gems/1.9.1/gems/sequel-3.38.0/lib/sequel/adapters/postgres.rb:483:in `fetch_rows'
/var/lib/gems/1.9.1/gems/sequel-3.38.0/lib/sequel/model/base.rb:785:in `primary_key_lookup'
/var/lib/gems/1.9.1/gems/sequel-3.38.0/lib/sequel/model/base.rb:124:in `[]'

同樣,這是“無法從服務器接收數據”的跟蹤:

    PG::Error: could not receive data from server: Connection timed out
/var/lib/gems/1.9.1/gems/sequel-3.38.0/lib/sequel/adapters/postgres.rb:124:in `block'
/var/lib/gems/1.9.1/gems/sequel-3.38.0/lib/sequel/adapters/postgres.rb:124:in `ensure in check_disconnect_errors'
/var/lib/gems/1.9.1/gems/sequel-3.38.0/lib/sequel/adapters/postgres.rb:124:in `check_disconnect_errors'
/var/lib/gems/1.9.1/gems/sequel-3.38.0/lib/sequel/adapters/postgres.rb:132:in `execute'
/var/lib/gems/1.9.1/gems/sequel-3.38.0/lib/sequel/adapters/postgres.rb:372:in `_execute'
/var/lib/gems/1.9.1/gems/sequel-3.38.0/lib/sequel/adapters/postgres.rb:234:in `block (2 levels) in execute'
/var/lib/gems/1.9.1/gems/sequel-3.38.0/lib/sequel/adapters/postgres.rb:379:in `check_database_errors'
/var/lib/gems/1.9.1/gems/sequel-3.38.0/lib/sequel/adapters/postgres.rb:234:in `block in execute'
/var/lib/gems/1.9.1/gems/sequel-3.38.0/lib/sequel/database/connecting.rb:229:in `block in synchronize'
/var/lib/gems/1.9.1/gems/sequel-3.38.0/lib/sequel/connection_pool/threaded.rb:105:in `hold'
/var/lib/gems/1.9.1/gems/sequel-3.38.0/lib/sequel/database/connecting.rb:229:in `synchronize'
/var/lib/gems/1.9.1/gems/sequel-3.38.0/lib/sequel/adapters/postgres.rb:234:in `execute'
/var/lib/gems/1.9.1/gems/sequel-3.38.0/lib/sequel/dataset/actions.rb:744:in `execute'
/var/lib/gems/1.9.1/gems/sequel-3.38.0/lib/sequel/adapters/postgres.rb:483:in `fetch_rows'
/var/lib/gems/1.9.1/gems/sequel-3.38.0/lib/sequel/model/base.rb:785:in `primary_key_lookup'
/var/lib/gems/1.9.1/gems/sequel-3.38.0/lib/sequel/model/base.rb:124:in `[]'

我觀察到如果我同時在同一個實例上運行App服務器和Postgres DB,那么就沒有連接問題,至少現在還沒有。 也許Postgres對非本地數據庫連接不太寬容?

請讓我知道我可能錯過了什么,我很感激!

IS

通常的解釋是連接問題。

或者,如果它不是連接,則可能是協議同步問題。 看起來兩端可能試圖從套接字讀取,既沒有嘗試寫入。 因此,客戶端可能希望服務器發送響應,而服務器期望客戶端發送數據。

如果它是間歇性的和偶爾的,這將很難調試,因為你不能真正只是tcpdump並分析它。

我將在服務器端添加更多日志記錄log_statement = 'all' ,以及一個log_line_prefix ,它顯示客戶端IP,后端開始時間和后端pid。 通過這種方式,您可以開始嘗試將這些故障與故障前發生的會話活動相匹配,確定是特定客戶端,特定工作,還是真正隨機。

這個Sequel ORM gem是在底層使用libpq ,還是它自己的PostgreSQL協議實現? 如果是后者,那可能會成為罪魁禍首。

更新:看起來它可以使用pg gem(基於libpq ), postgres gem,或者可能使用postgres-pr (無論是什么)。 如果已經安裝,它會更喜歡pg

由於您似乎已經在使用pg gem,您可能需要做一些診斷工作來追蹤問題出現的位置 - 特定查詢,特定客戶等 - 並嘗試找到重現問題的方法。 PostgreSQL的csvlog可能很有用,因此您可以更輕松地加載和分析日志。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM