迁移mongodb群集 - 重新选择

时间:2018-02-19 14:20:46

标签: mongodb replicaset mongodb-replica-set

考虑到您必须将mongo群集从一个环境移动到另一个环境,并且在此过程中停机时间最短。

假设您拥有环境1(即AWS),以及以下mongo节点:

  • mongo_aws_1
  • mongo_aws_2
  • mongo_aws_3

您的应用程序配置为使用硬编码的IP地址和没有DNS名称与mongo_aws_1,2,3通信。

将群集移动到另一个环境(即Google Cloud)的最简单方法是什么,以便您拥有

  • mongo_gc_1
  • mongo_gc_2
  • mongo_gc_3 ?

我的迁移计划如下(这个假设是AWS和GC之间的连接)

  • 创建新的mongo节点(mongo_gc_1,2,3)并将它们添加到现有群集,优先级= 0(rs.add('host': 'mongo_gc_1:27017', 'priority': 0))。然后等到节点与replicaset同步(整个数据集小于15GB,所以可以等待)
  • 重新部署应用程序,使其与AWS和GC节点进行通信
  • 将GC节点的优先级更改为1,以便它们成为完全成员(rs.reconfig()
  • 删除旧的辅助人员'来自群集
  • 请求PRIMARY降级(这会强制其中一个GC节点成为主节点)
  • 删除旧的小学'来自群集
  • 重新部署应用程序,使其仅与GC节点通信

这应该有效,它引入的唯一停机时间是旧的主要步骤停止。

但是,它假定主要操作在整个操作期间不会发生变化。 另一方面,根据文件:

  

rs.reconfig()shell方法可以强制当前主节点降级,从而导致选举

同样,当你从replicaset中删除一个节点时:

  

此功能将短暂断开shell并强制重新连接,因为副本集重新协商哪个成员将是主要成员。因此,即使此命令成功,shell也会显示错误。

实现这个的正确方法应该是什么?我可以以某种方式避免不必要的重新选择吗?

1 个答案:

答案 0 :(得分:0)

当你{3}个3个GC节点时,你也可以add。隐藏成员不仅不能成为主要成员,而且客户端应用程序也看不到它们。

hidden提供了rs.add() db命令的一些功能和相应的shell帮助器replSetReconfig的包装器:

replSetReconfig:此命令可能会导致停机,因为设备重新协商了主要状态。因此,您应尝试仅在计划的维护期间重新配置。

通过这样做,您提出的方式可能导致3次单独选举:

rs.reconfig

通过将rs.add({host: "mongo_gc_1:27017", priority: 0 }) rs.add({host: "mongo_gc_2:27017", priority: 0 }) rs.add({host: "mongo_gc_3:27017", priority: 0 }) 和/或priority更改合并到一个hidden电话中,您可以将这种可能性降低到1:

reconfig