关于ruby:将rails项目从MySQL迁移到MongoDB

Moving rails project from MySQL to MongoDB

我有一个正在开发的项目。 我使用mysql和ActiveRecord。 看起来这个项目是很好的开始使用Mongoid适配器的MongoDB(我从未使用过)。

将项目移至Mongo的最佳方法是什么? 据我所知,我应该编辑我的模型(不是很重要),这就是全部?

如何将我的数据从Mysql数据库导出到Mongo? 我刚试过yaml_db,但它对我没用。

第二个问题是如果我的系统崩溃,我应该如何保护我的Mongo数据库(据我所知,Mongo会将数据存储在RAM中)。 我的数据库写入/读取率为10%/ 90%。


我最近做了类似的事情,并将其作为一个三步过程。可能有更多的Rails方法可以做到这一点,但这种方式对我有用并且无痛苦。

我使用了一种迭代方法,并利用了MongoDB实际上是一个非常关系友好的文档存储系统这一事实。我开始使用关注设置使用Mongoid的关系关联(页面底部)语法references_many和referenced_in。一旦工作正常,我会反复重构为更加面向文档的方法。

1.将现有数据库直接转储到MongoDB

我使用我现有的模型来强制将SQL表和数据转储到并行的MongoDB文档中。我只是抨击我所拥有的一切而不用担心命名或关系;表格到集合的严格1:1映射。

这对我来说是一次性的过程。一切都在这里,步骤2和3获取这些数据并将其转换为我想要的结构。我也可以改变我的模型,因为我不再需要与关系系统进行交互。如果您因任何原因需要返回此步骤,您可能需要创建现有模型的某种副本。

2.迁移数据

下一步我使用自定义ruby shell应用程序。使用Rails功能可能有更好的方法来实现这一点,但我采用了直接的事务脚本样式方法。

我使用原始的MongoDB Ruby驱动程序,读取在步骤1中创建的数据库,并将源集合转换为我想要的形状。我从步骤1中创建的目标使用了一个单独的数据库作为目标,因为我在步骤3中重构了我的模型,因此我迭代地修改了这个脚本以变得越来越面向文档。

3.根据需要重构模型

我重构了我的模型以对照在步骤2中创建的数据库运行,使我的测试通过,然后返回到步骤2中的脚本并进行更改以使数据库更加面向文档。

我重复了第2步和第3步,直到我重构了我的模型和文档布局,直到我得到最终结果。


回复:你的第二个问题

1.8.0现在支持单服务器持久性,通过添加日记功能(请参阅此处的文档)。这表明,当您使用日记时,mongo将每100毫秒发出一次批量提交(在将来的版本中会更频繁)。一旦它在日志中,如果它崩溃了,它就可以恢复并恢复。您可以请求对Mongo的调用在安全提交之前不会返回(以轻微的性能损失为代价),或者如果使用副本集,您可以说明在返回之前应该将更改复制到多少个节点 - 这样您就可以确定它已被复制到大多数/所有节点。


其他人回答了你的第二个问题,从MySQL迁移到MongoDB取决于你的数据是什么样的。没有自动工具可以转换数据库。您可能只想编写自己的转换脚本。

我建议你只需要将一个模型转储到YAML中,将该模型转换为使用Mongoid,然后读取YAML并重新创建对象。

如果您有复杂的关系数据,那么MongoDB可能不是正在寻找的东西。阅读键值存储和关系数据库之间的差异。

有一个流行的问题涵盖了这一点:何时使用MongoDB或其他面向文档的数据库系统?


Diff是你有嵌入对象的功能。
在您的模型中使用它。您还可以使用Event Sourcing来防止崩溃。