整理mongodb文档:副本集二
个人博客,求推荐,本片内容较为乱
本文章主要讲在MongoDB的副本集中的一些注意点,主要是如何对seconadry进行数据操作,以及对更新数据的一些介绍
上一集讲了关于搭建一个副本集的,接着延续上级的操作,分别使用
.\mongosh mongodb://localhost:27017
.\mongosh mongodb://localhost:27018
来链接我们的Primary以及Secondary两个节点,当前情况下,27018为我们的Primary,而27017为Secondary
也可以直接使用rs.isMaster指令查看当前的节点是否为Primary
前面提及到了,在我们副本集的Secondary中,是无法做读写操作的,当我们操作的时候,会显示出下面的错误,而slaveok可以让我们操作MongoDB的Secondary。
而在4.2之后的mongdob中,我们需要使用rs.secondaryOk设置Secondary允许访问,而4.2之前则是使用slaveOk(),详情请看下方的截图
其中,提示提及到了read preference的,在关于读写分离介绍的时候再描述一次
接着,在Secondary中查询
db.collection27017.find()
显示的结果如下图所示,我们完成了在Secondary中实现读写的操作
按照我们的经验,副本集中Secondary的数据更新是根据local库中的oplog进行更新的,部分小伙伴会觉得我们再非副本集下的数据会在设置为副本集的时候同步上去,因此下方的代码就验证非副本集下的db会不会被同步。
上一次,我们在副本集的加持下,让两个Secondary能完美的拷贝到Primary的数据,现在解散我们的副本集,也就是分别启动两个服务并且使他们没有任何的关联,且在其中的一个库中加入一条数据,即
此时,再打开副本集,看看是否会将那条数据同步过去,且需要注意将27018设置为Primary(先启动27018,则27018会被设置为副本集的Primary)
很遗憾,并不会同步过去,而此时我们再往Primary中加入一条新的数据。
此时的Primary中添加的新数据,成功被拷贝到Secondary,因此我们可以得出结论。当一个副本集更新数据的时候,只会更新那些在副本集状态下的sql。
而oplog的信息,存放在local下的oplog中。
也可以使用如下的指令敲出来,当然需要先到local库中。
use local
db.oplog.rs.find()
上述场景中,我们模拟了一个当副本集断开时,往其中一个库插入数据,是否在副本集选举之后会将数据拷贝的情况,很遗憾并没有将数据更新到Secondary中,而接下来的场景,会测试在搭建副本集前,如果Primary库已经有数据的情况下,是否会将Primary库中的数据复制到Secondary中去。
首先,启动一个端口为27020的MongoDB服务,接着创建了一个测试的库,并且塞入一条数据。
接着,按照之前的操作顺序,创建一个副本集,并且设置27020为Primary,接着进入Primary看下设置副本集时,会不会清空MongoDB的服务,可以看到数据还在。
可以看到,在设置副本集之前的数据,在 Primary中是可以保存的。
而当Primary为 空,但Secondary又有数据的时候,初始化我们的副本集,会将Secondary清空还是保留数据呢?这点建议大家自己试试,加深理解。
rs.slaveOk已经是退出舞台的了,基本在新版本中不会使用到,需要注意下用secondaryOk代替。
一般来说,在Secondary实现读写,都是违背祖宗的规定,万不得已,千万不能违背老一辈呀,除非老板开口