复制集(replica Set)或者副本集是MongoDB的核心高可用特性之一,它基于主节点的oplog日志持续传送到辅助节点,并重放得以实现主从节点一致。再结合心跳机制,当感知到主节点不可访问或宕机的情形下,辅助节点通过选举机制来从剩余的辅助节点中推选一个新的主节点从而实现自动切换。对于一个已经存在的MongoDB Replica Set集群,可以对其进行节点的增加,删除,以及修改节点属性等等。本文即是围绕这些进行描述。

有关MongoDB复制集概念及其搭建,可以参考:MongoDB 复制集(Replica Set)

一、节点的移除

//当前的演示环境
repSetTest:PRIMARY> db.version()
3.2.11//主从节点
PRIMARY:   localhost:27001 SECONDARY: localhost:27000 SECONDARY: localhost:27002 repSetTest:PRIMARY> rs.remove("localhost:27000") { "ok" : 1 } //移除节点后的状态信息 repSetTest:PRIMARY> rs.status() { "set" : "repSetTest", "date" : ISODate("2016-08-30T05:48:13.010Z"), "myState" : 1, "members" : [ { "_id" : 1, "name" : "localhost:27001", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 526, "optime" : Timestamp(1472536085, 1), "optimeDate" : ISODate("2016-08-30T05:48:05Z"), "electionTime" : Timestamp(1472535890, 1), "electionDate" : ISODate("2016-08-30T05:44:50Z"), "configVersion" : 2, "self" : true }, { "_id" : 2, "name" : "localhost:27002", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 426, "optime" : Timestamp(1472536085, 1), "optimeDate" : ISODate("2016-08-30T05:48:05Z"), "lastHeartbeat" : ISODate("2016-08-30T05:48:11.805Z"), "lastHeartbeatRecv" : ISODate("2016-08-30T05:48:12.877Z"), "pingMs" : 0, "syncingTo" : "localhost:27001", "configVersion" : 2 } ], "ok" : 1 } //移除后查看配置文件 //此时版本version为2,只有2个节点 repSetTest:PRIMARY> rs.config() { "_id" : "repSetTest", "version" : 2, "members" : [ { "_id" : 1, "host" : "localhost:27001", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : 0, "votes" : 1 }, { "_id" : 2, "host" : "localhost:27002", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : 0, "votes" : 1 } ], "settings" : { "chainingAllowed" : true, "heartbeatTimeoutSecs" : 10, "getLastErrorModes" : { }, "getLastErrorDefaults" : { "w" : 1, "wtimeout" : 0 } } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98

二、节点的增加

