У некоторых постгресс-соединений истекает время ожидания, а у других нет

#laravel #postgresql #amazon-web-services #amazon-rds

#laravel #postgresql #amazon-веб-сервисы #amazon-rds

Вопрос:

У меня есть компьютер AWS EC2, на котором запущено приложение Laravel 5.2, которое подключается к базе данных Postgress 9.6, работающей в RDS. Хотя большинство соединений работают, некоторые из них отклоняются при попытке установить, что вызывает тайм-аут и, следовательно, ошибку в моем API. Я не знаю, что вызывает их отклонение. Кроме того, это происходит очень случайно, когда это происходит, когда это происходит, это может быть в любой конечной точке API и внутри конечной точки в любом запросе.

Когда PHP обрабатывает тайм-аут, отображается сообщение типа:

 SQLSTATE[08006] [7] timeout expired (SQL: ...)
  

Иногда Nginx обрабатывает время ожидания и выдает ошибку 504. Когда Nginx обрабатывает время ожидания, я получаю ошибку типа:

 2019/04/24 09:48:18 [error] 20657#20657: *3236 upstream timed out (110: Connection timed out) while reading response header from upstream, client: {client-ip-here}, server: {my-url-here}, request: "GET {my-endpoint-here} HTTP/2.0", upstream: "fastcgi://unix:/var/run/php/php7.0-fpm.sock", host: "{}", referrer: "https://app.cartoriovirtual.com/"
  

Все графики использования на RDS и EC2 кажутся нормальными, у меня достаточно оперативной памяти, хранилища, процессора и доступных подключений для RDS. Я также проверил внутренние потоки VPC, и они кажутся нормальными, однако у меня есть много IP-адресов (перечисленных как злоумышленники), сканирующих мои сетевые интерфейсы, большинство из них были отклонены. Некоторые (на порт 22) приняты, но остановлены при аутентификации, я использую .pem ключевой файл для аутентификации.

Сетевой интерфейс RDS принимает запросы только от внутренних компьютеров VPC. В его журналах каждые 5 минут у меня появляется такая контрольная точка:

 2019-04-25 01:05:29 UTC::@:[22595]:LOG: checkpoint starting: time
2019-04-25 01:05:34 UTC::@:[22595]:LOG: checkpoint complete: wrote 43 buffers (0.1%); 0 transaction log file(s) added, 0 removed, 1 recycled; write=4.393 s, sync=0.001 s, total=4.404 s; sync files=19, longest=0.001 s, average=0.000 s; distance=16515 kB, estimate=16515 kB
  

У кого-нибудь есть советы о том, как найти решение? Я просмотрел все возможные журналы, которые пришли в голову, исправил несколько небольших проблем, но ошибка сохраняется. У меня заканчиваются идеи.

Комментарии:

1. Возможно, входящие правила группы безопасности должны быть шире?

2. Вы уверены, что тайм-ауты такие, как вы думаете? Я предполагаю, что у вас есть SQL-запросы, выполнение которых занимает слишком много времени, и PHP отказывается от них и сообщает, что время ожидания запроса истекло. Ruby on Rails устанавливает время ожидания по умолчанию равным 5 секундам. Эта строка журнала выглядит так, будто запрос занял 4,4 секунды. Можете ли вы попробовать выполнить запрос самостоятельно и посмотреть, сколько времени это займет? Кроме того, вы знаете, установлен ли тайм-аут выполнения? (Отказ от ответственности: я не знаком с Laravel.)

3. @jspcal Я освободил трафик внутри VPC, теперь EC2 и RDS могут свободно обмениваться данными, но ничего не изменилось.

4. @Нейт, время ожидания выполнения составляет 30 секунд. Однако в большинстве случаев выполняются одни и те же запросы с одинаковыми параметрами. Только у небольшого процента из них истекает время ожидания, эти запросы выбираются случайным образом среди запросов. Я думал о параллельных блоках, но, похоже, pgsql может отлично обрабатывать параллельные выборки в одной таблице. Наконец, у меня было промежуточное программное обеспечение, регистрирующее время всех выполненных запросов в течение нескольких дней. Ни одно из них не превышало 3 секунд, и большинство из них были меньше 500 мс.