AWS ELB сбрасывает соединения.Нужно сохранить это живым - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть AWS-развертывание приложения SpringBoot, которое запускает запросы на выборку (на основе запроса) и генерирует выходной файл (zip), содержащий набор результатов.Сообщение:

SpringBoot app -> AWS Route 53 -> AWS ELB -> Vertica DB Cluster

Запросы могут выполняться часами, и, следовательно, мое соединение должно поддерживаться в рабочем состоянии.Проблема в том, что ELB сбрасывает соединение после периода простоя.Приложение подключается к Vertica DB через порт 5433.

[root@ip-10-122-5-151 logs]# netstat -anpo | grep 5433
tcp6       0      0 10.122.5.151:47956      10.122.32.89:5433       ESTABLISHED 26605/java           keepalive (9.06/0/0)
tcp6       0      0 10.122.5.151:58416      10.122.33.133:5433      ESTABLISHED 26605/java           keepalive (8.67/0/0)
tcp6       0      0 10.122.5.151:47966      10.122.32.89:5433       ESTABLISHED 26605/java           keepalive (11.10/0/0)
tcp6       0      0 10.122.5.151:47972      10.122.32.89:5433       ESTABLISHED 26605/java           keepalive (12.38/0/0)
tcp6       0      0 10.122.5.151:47960      10.122.32.89:5433       ESTABLISHED 26605/java           keepalive (10.08/0/0)
tcp6       0      0 10.122.5.151:47970      10.122.32.89:5433       ESTABLISHED 26605/java           keepalive (12.13/0/0)

Как видно, клиент имеет keep-alive.В кластере Vertica мы настроили свойства:

echo 60 > /proc/sys/net/ipv4/tcp_keepalive_time
echo 30 > /proc/sys/net/ipv4/tcp_keepalive_intvl
echo 20 > /proc/sys/net/ipv4/tcp_keepalive_probes

(Источник)

Наше время ожидания ELB установлено на 80 секунд.

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

Однако, когда я запускаю любой запрос, он возвращает исключение EOFException через 80 секунд (что связано с подключениемблизко).Я также проверил это на клиентах БД, выполнив SELECT SLEEP (90);

Можно ли как-нибудь сохранить это соединение в течение нескольких (4-6) часов?

1 Ответ

0 голосов
/ 30 января 2019

Для тех, кто споткнулся в этом посте с подобной проблемой, мы уже обратились к нему.Проблема в том, что ELB не учитывает параметры TCP (tcp keep-alives).

Было несколько способов решить эту проблему:

  1. Устранить ELB и вместо этого использовать EIP длякластер БД.
  2. Замените ELB на NLB.

Мы разработали NLB, так как это казалось идеальным решением для нас.Однако, если у вас все еще есть проблемы с NLB, ознакомьтесь с ограничениями, которые он вводит при подключении через него (например, вам нужно нитро-экземпляры на стороне клиента для подключения к NLB с подключениями внутри vpc и т. Д.)

...