Tcp_keepalives_idle Postgres не обновляет время ожидания простоя AWS ELB

У меня есть Amazon ELB перед Postgres. Это по причинам, связанным с Kubernetes, см. Этот вопрос. Я пытаюсь обойти максимальный лимит ожидания простоя AWS ELB, равный 1 часу, чтобы у меня были клиенты, которые могут выполнять длительные транзакции, не отключаясь от ELB. В моем случае я не контролирую конфигурацию клиента, поэтому любой обходной путь должен происходить на стороне сервера.

Я сталкивался с tcp_keepalives_idle установка в Postgres, которая теоретически должна обойти это путем отправки периодических пакетов keepalive клиенту, создавая таким образом активность, чтобы 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 клиента и сервера считаются незанятыми. Таким образом, если нет способа заставить сервер отправлять данные внутри полезных нагрузок или отправлять данные в какой-либо другой форме, это может быть невозможно.

1 ответ

Сообщения Keepalive отправляются на уровне TCP, намного ниже PostgreSQL, поэтому не имеет значения, работает ли сервер pg_sleep или что-то другое.

Поскольку размещенная база данных является чем-то вроде черного ящика, вы можете попытаться контролировать поведение на стороне клиента. К счастью, PostgreSQL также предлагает параметры поддержки активности на стороне клиента.

Эксперимент с

psql 'host=elb_dns_name.com user=my_user keepalives_idle=1800' -c 'select pg_sleep(140)'
Другие вопросы по тегам