Django + сельдерей. Потерянное соединение с MySQL сервером во время запроса - PullRequest
0 голосов
/ 19 апреля 2020

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

  • Прежде всего, он распаковывает дамп через Попен, это занимает около 30 минут.
  • После этого он также запускает команду sed через Popen, которая удаляет несколько таблиц, которые я не буду использовать. Эта команда sed занимает около часа
  • Наконец я снова запускаю Popen, чтобы восстановить дамп
proc = Popen([
            "mysql", "-h{}".format(settings.MYSQL_HOST), "-u{}".format(settings.MYSQL_USER),
            "-p{}".format(settings.MYSQL_PASSWORD), snapshot_restore.database_name
        ], stdout=PIPE, stderr=PIPE, stdin=sed_dumpfile)

Этот процесс занимает примерно 8 часов.

  • Как только восстановление завершено, он обновляет модель django в БД, и этот сигнал запускает следующую задачу.

snapshot_restore = SnapshotRestore.objects.get(id=snapshot_restore_id)
snapshot_restore.status = "processing"
snapshot_restore.save()

# Here I make the unzip, the sed and the restore

snapshot_restore.status = "finished"
snapshot_restore.database_status = "active"
snapshot_restore.save()

Но вот когда у меня появляется эта ошибка

[2020-04-19 11:33:20,723: WARNING/ForkPoolWorker-2] File "/usr/local/lib/python3.6/site-packages/django/db/backends/mysql/base.py", line 266, in _set_autocommit
    self.connection.autocommit(autocommit)
[2020-04-19 11:33:20,723: WARNING/ForkPoolWorker-2] File "/usr/local/lib/python3.6/site-packages/MySQLdb/connections.py", line 256, in autocommit
    _mysql.connection.autocommit(self, on)
[2020-04-19 11:33:20,723: WARNING/ForkPoolWorker-2] _mysql_exceptions.OperationalError: (2013, 'Lost connection to MySQL server during query')
[2020-04-19 11:33:20,723: WARNING/ForkPoolWorker-2] The above exception was the direct cause of the following exception:
[2020-04-19 11:33:20,723: WARNING/ForkPoolWorker-2] Traceback (most recent call last):
[2020-04-19 11:33:20,723: WARNING/ForkPoolWorker-2] File "/srv/src/core/tasks.py", line 243, in restore_snapshot_task
    snapshot_restore.save()

Я уже несколько раз пытался решить эту проблему.

Сначала попытался снова получить сущность перед ее сохранением:

    try:
        snapshot_restore.save()
    except Exception as e:
        logger.error('Error updating snapshot_restore status, will retry.')
        snapshot_restore = SnapshotRestore.objects.get(id=snapshot_restore_id)
        snapshot_restore.status = "finished"
        snapshot_restore.database_status = "active"
        snapshot_restore.save()

Но у меня была та же ошибка экземпляр AWS RDS Мне нужно было сделать это через группы параметров, как я нашел здесь:

Amazon RDS не удалось выполнить команду SET GLOBAL

Я установил его на 12 часов до того, как разорвать простаивающее соединение, но все равно получить то же самое n "ошибка.

Создан отдельный поток, который продолжает запрашивать у DB

Я написал эту функцию

def keep_connection_alive(id, stop):
    logger.info("Starting keep_connection_alive iteration id: " + str(id))
    while True:
        time.sleep(600)
        try:
            SnapshotRestore.objects.get(id=randrange(10))
        except Exception as e:
            logger.error('Error keeping alive: ' + str(e))
        if stop():
            print('Stopping keep_connection_alive')
            break
    logger.info('keep_connection_alive out of while')

И вызвал ее в начале этой задачи

stop_thread = False
keep_alive_thread = threading.Thread(target=keep_connection_alive, args=(1, lambda: stop_thread))
keep_alive_thread.start()

У меня было много

[2020-04-19 07:46:47,523: ERROR/ForkPoolWorker-2] ???[???]: Error keeping alive: SnapshotRestore matching query does not exist.

Поскольку в большинстве случаев идентификатор не существовал. Я запустил этот код два раза, первый из которых я получил ошибку примерно через 8 часов после запуска процесса

[2020-04-18 10:28:35,893: ERROR/ForkPoolWorker-2] ???[???]: Error keeping alive: SnapshotRestore matching query does not exist.
[2020-04-18 10:38:36,016: ERROR/ForkPoolWorker-2] ???[???]: Error keeping alive: SnapshotRestore matching query does not exist.
[2020-04-18 10:52:56,766: ERROR/ForkPoolWorker-2] ???[???]: Error keeping alive: (2013, 'Lost connection to MySQL server during query')
[2020-04-18 11:02:56,867: ERROR/ForkPoolWorker-2] ???[???]: Error keeping alive: (2006, 'MySQL server has gone away')
[2020-04-18 11:12:56,955: ERROR/ForkPoolWorker-2] ???[???]: Error keeping alive: (2006, 'MySQL server has gone away')

И второй раз я получил его, когда он пытался сохранить восстановление

snapshot_restore.save()

Откуда go отсюда?

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

Заранее спасибо!

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