Мне было поручено перенести данные из базы данных MongoDB в базу данных MySQL. (Существуют веские причины для переноса -, поэтому необходимо выполнить ).
Коллекция MongoDB:
. Установка, которую мы пробовали:
. Мы извлекаем из памяти MongoDB 1K документов за раз, выполняем необходимую обработку, а затем сохраняем их в базу данных MySQL, выполняя пакетную запись по 500 за раз.
Проблема, с которой мы сталкиваемся, заключается в том, что после каждых 2,5 млн документов сервер перестает работать, и Mongo отвечает очень медленно -тайм-аут операции выборки данных приложения (Свободная оперативная память заканчивается к моменту обработки 1 млн документов)
Мы медленно продвигаемся вперед, убивая процесс mongod и запуская его снова каждые 2,5 миллиона записей, когда он падает -, но я уверен, что мы делаем что-то не так.
Вопрос:
Должен ли я переместить сервер Mongo в крупный экземпляр на базе Linux, а MySQL — в Amazon RDS для этого и переписать приложение преобразования на PHP? Поможет ли это?
Причина, по которой мы решили сохранить все это на одном устройстве, заключалась в проблеме с задержкой, связанной с наличием разных серверов на разных устройствах -, но я думаю, что это спорный вопрос, если устройство задыхается.
Что еще я могу попробовать / советы, которые я могу использовать?
Спасибо, что дочитали до этого места!
--Обновление 01--
Прошло примерно 6 часов с тех пор, как я перезапустил свое приложение и внес следующие изменения:
. Моя память потребляется на 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.
Большое спасибо всем за потраченное время, помогая нам. Надеюсь, что это объяснение поможет кому-то в будущем.