@pnoeric, раз вы обеспокоены временем безотказной работы сайта, я хотел бы поделиться с вами тем, что узнал на данный момент.
Я выполнял миграцию в режиме реального времени, как уже упоминал. Если не ограничивать скорость миграции, очереди, отвечающие за такие задачи, как уведомление пользователей о активности друг друга, переполняются, и пользовательский опыт на сайте ухудшается.
Я мигрировал около 500 постов с видео и примерно 30 000 постов с изображениями, что заняло около двух недель.
Если вы хотите попробовать код, который я использовал, он находится здесь:
Вы можете скачать его и скопировать в своё приложение, заменив текущее содержимое файла lib/tasks/uploads.rake.
С этим кодом вы можете выполнить что-то вроде следующего:
bin/rake uploads:batch_migrate_from_s3[100,1000]
Это рассмотрит только 1000 постов с вложениями в общей сложности и мигрирует файлы максимум из 100 постов перед остановкой; каждый раз, когда скрипт фактически изменяет пост после миграции его вложений, он будет ждать, пока очередь не опустеет, прежде чем переходить к следующему.
Если вы скопируете этот файл, это сломает будущие обновления сайта, пока вы не отмените изменения. Самый простой способ отменить их после того, как вы останетесь довольны результатом, — это выполнить ./launcher rebuild app (хотя как разработчик я использую git checkout HEAD lib/tasks/uploads.rake, чтобы отменить свои изменения…).
Я заметил, что, по крайней мере, в случае с DigitalOcean Spaces, иногда мне приходится повторять попытку несколько раз, прежде чем миграция завершится успешно. В текущем виде скрипт не выводит никаких предупреждений при возникновении таких ситуаций, и вам просто приходится продолжать запускать его и ждать результата. У меня есть запрос на слияние (PR), ожидающий проверки, который выводит сообщения об ошибках в таких случаях, чтобы вы хотя бы знали, что что-то пошло не так.
…
Я добавил простой короткий цикл повторных попыток, а также вывод сообщения об ошибке, и, похоже, цикл повторных попыток решает проблему. Кроме того, валидация по текущим правилам выполнялась для исходного содержимого прошлых постов, что могло сломать миграцию и незаметно оставить посты, требующие повторной обработки; я также исправил это. Вам определённо не стоит выполнять миграцию без получения хотя бы исправления валидации, которое является одним из коммитов в моём PR, currently находящемся на рассмотрении.
…
Насколько мне известно, я завершил свою миграцию. Мой PR содержит весь код, который я использовал для её завершения. Он ещё не был проверен. Если хотите, рекомендую следить за обсуждением по адресу Migrate_from_s3 problems.