Проект по перемещению рельсов из MySQL в MongoDB - PullRequest
4 голосов
/ 17 марта 2011

У меня есть один проект в разработке. Я использую mysql и ActiveRecord. Похоже, этот проект хорош для того, чтобы начать использовать MongoDB (который я никогда не использовал) с адаптером Mongoid.

Как лучше всего перенести мой проект в Монго? Как я понимаю, я должен редактировать свои модели (не имеет большого значения), и это все?

Как я могу экспортировать мои данные из базы данных Mysql в Mongo? Я только что попробовал yaml_db, но это мне не помогает.

И второй вопрос: как мне защитить базу данных Mongo в случае сбоя системы (насколько я понимаю, Mongo потеряет данные, поскольку хранит их в оперативной памяти). Моя база данных составляет 10% / 90% записи / чтения.

Ответы [ 4 ]

7 голосов
/ 17 марта 2011

Я недавно сделал нечто подобное и подошел к нему как к 3-х шаговому процессу. Может быть, есть и другой способ Rails, но этот способ работал для меня и был безболезненным.

Я использовал итеративный подход и воспользовался тем, что MongoDB на самом деле является очень удобной системой хранения документов. Я начал с реляционной установки, используя реляционные ассоциации Mongoid (внизу страницы), синтаксис reference_many и referenced_in. Когда все заработало, я итеративно реорганизовал подход, более ориентированный на документы.

1. Дамп существующей базы данных прямо в MongoDB

Я использовал свои существующие модели для принудительного дампа таблиц и данных SQL в параллельные документы MongoDB. Я просто вбил в них все, что у меня было, не беспокоясь об именах или отношениях; строгое отображение таблиц в коллекции 1: 1.

Это был один раз для меня. Как только все здесь, шаги 2 и 3 берут эти данные и преобразуют их в структуру, которую я хотел. Я также мог бы изменить свои модели, поскольку мне больше не нужно было взаимодействовать с реляционной системой. Возможно, вы захотите создать своего рода копию существующих моделей на тот случай, если вам понадобится вернуться к этому шагу по любой причине.

2. Перенос данных

Для следующего шага я пошел с пользовательским приложением оболочки ruby. Опять же, возможно, есть лучший способ сделать это с помощью функций Rails, но я остановился на прямом подходе в стиле сценариев транзакций.

Я использовал необработанный драйвер MongoDB Ruby , прочитал базу данных, созданную на шаге 1, и преобразовал исходные коллекции в нужные мне формы. Я использовал отдельную базу данных для получателя из базы, созданной на шаге 1, потому что я итеративно модифицировал этот скрипт, чтобы он становился все более ориентированным на документ, так как я рефакторинг моей модели на шаге 3.

3. Рефакторинг модели по мере необходимости

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

Я повторял шаги 2 и 3, пока не произвел рефакторинг макетов модели и документа, пока не получил окончательный результат.

3 голосов
/ 17 марта 2011

Re: ваш второй вопрос

1.8.0 теперь поддерживает долговечность одного сервера за счет добавления журналирования (см. Документы здесь ).Это означает, что когда вы используете журналирование, Mongo будет выдавать пакетные коммиты каждые 100 мс (будет чаще в будущих версиях).Как только он попадает в журнал, если он падает, он может вернуться и восстановиться.Вы можете запросить, чтобы вызов в Mongo не возвращался до тех пор, пока он не будет зафиксирован безопасно (дорогой ценой небольшого снижения производительности), или если вы используете наборы реплик, вы можете указать, на сколько узлов должно быть реплицировано изменение перед возвратом - так что вы можете сделатьуверен, что он был реплицирован на большинство / все узлы.

1 голос
/ 17 марта 2011

Другие ответили на ваш второй вопрос, хотя миграция с MySQL на MongoDB зависит от того, как выглядят ваши данные.Не существует автоматического инструмента, который будет конвертировать базу данных.Вы, вероятно, захотите просто написать свой собственный скрипт преобразования.

Я бы предложил просто вывести одну модель в YAML, как вы пытались, преобразовать эту модель для использования Mongoid , а затем прочитатьYAML и воссоздайте объекты.

Если у вас есть сложные реляционные данные, MongoDB может и не быть тем, что вы ищете.Читайте о различиях между хранилищами значений ключей и реляционными базами данных.

Существует популярный вопрос, который охватывает только это: Когда использовать MongoDB или другие ориентированные на документы системы баз данных?

0 голосов
/ 17 марта 2011

Разница в том, что у вас есть возможность встраивания объекта.Используйте это в своих моделях.Также вы можете использовать Event Sourcing для защиты от сбоев.

...