Сброс соединения с базой данных Docker Swarm


12

Я запускаю приложение весенней загрузки с Docker Swarm и использую 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 мс

Спасибо.

Ответы:


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

Решение пришло из этого поста: работа с NODENOTAVAILABLE ИСКЛЮЧЕНИЯМИ В 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.