2016-03-04 1 views
2

Я заметил, что, хотя и достаточно быстро, соединение с базой данных (облачный SQL-тумблер Google mysql-совместимый) является большой частью запроса. Я использую PDO для абстракции.Как вы работаете с постоянными соединениями PDO с облачным SQL-сервером Google?

Итак, поскольку в этом случае очевидным решением является включение PHP's PDO persistent connections.

В моем понимании, и я проверил это в исходном коде РНР (ссылки пыльника), способ их работа выглядит следующим образом:

  • при подключении с персистирующим флагом на, PHP caches the connection с использованием хэша строки подключения, имени пользователя и пароля для ключа
  • при попытке повторно подключиться в другом запросе checks if a persistent connection exists, то checks the liveness of the connection (что конкретно связано с драйвером; mysql version is what is executed в моем случае) и убивает кешированную версию, если он не прошел тест
  • если в кэшированном варианте on был убит, новая связь создана и возвращена; в противном случае вы можете пропустить накладные расходы на создание соединения (примерно в 30 раз быстрее процесс создания на основе профилей xdebug, выполняемых непосредственно в версиях версии в облаке)

Все звучит хорошо до сих пор? Не уверен, как все это работает, когда вы говорите, что у вас есть кешированные соединения, и два запроса ударил его (стресс-тестирование, похоже, не вызывает проблем), но в остальном звучит okey и при тестировании работает нормально.

Ну, вот что происходит в реальном мире через некоторое время проходит ...

После того, как соединение «умирает» PDO будет простаивать весь запрос на 60-й или более. Это происходит, я верю, возможно, через 1 час или более; поэтому в течение короткого времени все будет работать нормально, а PDO будет подключаться супер быстро к Cloud SQL. Я пробовал несколько способов, чтобы, по крайней мере, уменьшить старение, превышающее 1 с, но без результата (ini_set тайм-аут сокета не влияет на него, истекает флаг на PDO, игнорируется. Я считаю, исключения и проверки состояния для «ушли» бесполезны так как он останавливается при подключении и т. д.). Я предполагаю, что, скорее всего, связь «истекает», но причины мне неизвестны. Я предполагаю, что Cloud SQL сбрасывает его с тех пор, как он не находится в «show processlist», но, возможно, я не смотрю на него правильно.


Есть ли какой-либо секретный соус, который заставляет постоянные соединения PDO работать с Cloud SQL более чем на короткое время?

Поддерживаются ли постоянные подключения к Cloud SQL?

+0

Где работает приложение PHP? AppEngine? Вычислить двигатель? В другом месте? – Vadim

+0

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

+0

Я запускаю приложение в контейнере, кубернете. Разумеется, это вычислительный движок. – srcspider

ответ

1

Вы не описали, где работает ваше приложение (например, Compute Engine, App Engine и т. Д.), Поэтому я сделаю обоснованное предположение, основанное на описанных симптомах.

Скорее всего, ваше постоянное время TCP слишком велико на хосте приложения. Вы можете изменить настройки с помощью these instructions.

Предполагая, что хост Linux, следующая команда будет показывать текущее значение в секундах:

cat /proc/sys/net/ipv4/tcp_keepalive_time 

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

TCP keepalive отправляет периодические «ping» на простоя подключения для решения этой проблемы/функции.

Cloud SQL поддерживает длительные соединения.

+0

Достаточно интересно на официальном изображении докеры Centos 7, которого не существует; и требуется перекомпиляция ядра для получения, если я не ошибаюсь. :/Предполагая, что это проблема, почему она терпит неудачу? – srcspider

+0

Проверьте настройку на хосте, запускающем контейнер, а не в контейнере. – Vadim

+0

Хост установлен на стандартный 7200 секунд. Я буду экспериментировать с 60 секундами, как рекомендовано документами, и посмотреть, как эти выставки. Хотя, поскольку я использую контейнерный движок, он как бы бросает молот в параметры автомасштабирования, так как прикосновение к узлу не очень желательно. – srcspider