如何通过命令行在副本集中的辅助 mongodb 服务器中设置 rs.slaveOk()?

How to set rs.slaveOk() in secondary mongodb servers in replicaset via commandline?

如何通过命令行在副本集中的辅助 mongodb 服务器中设置 rs.slaveOk()?

我尝试了以下方法:

${MONGO_HOME}/bin/mongo --port ${MONGO_PORT2} --host ${MONGO_SECONDARY2} --eval "printjson(rs.slaveOk())"

${MONGO_HOME}/bin/mongo --port ${MONGO_PORT2} --host ${MONGO_SECONDARY2} --eval "printjson(rs.slaveOk(true))"

${MONGO_HOME}/bin/mongo --port ${MONGO_PORT2} --host ${MONGO_SECONDARY2} --eval "printjson(db.getSiblingDB('admin').getMongo().setSlaveOk())"

命令在输出日志中执行 undefined。 我正在尝试通过主服务器中的 shell 进行设置。

调用下面的方法应该可以正常工作,方法没有 return 类型,因此不会将任何内容打印回屏幕

${MONGO_HOME}/bin/mongo --port ${MONGO_PORT2} --host ${MONGO_SECONDARY2} --eval "rs.slaveOk()"

运行 rs.slaveOk 在 mongo.exe 中也将说明它是如何实现的,因为它只是一个辅助方法:

> rs.slaveOk
function (value) { return db.getMongo().setSlaveOk(value); }
>

还有 setSlaveOk 方法:

> db.getMongo().setSlaveOk
function ( value ) {
     if( value == undefined ) value = true;
     this.slaveOk = value;
}

您始终可以尝试查询辅助节点上的集合之一以确保该节点是可查询的:

> db.test.findOne()
null 

Update - bit more clarity

设置 slaveOk() 仅对执行它的控制台会话有效,因此您需要传入脚本或使用 --shell 参数保持与控制台的连接,例如

C:\mongodb\bin>mongo.exe --port 27012 --eval "rs.slaveOk()" --shell
MongoDB shell version: 3.0.5
connecting to: 127.0.0.1:27012/test
type "help" for help
rs1:SECONDARY> db.test.find()
{ "_id" : ObjectId("5630fdf2af4abd9f8ae7f79c"), "test" : true }
rs1:SECONDARY>

如果我们不传入 rs.slaveOk() 我们会得到以下响应:

C:\mongodb\bin>mongo.exe --port 27012 --shell
MongoDB shell version: 3.0.5
connecting to: 127.0.0.1:27012/test
type "help" for help
rs1:SECONDARY> db.test.find()
Error: error: { "$err" : "not master and slaveOk=false", "code" : 13435 }
rs1:SECONDARY> exit
bye

创建文件 /etc/mongorc.js 并在其中添加 rs.slaveOk()。每次 shell 启动时都会评估该文件。

查看更多信息here

从 MongoDB 版本 4.4 开始,您可能会收到如下警告:

WARNING: slaveOk() is deprecated and may be removed in the next major release. Please use secondaryOk() instead.

所以,请更喜欢使用 rs.secondaryOk()

仅供参考: 看起来 rs.slaveOk() 将很快被弃用,相反 MongoDB 建议使用 rs.secondaryOk()

以下是您将在 MongoShell 中看到的官方警告:

WARNING: slaveOk() is deprecated and may be removed in the next major release. Please use secondaryOk() instead.

干杯