无停机时间的迁移MongoDB实例



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

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

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

提前感谢。

所以首先你不应该把mongodb作为一个生产实例来运行。至少你应该有1个主服务器,1个辅助服务器和1个仲裁服务器。

其次,即使有一个副本集,在切换主服务器时也会有一些写停机时间,因为在选举过程中不可能进行写操作。来自文档:

重要的选举是一个独立运作的必要条件副本集;然而,选举需要时间来完成。而一个正在进行选举,副本集没有主副本,也不能接受写道。MongoDB避免选举,除非必要。

当您关闭主服务器以将其移动到新的服务器或虚拟实例,或升级数据库版本(如从2.4到2.6)时,将会发生选举。

您可以通过设置适当的选项来允许在次要服务器上运行查询,从而将现有副本集的停机时间降至最低。同样来自文档:

在故障转移期间维护可用性。使用primaryPreferred您希望应用程序在正常情况下从主服务器读取数据的情况下,但要允许从一个中的二级服务器读取过时的数据紧急情况。这为应用程序提供了"只读模式"在故障转移期间。

这至少处理了读操作。处理写操作的最佳方式是让应用程序重试失败的写操作,或者将它们排队。

关于您的单机,转换到副本集的文档程序经过了良好的测试,可以在最短的停机时间内非常快速地完成:

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

您不可能没有停机时间(新的mongod将在新的IP上运行,因此您至少需要连接到它)。但是您可以通过创建地理上分布的副本集来最小化停机时间。

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

使用给定的过程,但请注意:

  1. 不要将新位置的实例的优先级设置为0,以便当旧位置的旧实例退出时它们成为主实例。
  2. 您仍然需要在旧位置以副本设置模式重新启动mongod。
  3. 你需要3个实例,包括一个仲裁人在新位置,如果你想要它是副本集。
  4. 当完整的数据与新位置的实例同步时,退出旧位置的实例(一个接一个)。现在所有内容都将转到New Location,但问题是它是通过远程mongod进行定向的。
  5. 所以在旧位置停止mongod,在新位置开始一个新的mongod。将应用程序连接到新位置Mongod.

注意:到目前为止我还没有做过同样的事情。我曾经计划过,但后来我遇到了问题,它不是托管提供商。实际上你可能会遇到一些问题。

Replica Set是Mongodb数据库为实现高可用性和自动故障转移而提供的特性。

这是一种传统的主从配置,但有自动故障转移的能力。

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

基本上,在复制集中可以存在最少2个和最多12个mongod实例

在副本集中存在以下类型的服务器。总有一个服务器是主服务器。

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

John的回答是对的,顺便说一句,在你的情况下,你没有办法避免停机时间,你可以尽量缩短它。

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

最新更新