背景
本文是在上课期间由于需要学习mongodb的高可用特性,在参考Leshami前辈的文档后而编写,让自己以后的重温更容易。这一节内容是紧跟在MongoDB复制集的文档之后。
环境描述
CentOS release 6.9 (Final)
MongoDB version v3.0.6
PRIMARY: localhost:27001
SECONDARY: localhost:27000
SECONDARY: localhost:2700
移除节点
repSetTest:PRIMARY> rs.remove("localhost:27000")
{ "ok" : 1 }
repSetTest:PRIMARY> rs.status()
repSetTest:PRIMARY> rs.add("localhost:27000")
{ “ok” : 1 }
repSetTest:PRIMARY> rs.status()
repSetTest:PRIMARY> rs.remove("localhost:27000")
{ “ok” : 1 }
repSetTest:PRIMARY> rs.add({host:"localhost:27000",arbiterOnly:true})
{ “ok” : 1 }
repSetTest:PRIMARY> rs.config()
如:> rs.addArb("localhost:27000")
repSetTest:PRIMARY> use tempdb
switched to db tempdb
repSetTest:PRIMARY> db.users.insert({id:1,ename:"robin"})
WriteResult({ “nInserted” : 1 })
# mongo localhost:27000
MongoDB shell version: 3.0.12
connecting to: localhost:27000/test
repSetTest:ARBITER> show dbs;
2018-10-20T14:26:26.753+0800 E QUERY Error: listDatabases failed:
{ “note” : “from execCommand”, “ok” : 0, “errmsg” : “not master” }
at Error ()
at Mongo.getDBs (src/mongo/shell/mongo.js:47:15)
at shellHelper.show (src/mongo/shell/utils.js:630:33)
at shellHelper (src/mongo/shell/utils.js:524:36)
at (shellhelp2):1:1 at src/mongo/shell/mongo.js:47
repSetTest:ARBITER> rs.slaveOk(true)
repSetTest:ARBITER> show dbs; //show dbs命令不显示tempdb
local 0.281GB
test 0.031GB
repSetTest:PRIMARY> rs.add({"_id":3,"host":"localhost:27000","priority":1.5})
repSetTest:PRIMARY> var config=rs.config()
repSetTest:PRIMARY> config.members[2].priority=2
2
repSetTest:PRIMARY> rs.reconfig(config)
{ “ok” : 1 }
> cfg = rs.conf()
> cfg.members[2].priority = 0
> cfg.members[2].hidden = true
> rs.reconfig(cfg)
repSetTest:SECONDARY> db.isMaster()
> cfg = rs.conf()
> cfg.members[2].priority = 0
> cfg.members[2].hidden = true
> cfg.members[2].slaveDelay = 3600
> rs.reconfig(cfg)
repSetTest:SECONDARY> db.isMaster()
1.复制集(replica Set)或者副本集是MongoDB的核心高可用特性之一,它基于主节点的oplog日志持续传送到辅助节点,并重放得以实现主从节点一致。再结合心跳机制,当感知到主节点不可访问或宕机的情形下,辅助节点通过选举机制来从剩余的辅助节点中推选一个新的主节点从而实现自动切换。对于一个已经存在的MongoDB Replica Set集群,可以对其进行节点的增加,删除,以及修改节点属性等等。
2.Tip:Reference–rs.slaveOk()
3.设定节点的优先级别(Priority)
优先级用于确定一个倾向成为主节点的程度。取值范围为0-100
Priority 0节点的选举优先级为0,不会被选举为Primary,这样的成员称为被动成员
对于跨机房复制集的情形,如A,B机房,最好将大多数节点部署在首选机房,以确保能选择合适的Primary
对于Priority为0节点的情况,通常作为一个standby,或由于硬件配置较差,设置为0以使用不可能成为主
4.隐藏节点(Hidden)
Hidden节点不能被选为主(Priority为0),并且对Driver不可见。
因Hidden节点不会接受Driver的请求,可使用Hidden节点做一些数据备份、离线计算的任务,不会影响复制集的服务
隐藏节点成员建议总是将其优先级设置为0(priority 0)
由于对Driver不可见,因此不会作为read preference节点,隐藏节点可以作为投票节点
在分片集群当中,mongos不会同隐藏节点交互
5.延迟节点(Delayed)
延迟节点包含复制集的部分数据,是复制集数据的子集
延迟节点上的数据通常落后于Primary一段时间(可配置,比如1个小时)。
当人为错误或者无效的数据写入Primary时,可通过Delayed节点的数据进行回滚
延迟节点的要求:
优先级别为0(priority 0),避免参与primary选举
应当设置为隐藏节点(以避免应用程序查询延迟节点)
可以作为一个投票节点,设置 members[n].votes 值为1
延迟节点注意事项:
延迟时间应当等于和大于维护窗口持续期
应当小于oplog容纳数据的时间窗口 。
https://blog.csdn.net/robinson_0612/article/details/60581417