Виртуальные машины Azure, кажется, убивают долго выполняющиеся запросы MySql - PullRequest
0 голосов
/ 24 января 2019

Во время использования MySql (Aurora) я начал замечать странные запросы, пропавшие без вести, а рабочие просто зависали навсегда.После некоторого исследования кажется, что тот же код, работающий в AWS, в порядке, но в Azure он просто зависает навсегда!

Похоже, причина в том, что Azure просто убивает соединения, которые простаивают (например, длительный запрос)).Обратите внимание, что я могу воспроизвести это на виртуальной машине, у которой даже нет балансировщика нагрузки.

Это воспроизводимо со следующими date && time mysql -h$SERVER -u$USER -D mydb -p$PASS -e "SELECT SLEEP(260);"

Обратите внимание, что я проверил его с 240, 250 и 260, он умирает.Но не просто умирает, а висит навсегда!Похоже, Azure даже не удосужился сказать сокету, чтобы клиент MySql завис.

У нас есть запросы, выполняющиеся из NodeJs и Python, поэтому мне нужно решение, которое работает в обоих случаях, если это возможно.

См. Здесь хороший пример: https://imgur.com/gallery/FCV8ZWb (обратите внимание, у меня былоубить mysql в другом сеансе для его фактического выпуска)

1 Ответ

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

После некоторого исследования я нашел обходной путь низкого уровня, который всегда должен работать, я вставляю библиотеку в любой двоичный файл, который делает все сокеты KEEP-ALIVE, используя LD_PRELOAD. Вводимая мной библиотека: libdontdie , ветвь старой библиотеки: libkeepalive .

После сборки библиотеки я запускаю: date && time DD_DEBUG=1 DD_TCP_KEEPALIVE_TIME=4 DD_TCP_KEEPALIVE_INTVL=5 DD_TCP_KEEPALIVE_PROBES=6 LD_PRELOAD=/usr/lib/libdontdie.so mysql -h$SERVER -u$USER -D mydb -p$PASS -e "SELECT SLEEP(300);"

И все работает как положено (проверено как на виртуальной машине в лазури, так и на образе докера внутри AKS).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...