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

问题描述 投票:0回答:4

如何通过命令行在副本集中的辅助 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 来设置它。

mongodb replicaset
4个回答
23
投票

创建一个文件

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

欲了解更多信息,请查看这里

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

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

所以,请优先使用

rs.secondaryOk()


6
投票

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

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

在 mongo.exe 中运行

rs.slaveOk
也会了解它是如何实现的,因为它只是一个辅助方法:

> 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 

更新 - 更加清晰一点

设置

slaveOk()
仅对执行它的控制台会话有效,因此您需要传入脚本或使用 exmaple
--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

1
投票

JFYI: 看起来

rs.slaveOk()
很快就会被弃用,MongoDB 建议使用
rs.secondaryOk()

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

警告:slaveOk() 已弃用,可能会在下一个主要版本中删除 发布。请改用 secondaryOk() 。

干杯


0
投票

rs.slaveOk()
rs.secondaryOk()
现已弃用(在
Mongodb6.0
及以上)。

所以,用这个代替:

db.getMongo().setReadPref('secondary')
© www.soinside.com 2019 - 2024. All rights reserved.