Периодически при попытках подключения к серверу MySQL 2-го поколения возникает следующая ошибка:
OperationalError: (2062, 'Cloud SQL socket open failed with error: Transport endpoint is not connected')
Это продлится около 10 минут, а затем пройдет.
Единственное упоминание об этой ошибке в связи с Cloud SQL, которое мне удалось найти, это то, что она может быть связана с ограничениями на количество подключений (https://groups.google.com/d/msg/google-cloud-sql-discuss/sdeD17oDBOQ/wtTewl4-EgAJ), но с экземпляром практически ничего не происходит за пределами одной задачи TaskQueue, поэтому я считаю маловероятным, что мы достигнем даже лимита в 12 на экземпляр (и уж точно не общего лимита в 4 КБ).
Код, вызывающий это исключение, использует те же настройки БД, что и остальная часть приложения, и просто пытается получить SELECT
строку по первичному ключу (то есть небольшой запрос).
В журналах БД имеется множество записей об ошибках следующего вида.
[Note] Aborted connection 39643 to db: 'my_schema' user: 'root' host: 'cloudsqlproxy~<instance_ip>' (Got an error reading communication packets)
но я не уверен, связаны ли они между собой, поскольку они происходят довольно регулярно в течение дня, а указанная выше ошибка возникает только в определенное время в течение примерно 10 минут.
Это началось только после обновления до Cloud SQL 2-го поколения.
Кто-нибудь еще видел это или знает дополнительную информацию?
решение1
Оказывается, причиной этого были ограничения на подключение, как изначально предполагалось в чате Google Groups, ссылка на который приведена в вопросе.
Ошибка появилась, потому что API Pipelines использует webapp, в то время как остальная часть приложения использует Django. Поскольку Django закрывает соединения для нас, не было кода для обработки вручную, но те маршруты, которые проходили через webapp и обращались к базе данных (используя код соединения Django), оставляли их открытыми, что в конечном итоге приводило к достижению предела.