如何在AWS中编写NodeJS中的Mongo副本脚本

时间:2016-02-12 02:37:42

标签: node.js bash mongodb amazon-web-services

我有3台服务器都运行Mongo作为副本集,1个主服务器和2个副本服务器。

如果有人失败,我的自动缩放将终止实例并使用用户数据重新启动服务器以重新安装软件包。

我如何通知主要(新的或旧的)该实例已恢复生命,因为它将有一个新的私有IP地址(您无法将静态私有IP分配给自动缩放/启动配置)

我似乎无法在Mongoose或Mongo Node驱动程序的最新版本中找到一种方法来告诉主要有一个想要加入的新实例。

我可以通过访问Mongo shell并传入

来手动执行此操作
rs0:PRIMARY> rs.add("10.23.229.17");

它将被添加,数据将同步。但是如何通过节点驱动程序或Bash脚本执行rs.add?

更新

我发现此帖非常有用,Can I call rs.initiate() and rs.Add() from node.js using the MongoDb driver?

基本上,this是所有数据库命令的列表。虽然我找不到任何包装好的东西,但使用命令方法很容易做到:

var MongoClient = require('mongodb').MongoClient;
MongoClient.connect('mongodb://10.23.223.231', function(err, db) {
  if (err) {
    console.log('error', err);
  }
  else {
    var adminDb = db.admin();
    //use any command from https://goo.gl/0oh6H5
    adminDb.command({ replSetGetConfig: 1 }, function(err, info) {
     if (!eer) { console.log(info); }
    });
  } 
});

1 个答案:

答案 0 :(得分:0)

你想做的事情在很多方面都是错误的,我不知道从哪里开始。并坚持技术。

首先,如果您只是通过配置将新节点添加到副本集,则副本集中将有4个节点,只要所有其余三个服务器都在运行,就可以了。但现在,当一个失败时,你立即松开法定人数,副本集将恢复到次要状态,使得写入无法进行。

添加另一个节点,根据配置将数量增加到5个节点。适用与上述相同的规则。现在您添加了第六个节点,真正的麻烦就开始了:您无法再次达到法定人数。永远。除非您再删除不存在的机器。因此,在最糟糕的情况下,您将在机器之后生成机器 - 而不会达到法定人数。让这个发生在周五晚上,我相信你的公司将在星期一打破,除非是亚马逊本身或F500。

假设您每次编写脚本时都重新配置副本集。这可以触发主要人员下台,导致另一次选举和相应的服务中断(你记得,那个你试图减少的事情)。在最糟糕的情况下,甚至可能导致回滚,并且该机器当然会失败 - 将书面数据发送到Nirwana,因为您只是转储机器。

总而言之:这是一个非常糟糕的想法。

如果您需要多台计算机可能出现故障的安全性,请将另一个成员添加到副本集中,如果这样做有意义。根据我的经验,在AWS上,3个数据承载节点足够好。

如果您仍然真的想这样做,可能需要查看the documentation for replica set administrative commands,即replSetReconfig