MongoDB secondary节点

注:本文基于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()添加其他节点了。


参考文档:

  1. https://www.mongodb.com/docs/v4.2/reference/method/Mongo.setReadPref/#Mongo.setReadPref
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值