Database

docker swarm 數據庫連接被對等方重置

  • December 11, 2019

我正在使用 docker swarm 執行一個 spring boot 應用程序,並且我使用 postgres 作為數據庫。當我將它們都作為 docker 服務執行時,數據庫連接始終隨機失敗(如您在時間戳上所見),如日誌所示:

2017-10-26T 17:14:15 .200415747Z app-db.1.1ayo6h8ro1og@scw-c2964a | LOG:無法從客戶端接收數據:對等方重置連接

2017-10-26T 17:43:36 .481718562Z app-db.1.1ayo6h8ro1og@scw-c2964a | LOG:無法從客戶端接收數據:對等方重置連接

2017-10-26T 17:43:56 .954152654Z app-db.1.1ayo6h8ro1og@scw-c2964a | LOG:無法從客戶端接收數據:對等方重置連接

2017-10-26T 17:44:17 .434171472Z app-db.1.1ayo6h8ro1og@scw-c2964a | LOG:無法從客戶端接收數據:對等方重置連接

2017-10-26T 17:49:04 .154174253Z app-db.1.1ayo6h8ro1og@scw-c2964a | LOG:無法從客戶端接收數據:對等方重置連接

我無法理解或發現其中的原因。我會很感激任何想法。

編輯:

我們意識到,在測試應用程序時,它也會拋出如下錯誤:

SQLTransientConnectionException:HikariPool-1 - 連接不可用,請求在 937517 毫秒後超時

謝謝。

我在部署 Spring Boot 應用程序和 PostgreSQL 的 Docker Swarm 堆棧時遇到了同樣的錯誤。在與這個問題鬥爭了大約一周之後,我發現問題在於防火牆由於不活動而斷開了容器之間的連接。快速回答,在linux機器上執行以下cmd:

sudo sysctl -w \
net.ipv4.tcp_keepalive_time=600 \
net.ipv4.tcp_keepalive_intvl=60 \
net.ipv4.tcp_keepalive_probes=3

此外,我還包括以下 tomcat 連接池屬性:

tomcat:
 max-active: 10
 initial-size: 5
 max-idle: 8
 min-idle: 5
 test-on-borrow: true
 test-while-idle: true
 test-on-return: false
 test-on-connect: true
 validation-query: SELECT 1
 validation-interval: 30000
 max-wait: 30000
 min-evictable-idle-time-millis: 60000
 time-between-eviction-runs-millis: 5000
 remove-abandoned: true
 remove-abandoned-timeout: 60

解決方案來自這篇博文:DEALING WITH NODENOTAVAILABLE EXCEPTIONS IN EASTICSEARCH

引用自:https://serverfault.com/questions/885877