前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >MongoDB副本集设置节点优先级priority

MongoDB副本集设置节点优先级priority

原创
作者头像
Power
发布2025-03-02 00:32:11
发布2025-03-02 00:32:11
5100
代码可运行
举报
运行总次数:0
代码可运行

一、背景介绍

MongoDB副本集中,如果要指定某些节点不能被选为primary节点,或者primary节点必须在某些节点中选出,该怎么配置呢?没错可以通过priority修改这些节点的优先级实现。

官网参考链接:https://docs.mongodb.com/manual/tutorial/force-member-to-be-primary/

二、操作演示

2.1 设置节点选主优先级

(1)查看当前副本集角色

代码语言:javascript
代码运行次数:0
复制
udb-h332hu4d:PRIMARY> rs.status()
{
	"set" : "udb-h332hu4d",
	"date" : ISODate("2021-11-26T15:23:23.316Z"),
	"myState" : 1,
	"members" : [
		{
			"_id" : 0,
			"name" : "192.168.0.224:27017",   
			"health" : 1,
			"state" : 2,
			"stateStr" : "PRIMARY",   # 主节点
			"uptime" : 854,
			"optime" : Timestamp(1637939967, 1),
			"optimeDate" : ISODate("2021-11-26T15:19:27Z"),
			"lastHeartbeat" : ISODate("2021-11-26T15:23:21.685Z"),
			"lastHeartbeatRecv" : ISODate("2021-11-26T15:23:22.114Z"),
			"pingMs" : 0,
			"configVersion" : 67491
		},
		{
			"_id" : 1,
			"name" : "192.168.0.225:27017",
			"health" : 1,
			"state" : 1,
			"stateStr" : "SECONDARY",   # 从节点
			"uptime" : 871,
			"optime" : Timestamp(1637939967, 1),
			"optimeDate" : ISODate("2021-11-26T15:19:27Z"),
			"electionTime" : Timestamp(1637939972, 1),
			"electionDate" : ISODate("2021-11-26T15:19:32Z"),
			"configVersion" : 67491,
			"self" : true
		},
		{
			"_id" : 2,
			"name" : "192.168.0.16:27017",
			"health" : 1,
			"state" : 7,
			"stateStr" : "ARBITER",     # 选举节点
			"uptime" : 834,
			"lastHeartbeat" : ISODate("2021-11-26T15:23:21.686Z"),
			"lastHeartbeatRecv" : ISODate("2021-11-26T15:23:21.675Z"),
			"pingMs" : 0,
			"configVersion" : 67491
		}
	],
	"ok" : 1
}

(2)输出当前副本集配置

代码语言:javascript
代码运行次数:0
复制
udb-h332hu4d:PRIMARY> cfg = rs.conf()
{
	"_id" : "udb-h332hu4d",
	"version" : 67490,
	"members" : [
		{
			"_id" : 0,
			"host" : "192.168.0.224:27017",
			"arbiterOnly" : false,
			"buildIndexes" : true,
			"hidden" : false,
			"priority" : 1,
			"tags" : {
				
			},
			"slaveDelay" : 0,
			"votes" : 1
		},
		{
			"_id" : 1,
			"host" : "192.168.0.225:27017",
			"arbiterOnly" : false,
			"buildIndexes" : true,
			"hidden" : false,
			"priority" : 1,
			"tags" : {
				
			},
			"slaveDelay" : 0,
			"votes" : 1
		},
		{
			"_id" : 2,
			"host" : "192.168.0.16:27017",
			"arbiterOnly" : true,      # 选举节点
			"buildIndexes" : true,
			"hidden" : false,
			"priority" : 1,
			"tags" : {
				
			},
			"slaveDelay" : 0,
			"votes" : 1
		}
	],
	"settings" : {
		"chainingAllowed" : true,
		"heartbeatTimeoutSecs" : 10,
		"getLastErrorModes" : {
			
		},
		"getLastErrorDefaults" : {
			"w" : 1,
			"wtimeout" : 0
		}
	}
}

(3)设置节点优先级

