实验:搭建mongodb复制集(2)

5、副本节点读操作

在主节点上操作

myrs:PRIMARY> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
myrs:PRIMARY> use bbs
switched to db bbs
myrs:PRIMARY> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
myrs:PRIMARY> db.usr.insert({name:"wsq",age:20,hobby:"swimming"})
WriteResult({ "nInserted" : 1 })
myrs:PRIMARY> db.usr.find()
{ "_id" : ObjectId("60601c325cf518d2294f0817"), "name" : "wsq", "age" : 20, "hobby" : "swimming" }
myrs:PRIMARY> 

在从节点上操作

[root@localhost mongodb]# usr/local/mongodb/bin/mongo
bash: usr/local/mongodb/bin/mongo: 没有那个文件或目录
[root@localhost mongodb]# /usr/local/mongodb/bin/mongo
MongoDB shell version v4.0.23
connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("0c82f00c-763c-4081-9a38-1ffcfd58fbfe") }
MongoDB server version: 4.0.23
Server has startup warnings: 
2021-03-28T13:33:35.546+0800 I CONTROL  [initandlisten] 
2021-03-28T13:33:35.546+0800 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2021-03-28T13:33:35.546+0800 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2021-03-28T13:33:35.546+0800 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2021-03-28T13:33:35.546+0800 I CONTROL  [initandlisten] 
2021-03-28T13:33:35.567+0800 I CONTROL  [initandlisten] 
2021-03-28T13:33:35.567+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2021-03-28T13:33:35.567+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2021-03-28T13:33:35.567+0800 I CONTROL  [initandlisten] 
2021-03-28T13:33:35.567+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2021-03-28T13:33:35.567+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2021-03-28T13:33:35.567+0800 I CONTROL  [initandlisten] 
---
Enable MongoDB's free cloud-based monitoring service, which will then receive and display
metrics about your deployment (disk utilization, CPU, operation statistics, etc).

The monitoring data will be available on a MongoDB website with a unique URL accessible to you
and anyone you share the URL with. MongoDB may use this information to make product
improvements and to suggest MongoDB products and deployment options to you.

To enable free monitoring, run the following command: db.enableFreeMonitoring()
To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---

myrs:SECONDARY> show dbs
2021-03-28T14:08:06.298+0800 E QUERY    [js] Error: listDatabases failed:{
	"operationTime" : Timestamp(1616911682, 1),
	"ok" : 0,
	"errmsg" : "not master and slaveOk=false",
	"code" : 13435,
	"codeName" : "NotMasterNoSlaveOk",
	"$clusterTime" : {
		"clusterTime" : Timestamp(1616911682, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	}
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:151:1
shellHelper.show@src/mongo/shell/utils.js:882:13
shellHelper@src/mongo/shell/utils.js:766:15
@(shellhelp2):1:1
myrs:SECONDARY> 

 我们发现它报错了。也就是说

 默认情况下,从节点只是一个备份,不是奴隶节点,从节点是没有读写权限的,可以通过设置增加读权限。

连接副本节点,执行下面的命令设置为奴隶节点,允许读操作

rs.slaveOk()
或者
rs.slaveOk(true)
或者db.getMongo().setSlaveOk()

如果要取消奴隶节点的读权限,可以执行下面的命令

rs.slaveOk(false)

执行完毕后,发现可以成功查询数据,实现了读写分离。但是当我们要向其中插入数据时候会报错

myrs:SECONDARY> rs.slaveOk()
WARNING: slaveOk() is deprecated and may be removed in the next major release. Please use secondaryOk() instead.
myrs:SECONDARY> show dbs
admin   0.000GB
bbs     0.000GB
config  0.000GB
local   0.000GB
myrs:SECONDARY> use bbs
switched to db bbs
myrs:SECONDARY> show tables
usr
myrs:SECONDARY> db.usr.find()
{ "_id" : ObjectId("60601c325cf518d2294f0817"), "name" : "wsq", "age" : 20, "hobby" : "swimming" }
myrs:SECONDARY> 

此外,仲裁者节点不存放任何数据,即使执行了这些命令依然是没有数据的。不存放任何数据,仅仅是选举

myrs:ARBITER> show dbs
2021-03-28T14:29:01.083+0800 E QUERY    [js] Error: listDatabases failed:{
	"ok" : 0,
	"errmsg" : "not master and slaveOk=false",
	"code" : 13435,
	"codeName" : "NotMasterNoSlaveOk"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:151:1
shellHelper.show@src/mongo/shell/utils.js:882:13
shellHelper@src/mongo/shell/utils.js:766:15
@(shellhelp2):1:1
myrs:ARBITER> rs.slaveOk()
WARNING: slaveOk() is deprecated and may be removed in the next major release. Please use secondaryOk() instead.
myrs:ARBITER> show dbs
2021-03-28T14:30:04.517+0800 E QUERY    [js] Error: listDatabases failed:{
	"ok" : 0,
	"errmsg" : "node is not in primary or recovering state",
	"code" : 13436,
	"codeName" : "NotMasterOrSecondary"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:151:1
shellHelper.show@src/mongo/shell/utils.js:882:13
shellHelper@src/mongo/shell/utils.js:766:15
@(shellhelp2):1:1
myrs:ARBITER> 

6 选举机制

MongoDB副本集中会自动选举出主节点,触发选举的条件有以下几条

  • 主节点宕机
  • 主节点网络不可达(10秒没接收到心跳)
  • 人工通过rs.stepDown(秒数)降级,指定节点多少秒内不参与选举

选举的规则是根据票数决定,票数越高,且获得了“大多数”成员的投票支持则节点获胜。大多数指 节点数量/2 +1

若票数相同,且都获得了大多数成员的支持,哪个节点的数据新哪个节点获胜。


在我们上面搭建副本集时,使用到了 rs.conf() 命令查看配置信息,有一个 priority 配置,表示优先级。优先级会影响到投票的票数,当优先级是1000时,投票就会获得1000票数。优先级越大, 就越可能获得多数成员的投票数。

仲裁结点的优先级必须是0,不可以是别的值,设置为0是为了让结点不具备选举权,只拥有投票权。

修改优先级(了解)

7 关闭副本集

建议依次关闭仲裁节点、副本节点、主节点

rs.stepDown()
use admin
db.shutdownServer()

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小夏天禧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值