我可以使用MongoDb驱动程序从node.js调用rs.initiate()和rs.Add()吗?

时间:2015-05-04 23:26:10

标签: node.js mongodb docker kubernetes

我正在寻找使用Docker和Kubernetes时通过边车自动设置MongoDb副本集的过程。

以上设置并不是非常重要,归结为我需要能够调用mongo副本集命令(例如rs.initiate(),{{1}来自node.js应用程序的},rs.add('anotherserver')rs.conf()等)。

注意:它不必来自节点应用程序,如果有人知道完成同样事情的另一种方式,请分享您的想法。

更新:我能够让这项工作变得有效,并让其他人可以使用这种边线车开源。

1 个答案:

答案 0 :(得分:13)

如何实施副本集管理助手?

mongo shell中的rs.* replica set admin helpers是MongoDB命令的包装器,您可以从任何驱动程序发送它们。

您可以通过引用MongoDB文档来查看每个shell帮助程序包装的命令:

请注意,mongo shell帮助程序可以对配置进行一些额外的验证或操作,因为它们旨在通过交互式mongo shell使用。

您可以通过在shell中调用命令而不使用尾部括号来确认如何实现任何shell助手,例如:

> rs.initiate
function (c) { return db._adminCommand({ replSetInitiate: c }); }

从Node.js

调用副本集数据库命令

可以使用command()

通过Node.js驱动程序API实现等效逻辑
// Rough equivalent of rs.initiate()
var MongoClient = require('mongodb').MongoClient;

MongoClient.connect('mongodb://localhost:27017/test', function(err, db) {

  // Use the admin database for commands
  var adminDb = db.admin();

  // Default replica set conf
  var conf = {};

  adminDb.command({replSetInitiate: conf}, function(err, info) {
     console.log(info);
  });
});
  

注意:它不必来自节点应用程序,如果有人知道完成同样事情的另一种方式,请分享您的想法。

不是在Node.js中重新实现副本集助手,而是可以使用mongo命令调用--eval shell来运行shell助手(tip:include --quiet以禁止不必要的消息)。

例如,从您的Node应用程序调用:

var exec = require('child_process').exec;
var rsAdmin = exec('mongo --eval "var res = rs.initiate(); printjson(res)" --quiet', function (error, stdout, stderr) {
   // output is in stdout
   console.log(stdout);
});