MongoDB副本集中,如果要指定某些节点不能被选为primary节点,或者primary节点必须在某些节点中选出,该怎么配置呢?没错可以通过priority修改这些节点的优先级实现。
官网参考链接:https://docs.mongodb.com/manual/tutorial/force-member-to-be-primary/
(1)查看当前副本集角色
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)输出当前副本集配置
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)设置节点优先级
udb-h332hu4d:PRIMARY> cfg.members[0].priority = 2 # 修改当前primary节点优先级为2 2 udb-h332hu4d:PRIMARY> cfg.members[1].priority = 10 # 修改当前secondary节点优先级为10 10
(4)生效优先级配置
udb-h332hu4d:PRIMARY> rs.reconfig(cfg) { "ok" : 1 }
注:副本集中通过设置priority的值来决定优先权的大小。这个值的范围是0~100,值越大,优先权越高。默认的值是1,假设值是0,那么不能成为primay。
由于执行完上述调整优先级的操作后,primary节点与secondary节点发生了切换,所以之前登录的primary节点变成了secondary。那么如何在从节点执行相关查看命令呢?
(1)方法一:基于 session 的,退出来就失效了
udb-h332hu4d:SECONDARY> db.getMongo().setSlaveOk()
(2)方案二:临时生效
udb-h332hu4d:SECONDARY> rs.slaveOk()
(3)方案三:在用户家目录的隐藏文件 .mongorc.js 中加入如下行可永久生效,不必每次登陆都要设制一次
[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
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。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/128151.html
摘要:我们可以在添加节点时指定优先级,如下也可以为已有的节点设置优先级好了,中副本集的配置我们就先说到这里,小伙伴们有问题欢迎留言讨论。 上篇文章我们搭建了MongoDB副本集的环境,验证了数据已经可以成功的复制,本文我们就来看看MongoDB副本集的其他操作。 本文是MongoDB系列的第十六篇文章,了解前面的文章有助于更好的理解本文: 1.Linux上安装MongoDB 2.Mo...
摘要:另外,支持对复制集的节点进行灵活的配置,以适应多种场景的需求。节点只参与投票,不能被选为,并且不从同步数据。节点不能被选为主为,并且对不可见。根据各集合的设置,在上为相应集合创建。 复制集简介 Mongodb复制集由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点,Mongodb Driver(客户端)的所有数据都写入Primary,Second...
摘要:投票节点仅仅在选举中进行投票。如下图所示从节点无法升职为主节点的情况其他概念从节点还有集中特殊的设置情况,不同的设置有不同的需求优先级为设置,那么该结点将不能成为主节点,但是其数据仍是与主节点保持一致的而且应用程序也可以进行读操作。 介绍 replicattion set 多台服务器维护相同的数据副本,提高服务器的可用性,总结下来有以下好处: 数据备份与恢复 读写分离 MongoD...
摘要:大体分为成员的角色及转换成员状态及转换两部分。每个复制集成员在启动后,都先进入状态,然后加载成员的复制集配置,之后进入到状态。选举行为除了受和两个属性影响外,成员的状态也会影响选举,仅有和五种状态的成员允许进行投票操作。 此文已由作者温正湖授权网易云社区发布。 欢迎访问网易云社区,了解更多网易技术产品运营经验。 复制集(Replica Set)是MongoDB核心组件,相比早期版本采用...
摘要:节点介绍主节点在复制集中,主节点是唯一能够接收写请求的节点。在主节点进行写操作,并将这些操作记录到主节点的中。但是,旦当前的主节点不可用时,投票节点就会参与到新的主节点选举的投票中。仲裁节点使用最小的资源并且不要求硬件设备。 复制介绍 复制是在多台服务器之间同步数据的过程。复制集在大多数场合下已经代替Master-Slave复制。如果可能的话,尽可能使用复制集而不是主-从复制架构。 节...
阅读 1245·2024-02-01 10:43
阅读 352·2024-01-31 14:58
阅读 415·2024-01-31 14:54
阅读 793·2024-01-29 17:11
阅读 2181·2024-01-25 14:55
阅读 1461·2023-06-02 13:36
阅读 2054·2023-05-23 10:26
阅读 456·2023-05-23 10:25