Преобразование данных из Mongo в MySQL (110M документов, 60Gigs)-Советы и предложения?

Мне было поручено перенести данные из базы данных MongoDB в базу данных MySQL. (Существуют веские причины для переноса -, поэтому необходимо выполнить ).

Коллекция MongoDB:

  • Имеет около 110 миллионов документов
  • Весит 60 ГБ размером
  • Имеет индексы для важных свойств
  • Работает автономный отдельный сервер Windows 2008, который не обслуживает производственный трафик

. Установка, которую мы пробовали:

  • Большой экземпляр сервера Amazon EC2 Win2008 с 7,5 ГБ ОЗУ / 8 ГБ файла подкачки
  • Консольное приложение C #, которое преобразует данные MongoDB в локальную базу данных MySQL

. Мы извлекаем из памяти MongoDB 1K документов за раз, выполняем необходимую обработку, а затем сохраняем их в базу данных MySQL, выполняя пакетную запись по 500 за раз.

Проблема, с которой мы сталкиваемся, заключается в том, что после каждых 2,5 млн документов сервер перестает работать, и Mongo отвечает очень медленно -тайм-аут операции выборки данных приложения (Свободная оперативная память заканчивается к моменту обработки 1 млн документов)

Мы медленно продвигаемся вперед, убивая процесс mongod и запуская его снова каждые 2,5 миллиона записей, когда он падает -, но я уверен, что мы делаем что-то не так.

Вопрос:

Должен ли я переместить сервер Mongo в крупный экземпляр на базе Linux, а MySQL — в Amazon RDS для этого и переписать приложение преобразования на PHP? Поможет ли это?

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

Что еще я могу попробовать / советы, которые я могу использовать?

Спасибо, что дочитали до этого места!

--Обновление 01--

Прошло примерно 6 часов с тех пор, как я перезапустил свое приложение и внес следующие изменения:

  1. Количество операций чтения Mongo увеличено с 1000 до 10 000 записей за раз..skip (10K ).limit (10K)
  2. Удалены все индексы из целевой базы данных MySQL.
  3. Увеличен размер страницы Windows с 4 гигабайт до 8 гигабайт

. Моя память потребляется на 100%, но приложение все еще работает. (В прошлый раз он сдох через 52 минуты ). Mongo потребляет 6,8 гигабайта оперативной памяти, MySQL -450 мегабайт и приложение-конвертер -400 мегабайт (приблизительные значения ).

На данный момент обработано 11 миллионов записей -, но скорость снизилась до 370 записей в секунду с примерно 500 записей в секунду.

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

--Обновление 02--

Мы внесли некоторые изменения в код, чтобы использовать курсор Mongo и позволить ему автоматически увеличиваться, вместо того, чтобы делать.skip ().limt ()самостоятельно. Это значительно ускорило процесс, и мы делали 1250 записей в секунду вместо 300 с лишним ранее. Однако приложение начало потреблять слишком много памяти, у него закончилась оперативная память, произошел сбой, и его необходимо было перезапускать после каждых 2 М записей.

Мы использовали этот фрагмент кода:

var docs = db[collectionName].Find(query);
docs.SetBatchSize(numOfResultsToFetchAtATime);
foreach (var d in docs) {
  // do processing
}

Таким образом, это извлекает записи 'numOfResultsToFetchAtATime' за раз -, но затем автоматически переходит в цикл и извлекает следующий набор записей. Mongo позаботится об этой прогрессии с помощью курсора, и, следовательно, он намного быстрее.

Тем не менее, мы до сих пор не смогли успешно портировать это. Опубликую мой ответ с кодом, когда это произойдет правильно.

-- Обновление 03 :Успех--

Наконец-то мы воспользовались предложением @scarpacci сделать mongoexport. Помните, что очень важно, чтобы mongodb находился в Linux, а не в Windows.

Сначала мы попытались выполнить mongoexport из Windows в локальную базу данных MongoDB, и что бы мы ни пытались, это не помогло в разных местах для одной большой коллекции (13Gigs+)

Наконец, я восстановил БД на компьютере с Linux, и mongoexport заработал как часы.

Конвертера Json -> MySQL -нет, так что нам пришлось многое сделать. С небольшой настройкой мы смогли использовать наше предыдущее приложение и читать файлы и напрямую писать в MySQL. Это было быстро и относительно без ошибок.

У нас были некоторые проблемы с большими файлами, но разбиение файла размером 13 ГБ на файлы длиной 500 МБ помогло с этим, и мы смогли успешно перенести все данные в MySQL.

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

10
задан saurabhj 2 August 2012 в 17:57
поделиться