У меня есть Amazon ELB перед Postgres.Это по причинам, связанным с Kubernetes, см. этот вопрос .Я пытаюсь обойти максимальное значение AWS ELB Idle Timeout , равное 1 часу, чтобы у меня были клиенты, которые могут выполнять длительные транзакции, не отключаясь от ELB.В моем случае я не контролирую конфигурацию клиента, поэтому любой обходной путь должен происходить на стороне сервера.
Я сталкивался с параметром tcp_keepalives_idle
в Postgres, который теоретически должен обойти этоотправка периодических пакетов поддержки активности клиенту, таким образом, создавая активность, чтобы ELB не думал, что клиент бездействует.
Я попытался проверить это, установив idle timeout
на ELB равным 2 minutes
.Я установил tcp_keepalives_idle
на 30 секунд, что должно заставить сервер отправлять клиенту подтверждение активности каждые 30 секунд.Затем я выполняю следующий запрос через балансировщик нагрузки: psql -h elb_dns_name.com -U my_user -c "select pg_sleep(140)"
.Через 2 минуты ELB отключает клиента.Почему пакеты keepalive не доходят до клиента?Что-то с pg_sleep
может их блокировать?Если да, то есть ли лучший способ симулировать длительный запрос / транзакцию?
Я боюсь, что это может быть глубокое погружение, и мне, возможно, придется принести tcpdump
или аналогичные инструменты.К сожалению, все становится немного сложнее, чтобы разобраться со всем происходящим на k8s.Поэтому, прежде чем идти по этому пути, я подумал, что было бы хорошо, если бы я упустил что-то очевидное.Если нет, то любые советы о том, как наилучшим образом определить, действительно ли keepalive отправляется на сервер через ELB и заканчивается на клиенте, будут весьма полезны.
Обновление : Я связался с Amazon по этому поводу.Очевидно, idle
определяется как не передающий data
по проводам.Data
определяется как любой сетевой пакет, который имеет полезную нагрузку.Так как у keep-alive TCP нет полезных нагрузок, keep-alives клиента и сервера считаются незанятыми.Таким образом, если нет способа заставить сервер отправлять данные внутри полезных нагрузок или отправлять данные в какой-либо другой форме, это может быть невозможно.