прерывистый сброс соединения одноранговым sql postgres

После периода бездействия мой веб-сервис go получает net.OpError с сообщением read tcp x.x.x.x:52086->x.x.x.x:24414: read: connection reset by peer при выполнении первого SQL-запроса postgres. После ошибки последующие запросы будут работать нормально.

База данных postgres размещена на compose.com, у которого есть haproxy перед базой данных postgres. В моем веб-приложении go используются стандартные sql и sqlx.

Я пробовал запускать тикер, вызывающий db.Ping() каждые 15 минут, но это не решило проблему.

Почему стандартная библиотека sql не обрабатывает эти разрывы соединения?


person Nick    schedule 14.05.2018    source источник
comment
На что ты здесь надеешься? Если соединение было сброшено, необходимо переподключиться.   -  person Flimzy    schedule 14.05.2018
comment
Я использую стандартный материал lib sql.Open, который предназначен для обработки пула подключений, поэтому я не могу просто переподключиться. Также, как я уже упоминал, после ошибки последующие запросы проходят нормально. Я обновлю вопрос для ясности.   -  person Nick    schedule 14.05.2018
comment
Да, способ справиться с этим с помощью стандартной библиотеки Go — обнаружить сбой соединения и повторить операцию.   -  person Flimzy    schedule 14.05.2018
comment
Хмм хорошо. Последний абзац здесь, кажется, предполагает обратное. go-database-sql.org/errors.html   -  person Nick    schedule 14.05.2018
comment
Дикая догадка: соединение с haproxy все еще живо, но время ожидания соединения с серверной частью истекло, и haproxy не закрывает другой конец. Я видел подобные проблемы с Redis. Что произойдет, если вы не используете haproxy? Обычный эхо-запрос не очень поможет, потому что нет гарантии, что все соединения в любом пуле увидят какой-то трафик до истечения времени ожидания.   -  person Peter    schedule 14.05.2018
comment
Да, я думаю, что, возможно, только что пришел к подобному выводу. Я думаю о настройке db.SetConnMaxLifetime(time.Minute * 15), которая, я думаю, должна сбросить мертвые соединения.   -  person Nick    schedule 15.05.2018
comment
Привет @Peter, похоже, это помогло. Если вы хотите прокомментировать это как ответ, я дам вам очки.   -  person Nick    schedule 25.05.2018
comment
Отвечает ли это на ваш вопрос? HAProxy закрывает длительные TCP-соединения, игнорируя поддержку активности TCP   -  person user5994461    schedule 06.05.2020


Ответы (1)


Так как никто не написал, что явно. Решением этой проблемы является установка db.SetConnMaxLifetime(time.Minute). Я попробовал это, и это работает. Сброс соединения часто происходит на AWS, где установлен лимит бездействия на 350 секунд, после чего возвращается TCP RST.

person pixel    schedule 14.03.2021