Почему движок приложений (стандартная среда python3) генерирует прерванные соединения при подключении к облачному экземпляру Gen Mysql? - PullRequest
1 голос
/ 30 мая 2019

В настоящее время я занимаюсь разработкой проекта с использованием Python 3.7, Django 2.1, Mysql в качестве базы данных.

Я развертываю его в стандартной среде механизма облачных приложений Google и для базы данных использую облачный SQL- MySql 2nd gen instance.

Приложение работает хорошо, однако, когда я анализирую журналы, я вижу эти ошибки:

"прервано соединение - ошибка чтения пакетов связи"

В этом случае соединение закрывается моим приложением (django). Если я настраиваю свое приложение на наличие постоянных подключений и помещаю wait_timeout (то есть 60) в конфигурацию облака SQL, ошибка:

"прервано соединение - истекло время ожидания при чтении пакетов связи".

Я только что определил, что это не проблема с облаком SQL или с настройкой моего приложения,но это проблема движка приложения.Я пришел к такому выводу следующим образом:

  • если я подключаюсь к экземпляру облака SQL через Mysql Workbench, соединение не прерывается
  • Аналогично, если я запускаю свое приложение на локальном компьютересервера, но при подключении к облаку SQL (через cloud_sql_proxy), не генерируется никаких ошибок, и все работает идеально.

Итак, я пришел к выводу, что проблема заключается в том, как механизм приложений подключается к облаку SQLэкземпляр.

Почему это происходит?Как это можно решить?

Ответы [ 2 ]

2 голосов
/ 31 мая 2019

Сообщения «Прерванное соединение», которые вы видите, обычно запускаются, когда соединение закрывается ненадлежащим образом или возникает сетевая аномалия между сервером и клиентом.

  • Иногда экземпляры Cloud SQL и GAE имеют долгоживущие незанятые соединения. Чтобы решить эту проблему, рекомендуется установить флаг « wait_timeout » ниже 600 секунд - как вы уже пытались это сделать.

  • Другим возможным решением является реализация средств поддержки активности на уровне приложений. SQLAlchemy предоставляет для этого « pre-ping ». В противном случае создайте активность для всех открытых соединений, отправив простой оператор SQL, такой как «SELECT 1;» регулярно, не реже одного раза в 5 минут. Также рассмотрите возможность использования в своем коде операторов типа « с db.connect () как conn: » для управления временем жизни соединения.

1 голос
/ 31 мая 2019

Я полагаю, что это связано с тем, что запросы приложений App Engine к Cloud SQL зависят от времени и соединения ограничения :

  • Для приложений, работающих в стандартной среде App Engineвсе запросы к базе данных должны завершаться в пределах таймера HTTP-запроса, около 60 секунд.Для приложений, работающих в гибкой среде, все запросы к базе данных должны завершаться в течение 60 минут.
  • Для автономных запросов, таких как задачи cron, требуется ограничение по времени 10 минут.
  • Запросы к Cloud SQL имеют ограничения, основанные натип масштабирования модуля App Engine и время, в течение которого экземпляр может оставаться в памяти (место жительства).
  • Каждый экземпляр App Engine, работающий в стандартной среде, не может иметь более 60 одновременных подключений к экземпляру Cloud SQL.Для приложений, написанных на Java 8 или Go 1.8, ограничение составляет 100.
  • Проблемы с подключением: Если вы видите ошибки, содержащие «Прерванное соединение nnnn to db:», это обычно означает, что ваше приложениене завершает соединения должным образом.Это также может быть вызвано проблемами с сетью.Эта ошибка не означает, что существуют проблемы с вашим экземпляром Cloud SQL.
...