Миграция базы данных vBulletin 5: ошибки скрипта импорта

Ну что ж, для вас, Джемми, это «плохие новости».

Мы решили, что скрипт находится в таком незавершённом состоянии, что будем писать его с нуля, чтобы напрямую перенести нашу установку vb3 в Discourse. Также используем C#, что делает процесс на несколько порядков быстрее.

Если нам удастся сделать скрипт достаточно универсальным, мы откроем репозиторий на GitHub для публики, но сомневаюсь, что это вызовет большой интерес, ведь мало кто захочет переносить старые сообщества, которые до сих пор застряли на vb3.

Всего краткое обновление. Благодаря работе невероятно преданной небольшой группы мы почти завершили работу.

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

Вот общие цифры:

По размеру база данных в формате vbulletin3 составляет около 8 ГБ.

Тесты, запущенные с локальных машин с удалённым подключением к исходной базе данных, занимают около 6 часов для завершения.

Скрипт мигрирует все форумы и подразделы, преобразуя их в категории и подкатегории. Требуется поддержка подкатегорий третьего уровня, поскольку у нас довольно старый форум, и там размещены некоторые «клановые» форумы, которые действительно глубоко вложены.

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

Каждый подраздел, для которого были установлены пользовательские права доступа (например, только для чтения), права только для модераторов/администраторов или который был просто скрыт с паролем, мигрируется как «доступно только для персонала». В итоге их будет около десятка, и сотрудники смогут вручную повторно включить их для соответствующих групп пользователей.

Также мигрируются пользователи, группы пользователей и личные сообщения. Личные сообщения мигрируются «по-дискурсовски»: вместо N тем с одним сообщением, как это было бы при простой миграции базы данных 1:1 (на самом деле довольно глупая структура базы данных), они будут организованы в виде потоков, как это принято в Discourse.

Скрипт также уже выполняет «приготовление» (cooking) для всех сообщений, чтобы ускорить процесс.

Миграция тем и сообщений выполняется с использованием нескольких параллельных подключений, и скрипт всегда будет пытаться использовать максимально возможное количество подключений, разрешённых исходной базой данных.

Мы посмотрим, сколько времени это займёт в среднем на небольшом сервере с 2 ядрами и 4 ГБ ОЗУ, но это уже на несколько порядков быстрее, чем текущий (незавершённый) скрипт массовой миграции, который доступен.

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

Наверное, это финальное обновление.

Нам наконец удалось синхронизировать всё (инфраструктуру, код, пользователей, модераторов и т. д.) и завершить миграцию. Это произошло вчера. Я не буду давать ссылку на сообщество, так как не помню, разрешено ли это, да и в любом случае это довольно известное сообщество в Италии.

Вот цифры, которые мы показываем в среднем за 30 дней, боты уже отфильтрованы.

На команду волонтёров, занимавшихся этим, конечно, оказывалось considerable давление, и работа ещё не завершена: мы всё ещё доводим до ума кастомную тему и некоторые настройки фона Discourse (похоже, мне придётся открыть множество тем с просьбами о помощи, уточнениях и указаниях).

Наш скрипт успешно перенёс всё, что было необходимо:

  • пользователей
  • группы пользователей
  • статусы модераторов, банов и администраторов
  • личные сообщения
  • категории
  • темы
  • ответы

и так далее. Мы также интегрировали процесс «приготовления» (cooking) в саму миграцию, так как в vBulletin есть некоторые кастомизации для встраивания твитов, видео с YouTube и другого контента, который некорректно обрабатывался бы стандартным механизмом «приготовления» в Discourse.

Тесты мы запускали на сервере с 4 ядрами и 8 ГБ ОЗУ, и вся миграция заняла около 7–8 часов.
Для продакшена мы собрали достаточно средств на Patreon, чтобы арендовать сервер с 8 ядрами и 30 ГБ ОЗУ, и весь процесс занял 4 часа.

Мы провели прямую трансляцию миграции, включив пару неудачных стартов (конечно же :stuck_out_tongue:) и фоновую музыку. Нам было очень весело.

Детали количества тем/сообщений и временных меток можно увидеть на скриншоте.
Три временных показателя: время на чтение, время на «приготовление» (cooking), время на запись.

Это было утомительное, но захватывающее приключение, и, @pfaffman, поверьте, вам повезло, что я решил не привлекать вашу помощь.

На сегодня подсчёт только моего времени на этот проект составляет примерно £25k :rofl:
Я не учитываю время, которое другие трое человек посвятили проекту за последние два месяца, часто работая над ним глубокой ночью.

Мы всё ещё выполняем некоторые скрипты постмиграции: один импортирует все аватары пользователей, а другой создаёт все перенаправления постоянных ссылок, чтобы ссылки внутри ответов, которые всё ещё указывают на старый формат URL, корректно перенаправлялись. Ожидаю, что они завершатся в течение следующих 24 часов.

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

Редактирование: Добавляю полную миграцию всех аватаров пользователей + постоянных ссылок на внутренние ссылки на темы/категории.

image

Запущено после основной миграции данных.

Всего наилучшего!

Это звучит правдоподобно. Ваш код выглядит очень хорошо, хотя, вероятно, если бы скрипт просто работал месяц, результат был бы тем же. Финальный импорт, скорее всего, занял бы несколько часов или даже меньше.

Рад, что вы справились! Поздравляю с отлично выполненной работой.

Я имею в виду, что суть была в том, чтобы не закрывать сайт на месяц в ожидании миграции :slight_smile:

К тому же, это довольно сложно, учитывая, что в официальном скрипте не хватает некоторых частей :thinking:

Вам бы это не понадобилось. Вы бы запустили скрипт, оставив сайт работающим. Когда скрипт завершится, вы бы запустили его снова; он пропустит уже импортированные данные, поэтому выполнится гораздо быстрее. Возможно, потребуется сделать это несколько раз, но в итоге всё завершится за минуты или часы, так как новых данных для обработки будет немного. Затем вы бы заморозили старый сайт и запустили скрипт в последний раз. По умолчанию скрипт проверяет каждого пользователя и каждое сообщение, но вы также можете установить IMPORT_AFTER, указав дату, чтобы полностью игнорировать старые данные — тогда процесс займёт очень мало времени.

Привет! Я один из тех, кто работал над этим.
Лично для меня это был очень обогащающий опыт обучения, и нам ещё предстоит решить последние вопросы, но вся сообщество отреагировало положительно: новая ветка с реакциями на форуме достигла…

ну, вот такого количества сообщений примерно за 24 часа :smile:

Не знаю, сколько ещё случаев существует в природе, где требуется миграция установок vB3, но, надеясь, что эта ветка поможет кому-то в будущем, скажу: это возможно, не отчаивайтесь слишком сильно. Это много работы, но это выполнимо :smile: