MongoDB Data Migration

  • MongoDB使用json和bson(binary json)格式存储信息。json使用起来非常方便,但是其并不支持bson里的所有数据类型。如果使用json备份数据就会有信息丢失。

  • 备份和恢复MongoDB数据库可能会消耗大量的CPU、内存和磁盘资源,最好是在非高峰期进行。

  • 需要考虑数据一致性的问题。

一致性(Consistency)

一致性是指事务使得系统从一个一致的状态转换到另一个一致状态。事务的一致性决定了一个系统设计和实现的复杂度。事务可以不同程度的一致性:强一致性:读操作可以立即读到提交的更新操作。弱一致性:提交的更新操作,不一定立即会被读操作读到,此种情况会存在一个不一致窗口,指的是读操作可以读到最新值的一段时间。最终一致性:是弱一致性的特例。事务更新一份数据,最终一致性保证在没有其他事务更新同样的值的话,最终所有的事务都会读到之前事务更新的最新值。如果没有错误发生,不一致窗口的大小依赖于:通信延迟,系统负载等。 其他一致性变体还有:单调一致性:如果一个进程已经读到一个值,那么后续不会读到更早的值。会话一致性:保证客户端和服务器交互的会话过程中,读操作可以读到更新操作后的最新值。

copydb & clone

Concurrency

  • copydb and clone do not produce point-in-time snapshots of the source database. Write traffic to the source or destination database during the copy process will result in divergent data sets.
  • copydb does not lock the destination server during its operation, so the copy will occasionally yield to allow other operations to complete.
  • clone does not snapshot the database. If any clients update the database you’re copying at any point during the clone operation, the resulting database may be inconsistent.

有数据一致性的问题。

mongodump & mongorestore

  • 以bson格式保存,恢复完成后必须重建索引。
  • 对于小型的数据库是简单高效的备份恢复工具,但是对于大型系统不是一个理想的选择。
  • mongodump会显著影响MongoDB的性能。如果数据库大小超过系统内存,有可能出现内存不足和页错误。
  • without –oplog, if there are write operations during the dump operation, the dump will not reflect a single moment in time. Changes made to the database during the update process can affect the output of the backup.
  • 使用oplog可以保证数据一致性

master & slave

slave把master的数据保存在了local.sources collection。迁移完成后需要进一步处理。
本质上也是利用了oplog, 可以保证数据一致性。

Replication Set

相当于增强的master slave模式,带有failover机制,多个节点选取一个为主节点,其他为次节点,主节点可读写,次节点只能读,当主节点挂掉会自动选举新的主节点,方便加入新的次节点,扩展数据库系统,本质上也是利用了oplog, 可以保证数据一致性。

总结

copydb & clone 有数据一致性问题不考虑使用。master & slave模式,slave后续还需要进一步操作,并且官方已不推荐部署此模式。Replication Set提供了很多高级特性,是官方现在推荐的部署模式。处理数据迁移时,master & slave和Replication Set比较接近,前者需要进一步处理,后者配置略麻烦,都相当于自动mongodump + oplogreplay,在数据不是很大的情况下,可以配置一个单节点的Replication Set配合mongodump with oplog比较合适。

oplog有一个非常重要的特性——幂等性(idempotent)。即对一个数据集合,使用oplog中记录的操作重放时,无论被重放多少次,其结果是一样的。举例来说,如果oplog中记录的是一个插入操作,并不会因为你重放了两次,数据库中就得到两条相同的记录。

还有一种方法是使用文件系统提供的快照功能,比如LVM。

Ref