У меня есть приложение 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 отсюда?
У меня осталась только одна идея, и она должна запускать другие задачи сельдерея, которые просто изменяют состояние модели, так что сигнал также будет срабатывать и Следующая задача начнется. Но помимо тестирования этого и молитвы за это, я хотел бы понять, почему это происходит и есть ли возможное решение.
Заранее спасибо!