问题描述
我希望在使用 Docker 和 Kubernetes 时自动化通过 sidecar 设置 MongoDb 副本集的过程.
上面的设置并不是很重要,归结起来就是我需要能够调用 mongo 副本集命令(例如 rs.initiate()
、rs.add('anotherserver')
、rs.conf()
、rs.reconfig()
等)来自一个节点.js 应用程序.
注意:它不一定来自节点应用程序,如果有人知道完成相同事情的另一种方法,请分享您的想法.
更新:我能够让它工作,并且已经将 sidecar 开源供其他人使用.
- https://github.com/leportlabs/mongo-k8s-sidecar
- https://registry.hub.docker.com/u/leportlabs/mongo-k8s-sidecar
副本集管理助手是如何实现的?
rs.*
副本集管理助手mongo
shell 中的 是 MongoDB 命令的包装器,您可以从任何驱动程序发送这些命令.
您可以通过参考 MongoDB 文档查看每个 shell 帮助程序包含哪些命令:
rs.initiate()
为replSetInitiate
数据库命令提供了一个包装器.rs.add()
为replSetReconfig
数据库命令和相应的 mongo shell helperrs.reconfig()
.rs.conf()
包装replSetGetConfig
数据库命令.
请注意,mongo
shell 助手可能会对配置进行一些额外的验证或操作,因为它们旨在通过交互式 mongo
shell 使用.
您可以通过在不带括号的情况下调用 shell 中的命令来确认任何 shell 助手是如何实现的,例如:
>rs.initiate函数 (c) { return db._adminCommand({ replSetInitiate: c });}
从 Node.js 调用副本集数据库命令
可以使用 command()
:
//rs.initiate() 的粗略等效var MongoClient = require('mongodb').MongoClient;MongoClient.connect('mongodb://localhost:27017/test', function(err, db) {//使用 admin 数据库执行命令var adminDb = db.admin();//默认副本集 confvar conf = {};adminDb.command({replSetInitiate: conf}, function(err, info) {控制台日志(信息);});});
<块引用>
注意:它不一定来自节点应用程序,如果有人知道完成相同事情的另一种方法,请分享您的想法.
与其在 Node.js 中重新实现副本集助手,您可以使用 --eval
命令调用 mongo
shell 来运行 shell 助手(提示:包括--quiet
以抑制不必要的消息).
例如,从您的 Node 应用程序调用:
var exec = require('child_process').exec;var rsAdmin = exec('mongo --eval "var res = rs.initiate(); printjson(res)" --quiet', function (error, stdout, stderr) {//输出在标准输出中控制台日志(标准输出);});
I'm looking to automate the process of setting up a MongoDb replica set via a sidecar when using Docker and Kubernetes.
The above setup isn't terribly important, what it boils down to is that I need to be able to call the mongo replica set commands (e.g. rs.initiate()
, rs.add('anotherserver')
, rs.conf()
, rs.reconfig()
, etc) from a node.js application.
Note: it doesn't have to be from a node application, if someone knows of another way of getting the same thing done, please share your thoughts.
UPDATE: I was able to get this working and have made the sidecar open source for others to use.
- https://github.com/leportlabs/mongo-k8s-sidecar
- https://registry.hub.docker.com/u/leportlabs/mongo-k8s-sidecar
How are the replica set admin helpers implemented?
The rs.*
replica set admin helpers in the mongo
shell are wrappers for MongoDB commands which you can send from any driver.
You can see which command(s) each shell helper wraps by referring to the MongoDB documentation:
rs.initiate()
provides a wrapper around thereplSetInitiate
database command.rs.add()
provides a wrapper around some of the functionality of thereplSetReconfig
database command and the corresponding mongo shell helperrs.reconfig()
.rs.conf()
wraps thereplSetGetConfig
database command.
Note that the mongo
shell helpers may do some extra validation or manipulation of configs as they are intended to be used via the interactive mongo
shell.
You can confirm how any of the shell helpers are implemented by invoking the command in the shell without trailing parentheses, eg:
> rs.initiate
function (c) { return db._adminCommand({ replSetInitiate: c }); }
Calling replica set database commands from Node.js
The equivalent logic can be implemented via the Node.js driver API using 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);
});
});
Note: it doesn't have to be from a node application, if someone knows of another way of getting the same thing done, please share your thoughts.
Rather than reimplementing the replica set helpers in Node.js, you could invoke a mongo
shell with the --eval
command to run the shell helper (tip: include --quiet
to suppress unnecessary messages).
For example, calling from your Node app:
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);
});
这篇关于我可以使用 MongoDb 驱动程序从 node.js 调用 rs.initiate() 和 rs.Add() 吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,WP2