在没有停机时间的情况下迁移MongoDB实例

时间:2014-05-15 20:30:32

标签: mongodb database-migration

我们在生产环境中使用MongoDB,现在,由于当前服务器的一些问题,我将更改服务器并启动一个新的MongoDB实例。

我们有一个副本集和一个mongod实例(两个不同的MongoDB网络用于不同目的)。现在,首先我应该将单个mongod实例迁移,然后将整个副本集迁移到新服务器。

我想知道的是,如何在没有停机的情况下迁移这两个实例?我不想关闭服务器或停止写操作。

提前致谢。

4 个答案:

答案 0 :(得分:10)

首先,您永远不应该将mongodb作为单个实例进行生产。至少应该有1个主要,1个次要和1个仲裁。

其次,即使使用副本设置,当您切换原色时也总会有一些写入停机时间,因为在选举过程中无法进行写入。来自文档:

  

重要选举选举对于a的独立运作至关重要   副本集;但是,选举需要时间才能完成。而一个   选举正在进行中,副本集没有主要而不能   接受写作。除非必要,否则MongoDB会避免选举。

例如,当您将主要设备移至新服务器或虚拟实例或升级数据库版本(例如从2.4升级到2.6)时,将会发生选举。

通过设置适当的选项以允许查询针对辅助副本运行,您可以使用现有副本集将停机时间降至最低。再次来自文档:

  

在故障转移期间维护可用性。使用primaryPreferred if   您希望应用程序在正常情况下从主数据库中读取   情况,但允许来自二级的陈旧读取   紧急情况。这为您的应用程序提供了“只读模式”   在故障转移期间。

这至少可以处理读取。写入最好通过让您的应用程序重试失败写入或排队。

关于您的独立版本,转换为副本集的文档化程序经过了充分测试,可以非常快速地完成并且停机时间最短:

http://docs.mongodb.org/manual/tutorial/convert-standalone-to-replica-set/

答案 1 :(得分:2)

副本集是Mongodb数据库提供的功能,用于实现高可用性和自动故障转移。

它有点传统的主从配置,但具有自动故障转移功能。

它基本上是mongod实例的组/集群,它们相互通信,相互复制以提供高可用性并进行自动故障转移

基本上,在副本集中最少有2个,最多可以存在12个mongod实例

在副本集中存在以下类型的服务器。总而言之,一台服务器始终是主要服务器。

http://blog.ajduke.in/2013/05/31/setup-mongodb-replica-set-in-4-steps/

答案 2 :(得分:2)

你不能没有停机时间(一个新的mongod将在新IP上运行,所以你至少需要连接它)。但是,您可以通过制作地理位置分散的副本集来最大限度地减少停机时间。

请阅读 http://docs.mongodb.org/manual/tutorial/deploy-geographically-distributed-replica-set/

使用给定的流程但请注意:

  1. 不要在新位置设置实例的优先级0,以便在旧位置的旧位置降级时它们成为主要位置。
  2. 您仍需要在旧位置以副本设置模式重新启动mongod。
  3. 如果您愿意,您需要3个实例,包括新位置的仲裁服务器 副本集。
  4. 当完整数据与新位置的实例同步时,请逐步关闭旧位置的实例(逐个)。现在一切都将转到新位置,但问题是它是通过遥远的mongod引导的。
  5. 所以在Old Location停止mongod并在新位置开始新的。将您的应用程序连接到新位置Mongod。
  6. 注意:到目前为止我还没有做同样的事情。我曾经计划过一次,但后来我遇到了问题,而不是主机提供商。实际上你可能会遇到一些问题。

答案 3 :(得分:1)

John回答是对的,顺便说一下,你无法避免停机,你可以尽量缩短停机时间。

  1. 您可以准备新的副本集并保存其配置。
  2. 相同的单个mongod实例,准备一个具有特定配置的js文件(即:管理数据库上的东西)。
  3. 禁用生产服务器上的客户端连接。
  4. 将数据文件从旧服务器复制到新服务器(http://docs.mongodb.org/manual/core/backups/#backup-with-file-copies
  5. 应用您之前保存的副本集配置和配置。
  6. 完成
  7. 如果您有大量数据,可以使用不同的方法在副本集上添加隐藏的辅助成员,这样您就可以在停止生产服务器之前等待它是最新的。基本上对于副本集,您有很多方法来处理迁移,而单个实例则没有这样的功能。