注:本文基于MongoDB 4.2编写
1 连接到secondary
连接时不设置replicaset即可连接到指定的secondary节点,
[root@node1 ~]# mongo 'mongodb://admin:admin@192.168.0.181:27017/admin?authSource=admin'
MongoDB shell version v4.2.19
connecting to: mongodb://192.168.0.181:27017/admin?authSource=admin&compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("00868506-43b8-4ce3-bd6c-fa583b8f2ae6") }
MongoDB server version: 4.2.19
mdbA:SECONDARY>
2 从secondary读取数据
默认情况下,replica模式下的集群,所有的读写都是要经过primary节点,
mdbA:SECONDARY> show collections
2022-09-20T17:49:06.511-0700 E QUERY [js] uncaught exception: Error: listCollections failed: {
"operationTime" : Timestamp(1663721343, 1),
"ok" : 0,
"errmsg" : "not master and slaveOk=false",
"code" : 13435,
"codeName" : "NotPrimaryNoSecondaryOk",
...
}
} :
...
如果需要从secondary读取数据,需要额外设置,
mdbA:SECONDARY> db.getMongo().setSecondaryOk();
mdbA:SECONDARY> show collections
user
通过setSecondaryOk()设置仅对当前连接有效,如果连接断开重连后,配置就会失效。
但是在高版本的MongoDB上,setSecondaryOk()已经被废弃,需要使用setReadPref(‘secondary’)命令。
db.getMongo().setReadPref('secondary')
3 从secondary恢复集群
如果由于异常,我们的primary节点损坏,无法恢复,只剩secondary节点,这个时候还是可以恢复集群的,主要的就是要将secondary节点强制升主,这样之后的操作就简单了。
假设我们保留的secondary节点是第一个member,那我们就将配置的member重置为只包含该节点
mdbA:SECONDARY> cfg=rs.conf()
mdbA:SECONDARY> cfg.members=[cfg.members[0]]
[
{
"_id" : 2,
"host" : "192.168.0.181:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
}
]
然后强制重新应用配置,记得使用参数{force: true}
mdbA:SECONDARY> rs.reconfig(cfg, {force: true})
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1664289924, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1664289761, 1)
}
mdbA:PRIMARY>
由提示符可知,secondary节点已经被升级为primary节点,之后就可以正常使用rs.add()添加其他节点了。
参考文档:
- https://www.mongodb.com/docs/v4.2/reference/method/Mongo.setReadPref/#Mongo.setReadPref