з’єднання бази даних докер ройк скидається з однорангових


12

Я запускаю весняний завантажувальний додаток із роєм docker, і я використовую postgres для бази даних. Коли я запускаю їх обох як докер-службу, підключення до бази даних виходить з ладу послідовно та випадково (як видно з часової позначки), як говорить журнал:

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 мс

Дякую.

Відповіді:


10

У мене така ж помилка розгортання стека Docker Swarm програми Spring Boot та PostgreSQL. Після боротьби з цим близько тижня я зрозумів, що проблема полягає в тому, що брандмауер перекидає з'єднання між контейнерами через бездіяльність. Швидкий відповідь, запустіть наступний cmd на машині Linux:

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


Я спробую це якомога швидше. Дякую за вашу допомогу!
Еліфкан Çакмак

привіт, я спробував рішення, і я застосував лише першу частину. це було з вчорашнього дня і не провалилось. Я здогадуюсь це працює :) дякую велике!
Еліфкан Çакмак

Контейнери з ядром 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.