复制集(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-100
Priority 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=2
2
repSetTest: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
}

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. ActiveX控件打包成Cab置于网页中自动下载安装

    [背景] http://www.360doc.com/content/13/1120/20/10159093_330853247.shtml 做过ActiveX控件的朋友都知道,要想把自己做的Acti ...

  2. 我的跟我学Ffmpeg 视频受众有哪些人

    经常有人问我如何学习音视频以及如何学习Ffmpeg,问我有没有比较好的书的书推荐.比较好的音视频以及FFmpeg方面的 书,我了解到的比较全面又能深入浅出的还真没有.很多朋友都推荐雷神的博客,雷神的博 ...

  3. WPF03(样式)

    说起样式,大家第一反应肯定是css,好的,先上一段代码. 1 html{border:0;} 2 ul,form{margin:0; padding:0} 3 body,div,th,td,li,dd ...

  4. Fakeapp2.2安装,使用简记

    1,硬件和操作系统,支持cuda的Nvidia显卡,8G及以上的内存,Windows10 x64(推荐,Windows7 x64亲测可行),可以使用gpu-z查看你的显卡详情 我的笔记本是双显卡(都是 ...

  5. 用Q-learning算法实现自动走迷宫机器人

    项目描述: 在该项目中,你将使用强化学习算法,实现一个自动走迷宫机器人. 如上图所示,智能机器人显示在右上角.在我们的迷宫中,有陷阱(红色炸弹)及终点(蓝色的目标点)两种情景.机器人要尽量避开陷阱.尽 ...

  6. ecshop购买记录(近期成交数量)显示历史记录

    默认只显示最近30天内的销售记录, 按照下面方法修改 就可以显示所有的了 打开 /includes/lib_insert.php 文件 找到下面代码,将之删除即可,一共有两处,都要删除. AND ' ...

  7. 模式识别之分类器knn---c语言实现带训练数据---反余弦匹配

    邻近算法   KNN算法的决策过程 k-Nearest Neighbor algorithm是K最邻近结点算法(k-Nearest Neighbor algorithm)的缩写形式,是电子信息分类器算 ...

  8. 左儿子右兄弟Trie UVA 11732 strcmp() Anyone?

    题目地址: option=com_onlinejudge&Itemid=8&category=117&page=show_problem&problem=2832&qu ...

  9. 3932: [CQOI2015]任务查询系统

    3932: [CQOI2015]任务查询系统 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2559  Solved: 819[Submit][Sta ...

  10. openstack之路:虚拟机的配置

    创建虚拟机有2种方法: 1 virt-manager. 优点:上手简单.缺点:实现自动化比较困难 2 virsh创建 优点:自动化配置简单.缺点:创建过程比较复杂 我们首先通过virt-manager ...