repSetTest:PRIMARY> rs.add("localhost:27000")
{ "ok" : 1 } repSetTest:PRIMARY> rs.status() { "set" : "repSetTest", "date" : ISODate("2016-08-30T05:50:56.678Z"),6 "myState" : 1, "members" : [ { "_id" : 1, "name" : "localhost:27001", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 689, "optime" : Timestamp(1472536231, 1), "optimeDate" : ISODate("2016-08-30T05:50:31Z"), "electionTime" : Timestamp(1472535890, 1), "electionDate" : ISODate("2016-08-30T05:44:50Z"), "configVersion" : 3, "self" : true }, { "_id" : 2, "name" : "localhost:27002", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 590, "optime" : Timestamp(1472536231, 1), "optimeDate" : ISODate("2016-08-30T05:50:31Z"), "lastHeartbeat" : ISODate("2016-08-30T05:50:55.336Z"), "lastHeartbeatRecv" : ISODate("2016-08-30T05:50:55.063Z"), "pingMs" : 0, "configVersion" : 3 }, { "_id" : 3, "name" : "localhost:27000", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", //增加后的节点此时作为一个从节点 "uptime" : 23, "optime" : Timestamp(1472536231, 1), "optimeDate" : ISODate("2016-08-30T05:50:31Z"), "lastHeartbeat" : ISODate("2016-08-30T05:50:55.342Z"), "lastHeartbeatRecv" : ISODate("2016-08-30T05:50:55.341Z"), "pingMs" : 0, "configVersion" : 3 } ], "ok" : 1 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

三、启用Arbiter节点

repSetTest:PRIMARY> rs.remove("localhost:27000")
{ "ok" : 1 } repSetTest:PRIMARY> rs.add({host:"localhost:27000",arbiterOnly:true}) { "ok" : 1 } repSetTest:PRIMARY> rs.config() { "_id" : "repSetTest", "version" : 5, "members" : [ { "_id" : 1, "host" : "localhost:27001", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, // Author : Leshami "priority" : 1, // Blog : http://blog.csdn.net/leshami "tags" : { }, "slaveDelay" : 0, "votes" : 1 }, { "_id" : 2, "host" : "localhost:27002", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : 0, "votes" : 1 }, { "_id" : 3, "host" : "localhost:27000", "arbiterOnly" : true, //此处表明当前结点为仲裁节点 "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : 0, "votes" : 1 } ], "settings" : { "chainingAllowed" : true, "heartbeatTimeoutSecs" : 10, "getLastErrorModes" : { }, "getLastErrorDefaults" : { "w" : 1, "wtimeout" : 0 } } } 对于Arbiter也可以使用rs.addArb函数来添加 如:> 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; 2016-08-30T14:26:26.753+0800 E QUERY Error: listDatabases failed: { "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" } at Error (<anonymous>) 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; //执行该命令,看不到tempdb local 0.281GB test 0.031GB repSetTest:ARBITER> use tempdb switched to db tempdb repSetTest:ARBITER> db.users.count() //执行count,提示节点正在恢复 2016-08-30T14:30:04.571+0800 E QUERY Error: count failed: { "note" : "from execCommand", "ok" : 0, "errmsg" : "node is recovering" } at Error (<anonymous>) at DBQuery.count (src/mongo/shell/query.js:326:11) at DBCollection.count (src/mongo/shell/collection.js:1046:27) at (shell):1:10 at src/mongo/shell/query.js:326
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98

四、设定节点的优先级别(Priority)

    优先级用于确定一个倾向成为主节点的程度。取值范围为0-100Priority 0节点的选举优先级为0,不会被选举为Primary,这样的成员称为被动成员对于跨机房复制集的情形,如A,B机房,最好将『大多数』节点部署在首选机房,以确保能选择合适的Primary对于Priority为0节点的情况,通常作为一个standby,或由于硬件配置较差,设置为0以使用不可能成为主//如下示例,在新增节点的时候设定该节点的优先级别repSetTest:PRIMARY> rs.add({"_id":3,"host":"localhost:27000","priority":1.5})也可以通过下面的方式修改优先级别repSetTest:PRIMARY> var config=rs.config()repSetTest:PRIMARY> config.members[2].priority=22repSetTest:PRIMARY> rs.reconfig(config){ "ok" : 1 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

五、投票节点(Vote)

    投票节点不保存数据副本,不可能成为主节点Mongodb 3.0里,复制集成员最多50个,参与Primary选举投票的成员最多7个对于超出7个的其他成员(Vote0)的vote属性必须设置为0,即不参与投票
  • 1
  • 2
  • 3
  • 4

六、隐藏节点(Hidden)

    Hidden节点不能被选为主(Priority为0),并且对Driver不可见。因Hidden节点不会接受Driver的请求,可使用Hidden节点做一些数据备份、离线计算的任务,不会影响复制集的服务隐藏节点成员建议总是将其优先级设置为0(priority 0)由于对Driver不可见,因此不会作为read preference节点,隐藏节点可以作为投票节点在分片集群当中,mongos不会同隐藏节点交互> cfg = rs.conf()> cfg.members[2].priority = 0> cfg.members[2].hidden = true> rs.reconfig(cfg)查看设置为隐藏阶段后的属性repSetTest:SECONDARY> db.isMaster(){"hosts" : ["localhost:27000","localhost:27001"],"setName" : "repSetTest","setVersion" : 2,"ismaster" : false,"secondary" : true,"primary" : "localhost:27000","passive" : true,"hidden" : true,     //此处表明当前节点为隐藏节点"me" : "localhost:27002","maxBsonObjectSize" : 16777216,"maxMessageSizeBytes" : 48000000,"maxWriteBatchSize" : 1000,"localTime" : ISODate("2017-03-06T10:15:48.257Z"),"maxWireVersion" : 4,"minWireVersion" : 0,"ok" : 1}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

七、延迟节点(Delayed)

    延迟节点包含复制集的部分数据,是复制集数据的子集延迟节点上的数据通常落后于Primary一段时间(可配置,比如1个小时)。当人为错误或者无效的数据写入Primary时,可通过Delayed节点的数据进行回滚延迟节点的要求:优先级别为0(priority 0),避免参与primary选举应当设置为隐藏节点(以避免应用程序查询延迟节点)可以作为一个投票节点,设置 members[n].votes 值为1延迟节点注意事项:       延迟时间应当等于和大于维护窗口持续期应当小于oplog容纳数据的时间窗口 > 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(){"hosts" : ["localhost:27000","localhost:27001"],"setName" : "repSetTest","setVersion" : 3,"ismaster" : false,"secondary" : true,"primary" : "localhost:27000","passive" : true,"hidden" : true,"slaveDelay" : 3600,    //此处表面当前节点具有延迟属性,为延迟节点"me" : "localhost:27002","maxBsonObjectSize" : 16777216,"maxMessageSizeBytes" : 48000000,"maxWriteBatchSize" : 1000,"localTime" : ISODate("2017-03-06T10:19:57.148Z"),"maxWireVersion" : 4,"minWireVersion" : 0,"ok" : 1}

转载于:https://www.cnblogs.com/ExMan/p/9574107.html

MongoDB 复制集节点增加移除及节点属性配置相关推荐

  1. MongoDB 复制集的选举原理

    复制的原理         复制时基于啊哦做日志 oplog , 相当于 MySQL 中的二进制日志,只记录发生改变的记录.复制是将主节点的oplog 日志同步并应用到其他从节点的过程. 选举的原理 ...

  2. MongoDB复制集与Raft协议异同点分析

    此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 一.日志复制流程: a.raft leader节点在接收client请求后,先将请求写到日志中,再将日志通过 ...

  3. MongoDB 复制集那点事儿

    何以高可用? 我们以前用Mysql的时候,经常是一台服务器走天下,如果只是用于学习,是没有问题的,但是在生产环境中,这样的风险是很大的,如果服务器因为网络原因或者崩溃了,就会导致数据库一段时间了不可用 ...

  4. 配置MongoDB复制集

    什么是复制集? 复制集是额外的数据副本,是跨多个服务器同步数据的过程,复制集提供了冗余并增加了数据可用性,通过复制集可以对硬件故障和中断的服务进行恢复. 复制集的优势如下: 让数据更安全 高数据可用性 ...

  5. Raft与MongoDB复制集协议比较

    在一文搞懂raft算法一文中,从raft论文出发,详细介绍了raft的工作流程以及对特殊情况的处理.但算法.协议这种偏抽象的东西,仅仅看论文还是比较难以掌握的,需要看看在工业界的具体实现.本文关注Mo ...

  6. MongoDB 复制集的结构以及基本概念

    MongoDB 复制集的架构中,主要分为两部分:主节点(Primary)和从节点(Secondary). 主节点:在一个复制集中只有并且必须有一个主节点,主节点也是众多实例中唯一可以接收客户端写操作的 ...

  7. MongoDB复制集搭建主服务器模拟切换

    前言 Mongodb复制集由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点,Mongodb Driver(客户端)的所有数据都写入Primary,Second ...

  8. MongoDB 复制集 (一) 成员介绍

       一 MongoDB 复制集简介          MongoDB复制集机制主要分为两种:          Master-Slave    (主从复制)       这个已经不建议使用     ...

  9. MongoDB复制集原理和配置

    MongoDB高手课_MongoDB_NoSQL-极客时间极客时间推出的MongoDB高手课是帮助互联网从业者学习MongoDB.NoSQL的在线课程,极客时间是面向IT领域的知识服务产品,致力于帮助 ...

最新文章

  1. 用shell解决ddos攻击实例
  2. python——random.sample()的用法
  3. 搜索引擎优化(独立阐述)
  4. Google TPU 揭密——看TPU的架构框图,矩阵加乘、Pool等处理模块,CISC指令集,必然需要编译器...
  5. 【问链财经-区块链基础知识系列】 第三十一课 Fabric版本变迁之路从1.1-1.4
  6. Python之ORM
  7. [CodeJam 2019 Round 3] Rancake Pyramid(笛卡尔树)
  8. java工程mvn引用jar_maven 项目加载本地JAR
  9. Java-计算程序运行时间
  10. Markdown 调整图片位置与大小
  11. [转载] python隐式转换_Python | 数据类型的转换 显式转换 隐式转换
  12. AndroidLinux gdb用法
  13. url采集工具_爬山虎采集实战-站长之家网站排行榜
  14. 详解Android常用抓包工具的使用方法、技巧-学习笔记20220416
  15. 【error】 in ./api/axios.js Module parse failed: Unexpected token
  16. mysql怎么给时间段分组_mysql自定义时间段分组
  17. linux2.6内核驱动程序注册函数,于PCI9656设备驱动程序的Linux2.6内核研究
  18. 容器CICD实践:基于Helm实现应用交付自动回滚
  19. java程序设计 试题_在清算期间支付额不确定的年金是: A.返还年金 B.变额年金 C.即期年金 D.既定年金...
  20. 网络基础知识之IP与子网掩码和网络地址

热门文章

  1. sqlerror.java.1055,请问大佬,eclipse连接数据库出现这个错误怎么办
  2. 得天独厚的生态优势_云南农业得天独厚的三大优势
  3. csharp语言_电脑绝技教你22天学精Csharp之第五天
  4. 6加载光盘 virtualbox vm_6个轻量级Linux发行版(2019年)
  5. 1177: 按要求排序(指针专题)_数据结构 8 基础排序算法详解、快速排序的实现、了解分治法...
  6. Redis持久化与过期机制
  7. RestTemplate与Feign使用对比
  8. 联合主键三种实现方式
  9. centos查询是否有安装软件包
  10. ViewState使用兼谈序列化