Tcp_keepalives_idle Postgres не обновляет время ожидания простоя AWS ELB - PullRequest
0 голосов
/ 26 февраля 2019

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

1 Ответ

0 голосов
/ 26 февраля 2019

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

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

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

psql 'host=elb_dns_name.com user=my_user keepalives_idle=1800' -c 'select pg_sleep(140)'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...