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

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

一、节点的移除

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

二、节点的增加

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

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

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

五、投票节点(Vote)

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

六、隐藏节点(Hidden)

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

  1. 延迟节点包含复制集的部分数据,是复制集数据的子集
  2. 延迟节点上的数据通常落后于Primary一段时间(可配置,比如1个小时)。
  3. 当人为错误或者无效的数据写入Primary时,可通过Delayed节点的数据进行回滚
  4. 延迟节点的要求:
  5. 优先级别为0(priority 0),避免参与primary选举
  6. 应当设置为隐藏节点(以避免应用程序查询延迟节点)
  7. 可以作为一个投票节点,设置 members[n].votes 值为1
  8. 延迟节点注意事项:
  9. 延迟时间应当等于和大于维护窗口持续期
  10. 应当小于oplog容纳数据的时间窗口
  11. > cfg = rs.conf()
  12. > cfg.members[2].priority = 0
  13. > cfg.members[2].hidden = true
  14. > cfg.members[2].slaveDelay = 3600
  15. > rs.reconfig(cfg)
  16. repSetTest:SECONDARY> db.isMaster()
  17. {
  18. "hosts" : [
  19. "localhost:27000",
  20. "localhost:27001"
  21. ],
  22. "setName" : "repSetTest",
  23. "setVersion" : 3,
  24. "ismaster" : false,
  25. "secondary" : true,
  26. "primary" : "localhost:27000",
  27. "passive" : true,
  28. "hidden" : true,
  29. "slaveDelay" : 3600, //此处表面当前节点具有延迟属性,为延迟节点
  30. "me" : "localhost:27002",
  31. "maxBsonObjectSize" : 16777216,
  32. "maxMessageSizeBytes" : 48000000,
  33. "maxWriteBatchSize" : 1000,
  34. "localTime" : ISODate("2017-03-06T10:19:57.148Z"),
  35. "maxWireVersion" : 4,
  36. "minWireVersion" : 0,
  37. "ok" : 1
  38. }

MongoDB 复制集节点增加移除及节点属性配置的更多相关文章

  1. MongoDB复制集之将现有的单节点服务器转换为复制集

    服务器情况:   现有的单节点 Primary     192.168.126.9:27017   新增的节点    Secondry  192.168.126.8:27017    仲裁节点     ...

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

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

  3. MongoDB复制集的工作原理介绍(二)

    复制集工作原理 1)数据复制原理 开启复制集后,主节点会在 local 库下生成一个集合叫 oplog.rs,这是一个有限集合,也就是大小是固定的.其中记录的是整个mongod实例一段时间内数据库的所 ...

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

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

  5. mongodb 复制集

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

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

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

  7. MongoDB复制集

    1.1 MongoDB复制集简介 一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合.复制集提供了数据冗余和高等级的可靠性,这是生产部署的基础. 1.1.1 复制集的目的 ...

  8. mongodb复制集开启安全认证

    之前我有一篇博客写的是“node.js通过权限验证连接MongoDB”,这篇博客上提到如何在启动文件中通过配置auth参数来开启权限认证,但这种认证方式只适合单机节点,当我们使用复制集时应该怎么开启权 ...

  9. 关于 MongoDB 复制集

    为什么要使用复制集 1.备份数据通过自带的 mongo_dump/mongo_restore 工具也可以实现备份,但是毕竟没有复制集的自动同步备份方便. 2.故障自动转移部署了复制集,当主节点挂了后, ...

随机推荐

  1. drag-html

    <!doctype html><html><head><meta charset="UTF-8" /><title>Ca ...

  2. eclipse下的ssh框架整合过程及測试

    最近在搭建Stuts2+hibernate+spring的框架,网上看的教程,大部分都是非常easy的步骤.没有比較具体的步骤以及每一个步骤完毕之后怎样检查是否配置成功.下面是笔者依据自己搭建的过程进 ...

  3. 【Nginx】事件驱动框架和异步处理

    Nginx对请求的处理是通过事件触发的,模块作为事件消费者,仅仅能被事件收集.分发器调用.这与传统的Webserver是不同的. 传统的Webserver下,一个请求由一个进程消费.请求在建立连接后将 ...

  4. mysql insert into 时报1062错误

    插入数据库时报1062错误,并没有错误详解 而网上的原因大多是主键重复,找了半天并没有解决办法 最后发现是表设置了联合唯一 ,插入的数据和之前的一样 >_< 太真实了

  5. mysql 清空或删除表数据后,控制表自增列值的方法

    http://blog.sina.com.cn/s/blog_68431a3b0100y04v.html 方法1: truncate table 你的表名 //这样不但将数据全部删除,而且重新定位自增 ...

  6. liunx安装redis和gcc

    首先去上下载redis,我现在用的版本是:redis-3.0.4.tar.gz 然后放到虚拟机里面解压,下面是三种解压命令: tar -zxvf file.tar.gz tar -jcvf file ...

  7. ElasticSearch 分页检索

    在ElasticSearch的多索引和多类别里说到我们在集群中有14个文档匹配我们的(空)搜索语句.单数仅仅有10个文档在hits数组中.我们怎样看到其它文档? 和SQL使用LIMITkeyword返 ...

  8. React系列-ES6

    ES6新特性概览 React系列代码(非本人) 5 Projects to Help You Learn React 本人对javascript并不擅长,只是在工作中会时常用到,而且以jQuery居多 ...

  9. Dash 使用

    花了 160 买了这个软件,至少看一遍它的 user guide,钱不能白花. https://kapeli.com/guide/guide.html 设置全局快捷键 Preference -> ...

  10. EasyDarwin开源流媒体服务器如何实现按需推送直播的

    --本文转自EasyDarwin开源团队成员邵帅的博客:http://blog.csdn.net/ss00_2012/article/details/51441753 我们使用EasyDarwin的推 ...