ピアによるdocker swarmデータベース接続のリセット


12

Docker SwarmでSpring Bootアプリケーションを実行していて、データベースにpostgresを使用しています。両方をドッカーサービスとして実行すると、ログに示されているように、データベース接続が一貫してランダムに失敗します(タイムスタンプで確認できます)。

2017-10-26T 17:14:15 .200415747Z app-db.1.1ayo6h8ro1og@scw-c2964a | ログ:クライアントからデータを受信できませんでした:接続がピアによってリセットされました

2017-10-26T 17:43:36 .481718562Z app-db.1.1ayo6h8ro1og@scw-c2964a | ログ:クライアントからデータを受信できませんでした:接続がピアによってリセットされました

2017-10-26T 17:43:56 .954152654Z app-db.1.1ayo6h8ro1og@scw-c2964a | ログ:クライアントからデータを受信できませんでした:接続がピアによってリセットされました

2017-10-26T 17:44:17 .434171472Z app-db.1.1ayo6h8ro1og@scw-c2964a | ログ:クライアントからデータを受信できませんでした:接続がピアによってリセットされました

2017-10-26T 17:49:04 .154174253Z app-db.1.1ayo6h8ro1og@scw-c2964a | ログ:クライアントからデータを受信できませんでした:接続がピアによってリセットされました

その理由が分からなかった。任意のアイデアをいただければ幸いです。

編集:

アプリケーションをテストすると、次のようなエラーもスローされることに気付きました。

SQLTransientConnectionException:HikariPool-1-接続を利用できません。リクエストは937517ms後にタイムアウトしました

ありがとう。

回答:


10

Spring BootアプリとPostgreSQLのDocker Swarmスタックをデプロイするときにも同じエラーが発生します。約1週間これと闘った後、非アクティブのためにファイアウォールがコンテナー間の接続をドロップすることに問題があることがわかりました。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

解決策はこのブログポストから来ました:ELASTICSEARCHでNODENOTAVAILABLEの例外を扱う


私はこれをできるだけ早く試します。あなたの助けをありがとう!
ElifcanÇakmak17年

こんにちは、私は解決策を試し、最初の部分のみを適用しました。昨日から稼働していて、故障していない。私はそれがうまくいくと思います:)どうもありがとう!
ElifcanÇakmak17年

カーネル4.13以降を実行しているコンテナーtcp_keepalive_timeはホスト(ソース:success.docker.com/article/ipvs-connection-timeout-issue)から継承しないため、このアプローチは新しいコンテナーでは機能しなくなります。ただし、Docker 19.03以降sysctl、サービスに提供できるオプションがあります(構成ファイルなど)。これを使用して、ホストに手を加えることなく、コンテナに上記のフラグを直接設定できます。 docs.docker.com/compose/compose-file/#sysctls
avejidah

2

アイドル接続のクローズを防ぐ別の方法があります。この問題は、15分後にアイドル接続を閉じるデフォルトのスウォームサービスディスカバリに関連しています。エンドポイントモード
明示的に指定すると、問題が解決します。例:dnsrr

version: '3.3'

services:
  foo-service:
    image: example/foo-service:latest
    hostname: foo-service
    networks:
      - foo_network
    deploy:
      endpoint_mode: dnsrr
      # ...

networks:
  foo_network:
    external: true
    driver: overlay
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.