Я запускаю приложение весенней загрузки с 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 мс
Спасибо.
источник
tcp_keepalive_time
от хоста (источник: success.docker.com/article/ipvs-connection-timeout-issue ), поэтому этот подход больше не будет работать с новыми контейнерами. Однако, начиная с Docker 19.03, естьsysctl
опция, которая может быть предоставлена сервисам (например, в файле компоновки). Это можно использовать для установки вышеуказанных флагов непосредственно в контейнерах, не связываясь с хостом. docs.docker.com/compose/compose-file/#sysctlsЕсть еще один способ предотвратить закрытие простаивающего соединения. Проблема связана с обнаружением службы роя по умолчанию, которое закрывает простаивающее соединение через 15 минут.
Явное
dnsrr
указание режима конечной точки решает проблему, например:источник