开发者学堂课程【MongoDB精讲课程(下):副本集合数据的读写操作】学习笔记与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/727/detail/12975
副本集合数据的读写操作
内容介绍:
一、副本集的搭建
二、主节点的写入和读取数据
三、从主节点的写入和读取数据
四、设置读操作权限
一、副本集的搭建
查看一下副本集当前的一个状态,输入 is.status,主要看 Mars 成员,这个成员现在看到的就不是一个了,一共是三个,看 ID 就知道了,一共是三个成员,这三个成员分别是一主一从一仲裁。即一开始初始化的时候主的27017,然后副本节点就是从节点是27018,然后还有一个仲裁节点是27019,
副本集都搭建完了,搭建完了之后,主要是来看一下数据的读写操作。搭建副本集也是为了完成咱们数据的一个存储,包括一些增删改查的操作。
二、主节点的写入和读取数据
目标:测试三个不同角色的节点的数据读写情况。
登录主节点27017,写入和读取数据:
还是用之前的小 demo,先创建一个库,直接在这里面插入一条数据:
[root@bobohost ~]#/usr/1oca1/mongodb/bin/mongo --host 180.76.159.126 --port 27017
myrs:PRIMARY> use articledb
switched to db articledb
myrs:PRIMARY> db
articledb
myrs:PRIMARY> db.comment.insert({"articleid":"100000","content":"
今天天气真好,阳光明媚","userid" :"1001","nickname" : "Rose","createdatetime":new Date()}) WriteResult({"nInserted":1 }) myrs:PRIMARY> db.comment.find)
{"id":objectid("5d4d2ae3068138b4570f53bf"),"articleid”:"100000","content”:"
今天天气真好。阳光明媚" "userid":"1001" "nickname":"Rose" "createdatetime" . Isodate("2019-08-09T08:12:19.427Z")}
三、从主节点的写入和读取数据
主要是测试一下副本集的一些数据操作。
主节点的读写没问题,副本节点,从节点用另一个窗口来演示,登录就看出来区别了,副本节点是 secondary,主节点是 primary。
登录从节点27018
[root@bobohost ~]#/usr/1oca1/mongodb/bin/mongo --host 180.76.159.126 --port 27018
myrs:SECONDARY> show dbs:
2019-09-10T10:56:51.953+0800 E QUERY[is]
Error: 1istDatabases failed:{
"operationTime":Timestamp(1568084204,1)."ok":0,
"errmsg" : "not master and slaveok=false""code": 13435,
"codeName": "NotMasterNoslaveok","$clusterTime" :{
"clusterTime":Timestamp(1568084204,1),"signature" :{
"hash":BinData(O,"AAAAAAAAAAAAAAAAAAAAAAAAAAA=")
"keyId" :NumberLong(0)
_getErrorwithcode@src/mongo/she11/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/she11/mongo.is:139:1 she11He1per.show@src/mongo/she11/utilsjs:882:13 she11He1per@src/mongo/she11/utilsjs:766:15@(she11he1p2):1:1
发现,不能读取集合的数据。当前从节点只是一个备份,不是奴隶节点,无法读取数据。
因为默认情况下,从节点是没有读写权限的,可以增加读的权限,但需要进行设置。
四、设置读操作权限
说明:
设置为奴隶节点,允许在从成员上运行读的操作
语法:
rs.slaveok()
#或
rs.slaveok(true)
提示:
该命令是 db.getMongo().sets1aveok() 的简化命令。
示例
在27018上设置作为奴隶节点权限,具备读权限:
rs:SECONDARY> rs.s1aveok()
此时,在执行查询命令,运行成功!
但仍然不允许插入。
myrs:SECONDARY> rs.sTaveok()
myrs:SECONDARY> show dbs;
admin 0.000GB
articledb 0.000GB
config 0.000GB
1oca1 0.000GB
myrs:SECONDARY> use articledb switched to db articledb
switched to db articledb
myrs:SECONDARY> show collections comment
myrs:SECONDARY> db.comment.find()
{"_id": objectid("5d7710c04cfd7eee2e3cdabe"),"articleid" : "100000","content”:"
今天天气真好,阳光明媚","userid”:"1001","nickname":"Rose","createdatetime" : IsoDate("2019-09-10T02:56:00.467Z")}
myrs:SECONDARY> db.comment.insert({"id":"1" "articleid":"100001" "content":"
我们不应该把清晨浪费在手机上,健康很重要,k一杯温水幸福你我他。""userid":"1002","nickname":"
相忘于江湖" "createdatetime":new Date("2019-08-
05T22:08:15.5222"),"7ikenum":NumberInt(1000),"state":"1"}) WriteCommandError({
"operationTime":Timestamp(1568084434,1)."ok":0,
"errmsg" : "not master","code": 101Ú7,
"codeName":"NotMaster""$clusterTime":{
"clusterTime":Timestamp(1568084434.1)"signature":{
"hash": BinData(O."AAAAAAAAAAAAAAAAAAAAAAAAAAA=")"keyId":NumberLong
现在可实现了读写分离,让主插入数据,让从来读取数据。
如果要取消作为奴隶节点的读权限:
myrs:SECONDARY> rs.slaveok(false) myrs:SECONDARY> db.comment.find() Error: error:{
"operationTime":Timestamp(1568084459,1),"ok": 0,
"errmsg" : "not master and slaveok=false"."code": 13435.
"codeName":"NotMasterNoslaveok",
"clusterTime" :{
"clusterTime":Timestamp(1568084459,1),"signature":{
"hash": BinData(O,"AAAAAAAAAAAAAAAAAAAAAAAAAAA=")"keyId": NumberLong(0)
数据它是会自动同步的,因为现在处在同一个副本集里面,这就是副本的操作,副本操作最主要的是需要设置一下 sliver ok,设置 level ok之后,就可以去查询刚刚在主节点里面插入的数据了,数据会自动的同步,当然现在是一条数据,如果数据很多的话可能需有一个延时。