如何通过命令行在副本集中的辅助 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 来设置它。
创建一个文件
/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()
调用下面的代码应该可以正常工作,该方法没有返回类型,因此不会将任何内容打印回屏幕
${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
JFYI: 看起来
rs.slaveOk()
很快就会被弃用,MongoDB 建议使用 rs.secondaryOk()
以下是您将在 MongoShell 中看到的官方警告:
警告:slaveOk() 已弃用,可能会在下一个主要版本中删除 发布。请改用 secondaryOk() 。
干杯
rs.slaveOk()
和 rs.secondaryOk()
现已弃用(在 Mongodb6.0
及以上)。
所以,用这个代替:
db.getMongo().setReadPref('secondary')