代码语言:javascript
代码运行次数:0
复制
udb-h332hu4d:PRIMARY> cfg.members[0].priority = 2     # 修改当前primary节点优先级为2
2
udb-h332hu4d:PRIMARY> cfg.members[1].priority = 10    # 修改当前secondary节点优先级为10
10

(4)生效优先级配置

代码语言:javascript
代码运行次数:0
复制
udb-h332hu4d:PRIMARY> rs.reconfig(cfg)
{ "ok" : 1 }

注:副本集中通过设置priority的值来决定优先权的大小。这个值的范围是0~100,值越大,优先权越高。默认的值是1,假设值是0,那么不能成为primay。

2.2 从节点执行命令报错

MongoDB副本集设置节点优先级priority(图1)
MongoDB副本集设置节点优先级priority(图1)

由于执行完上述调整优先级的操作后,primary节点与secondary节点发生了切换,所以之前登录的primary节点变成了secondary。那么如何在从节点执行相关查看命令呢?

(1)方法一:基于 session 的,退出来就失效了

代码语言:javascript
代码运行次数:0
复制
udb-h332hu4d:SECONDARY> db.getMongo().setSlaveOk()

(2)方案二:临时生效

代码语言:javascript
代码运行次数:0
复制
udb-h332hu4d:SECONDARY> rs.slaveOk()

(3)方案三:在用户家目录的隐藏文件 .mongorc.js 中加入如下行可永久生效,不必每次登陆都要设制一次

代码语言:javascript
代码运行次数:0
复制
[root@blogs-v2 ~]# echo "rs.slaveOk()" > .mongorc.js
[root@blogs-v2 ~]# mongo 192.168.0.224/admin -uroot -pUcloudcn
udb-h332hu4d:SECONDARY> show dbs
admin  0.000GB
local  0.000GB

2.3 验证修改后Primary与Secondary切换情况

代码语言:javascript
代码运行次数:0
复制
udb-h332hu4d:PRIMARY> rs.status()
{
	"set" : "udb-h332hu4d",
	"date" : ISODate("2021-11-26T15:23:23.316Z"),
	"myState" : 1,
	"members" : [
		{
			"_id" : 0,
			"name" : "192.168.0.224:27017",    # primary节点已经变成了secondary节点
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 854,
			"optime" : Timestamp(1637939967, 1),
			"optimeDate" : ISODate("2021-11-26T15:19:27Z"),
			"lastHeartbeat" : ISODate("2021-11-26T15:23:21.685Z"),
			"lastHeartbeatRecv" : ISODate("2021-11-26T15:23:22.114Z"),
			"pingMs" : 0,
			"configVersion" : 67491
		},
		{
			"_id" : 1,
			"name" : "192.168.0.225:27017",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",
			"uptime" : 871,
			"optime" : Timestamp(1637939967, 1),
			"optimeDate" : ISODate("2021-11-26T15:19:27Z"),
			"electionTime" : Timestamp(1637939972, 1),
			"electionDate" : ISODate("2021-11-26T15:19:32Z"),
			"configVersion" : 67491,
			"self" : true
		},
		{
			"_id" : 2,
			"name" : "192.168.0.16:27017",
			"health" : 1,
			"state" : 7,
			"stateStr" : "ARBITER",
			"uptime" : 834,
			"lastHeartbeat" : ISODate("2021-11-26T15:23:21.686Z"),
			"lastHeartbeatRecv" : ISODate("2021-11-26T15:23:21.675Z"),
			"pingMs" : 0,
			"configVersion" : 67491
		}
	],
	"ok" : 1
}

由此可见如果副本集中,如果有非primary节点优先级被提高到大于primary节点优先级后,很快就会从高优先级的节点中重新选举新主。如上述案例,secondary节点优先级调整为10,primary节点调整为2,很快优先级为10的secondary节点被选为了primary节点。另外,members[1] 这中括号里的数字是 rs.config() 命令打出来按顺序取的, members[1] 表示的顺数第二个,而不是里面的 id。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、背景介绍
  • 二、操作演示
    • 2.1 设置节点选主优先级
    • 2.2 从节点执行命令报错
    • 2.3 验证修改后Primary与Secondary切换情况
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档