我可以使用MongoDb驱动程序从node.js调用rs.initiate()和rs.Add()吗?
在使用Docker和Kubernetes时,我正在寻求通过边框自动设置MongoDb副本集的过程。
上面的设置不是非常重要的 ,它归结为我需要能够调用mongo副本集命令(例如rs.initiate()
, rs.add('anotherserver')
, rs.conf()
, rs.reconfig()
等)从一个node.js应用程序。
注意:它不一定要来自节点应用程序,如果有人知道完成相同的事情的另一种方式,请分享您的想法。
更新:我能够得到这个工作,并已成为其他人使用的边车开源。
- https://github.com/leportlabs/mongo-k8s-sidecar
- https://registry.hub.docker.com/u/leportlabs/mongo-k8s-sidecar
如何实现副本集pipe理助手?
mongo
shell中的rs.*
副本集pipe理助手是可以从任何驱动程序发送的MongoDB命令的包装器。
通过引用MongoDB文档,您可以看到每个shell帮助程序包含哪些命令:
-
rs.initiate()
提供了replSetInitiate
数据库命令的包装。 -
rs.add()
提供了replSetReconfig
数据库命令和相应的mongo shell帮助程序rs.reconfig()
一些function的封装。 -
rs.conf()
包装了replSetGetConfig
数据库命令。
请注意, mongo
shell帮助程序可能会对mongo
进行一些额外的validation或操作,因为它们是通过交互式mongo
shell使用的。
您可以通过在shell中调用命令而不用尾括号来确认如何实现任何shell帮助程序,例如:
> rs.initiate function (c) { return db._adminCommand({ replSetInitiate: c }); }
从Node.js调用复制集数据库命令
等价的逻辑可以通过Node.js驱动API使用command()
:
// 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); }); });
注意:它不一定要来自节点应用程序,如果有人知道完成相同的事情的另一种方式,请分享您的想法。
您可以使用--eval
命令调用一个mongo
shell来运行shell帮助程序(tip:include --quiet
来禁止不必要的消息),而不是重新实现Node.js中的副本集帮助程序。
例如,从您的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); });