MongoDB复制集相关方法使用(五)
这里我们把复制集中可用的方法都实验一遍,帮助我们更好地来理解复制集。提前说明这些方法的使用是基于Mongodb3.2版本来的,看这篇文章之前需要先看上一篇文章。
介绍一下复制集可用的相关方法
rs.help()
#查看(rs)复制集相关的方法.
rs.status()
#返回复制集的当前状态,使用的数据来源于副本集中其他成员发送的心跳包.
rs.initiate()
#简单初始化一个新的复制集.
rs.initiate(cfg)
#配置复制集,采用新的复制集配置对象(配置文件).
rs.conf()
#返回复制集配置文件.
rs.reconfig(cfg)
#通过重新应用复制集配置文件来为复制集更新新配置,这个操作只能在主节点执行,会短暂断开连接.
rs.add(hostportstr)
#添加一个成员到复制集,会短暂断开连接.
rs.add(membercfgobj)
#添加一个成员到配置文档,会短暂断开连接.
rs.addArb(hostportstr)
#添加一个ARBITER成员到复制集.
rs.stepDown([stepdownSecs, catchUpSecs])
#让当前的主节点变为从节点并触发选举,会短暂断开连接.
rs.syncFrom(hostportstr)
#设置复制集节点从哪个节点处同步数据,将会覆盖默认选取逻辑.
rs.freeze(secs)
#控制当前节点在一段时间内选举成为主节点.
rs.remove(hostportstr)
#从复制集中移除一个成员,会短暂断开连接.
rs.slaveOk()
#用来开启从节点是否有查询权限,值为true时表示开启查询(需要在从节点执行rs.slaveOk).
rs.printReplicationInfo()
#检查主节点oplog大小和时间范围.
rs.printSlaveReplicationInfo()
#检查从节点复制状态.
db.isMaster() & rs.isMaster()
#检查谁是主节点,如果isMaster为true则表示此节点为主节点,而应用程序就是靠isMaster来识别主从节点并且isMaster对隐藏节点不可见,而rs.status可以显示所有成员信息.
rs.stepDown([stepdownSecs, catchUpSecs])
让当前主节点成为从节点并触发选举,并可以在切换时给一个时间(秒),表示在这个时间内此节点不能被选为主节点。这里我的主节点是27017.
192.168.60.10:27017
|
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
|
ywnds:PRIMARY> rs.stepDown(600)
2016-02-04T12:08:20.694+0800 DBClientCursor::init call() failed
2016-02-04T12:08:20.694+0800 Error: error doing query: failed at src/mongo/shell/query.js:81
2016-02-04T12:08:20.697+0800 trying reconnect to 192.168.60.10:27017 (192.168.60.10) failed
2016-02-04T12:08:20.701+0800 reconnect 192.168.60.10:27017 (192.168.60.10) ok
ywnds:SECONDARY>
ywnds:SECONDARY> rs.isMaster()
{
"setName" : "ywnds",
"setVersion" : 1,
"ismaster" : false,
"secondary" : true,
"hosts" : [
"192.168.60.10:27017",
"192.168.60.10:27018"
],
"arbiters" : [
"192.168.60.10:27019"
],
"primary" : "192.168.60.10:27018",
"me" : "192.168.60.10:27017",
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2016-02-04T04:20:37.953Z"),
"maxWireVersion" : 2,
"minWireVersion" : 0,
"ok" : 1
}
|
你可以看到,当主节点执行延迟2秒进行主从切换操作后,主节点立马会变成从节点,标识符PRIMARY会变成SECONDARY,使用rs.isMaster看看状态信息,发现主从已经调换但投票节点还是投票节点,它不会有任何改变。
192.168.60.10:27018
看看从节点会话,标识符会立马从SECONDARY变成PRIMARY。
|
1
2
|
ywnds:SECONDARY>
ywnds:PRIMARY>
|
rs.reconfig(cfg)
通过重新应用复制集配置文件来为复制集更新新配置,这个操作只能在主节点执行。复制集的配置文档存在local.system.replset集合中。
|
1
2
3
|
ywnds:PRIMARY> config = db.system.replset.findOne()
ywnds:PRIMARY> rs.reconfig(config)
{ "ok" : 1 }
|
rs.remove(hostportstr)
从复制集中移除一个成员,会短暂断开连接,现在我们来移除ARBITER节点,目前复制集还有两个成员,一个主节点(192.168.60.10:27018)和一个从节点(192.168.60.10:27017).具体操作如下:
|
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
|
ywnds:PRIMARY> rs.remove("192.168.60.10:27019")
2016-02-15T04:08:01.615+0800 DBClientCursor::init call() failed
2016-02-15T04:08:01.615+0800 Error: error doing query: failed at src/mongo/shell/query.js:81
2016-02-15T04:08:01.619+0800 trying reconnect to 192.168.60.10:27018 (192.168.60.10) failed
2016-02-15T04:08:01.620+0800 reconnect 192.168.60.10:27018 (192.168.60.10) ok
ywnds:PRIMARY> rs.status()
{
"set" : "ywnds",
"date" : ISODate("2016-02-14T20:08:13Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" : "192.168.60.10:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 12,
"optime" : Timestamp(1455480481, 1),
"optimeDate" : ISODate("2016-02-14T20:08:01Z"),
"lastHeartbeat" : ISODate("2016-02-14T20:08:13Z"),
"lastHeartbeatRecv" : ISODate("2016-02-14T20:08:13Z"),
"pingMs" : 0,
"lastHeartbeatMessage" : "syncing to: 192.168.60.10:27018",
"syncingTo" : "192.168.60.10:27018"
},
{
"_id" : 1,
"name" : "192.168.60.10:27018",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 864061,
"optime" : Timestamp(1455480481, 1),
"optimeDate" : ISODate("2016-02-14T20:08:01Z"),
"electionTime" : Timestamp(1455480326, 1),
"electionDate" : ISODate("2016-02-14T20:05:26Z"),
"self" : true
}
],
"ok" : 1
}
|
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
ywnds:PRIMARY> rs.conf()
{
"_id" : "ywnds",
"version" : 4,
"members" : [
{
"_id" : 0,
"host" : "192.168.60.10:27017"
},
{
"_id" : 1,
"host" : "192.168.60.10:27018"
}
]
}
|
移除完192.168.60.10:27019节点后,可以看到复制集状态信息中已经没有这个节点的信息了,包括复制集配置文档中也没有此节点信息了。当复制集还剩下两个节点时,如果此时有一个节点挂掉的话,那么复制集容灾就不满足2/1原则(剩余节点没有大于总节点数),那么接下来剩余的一个节点就会是从节点故而整个复制集变得不可用。下面模拟27017故障然后看看27018节点的变化。
192.168.60.10.:27017
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
ywnds:SECONDARY> rs.isMaster()
{
"setName" : "ywnds",
"setVersion" : 4,
"ismaster" : false,
"secondary" : true,
"hosts" : [
"192.168.60.10:27017",
"192.168.60.10:27018"
],
"primary" : "192.168.60.10:27018",
"me" : "192.168.60.10:27017",
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2016-02-14T20:56:09.904Z"),
"maxWireVersion" : 2,
"minWireVersion" : 0,
"ok" : 1
}
[root@node1 ~]# cat /mongodb/pid/pid27017/mongod.pid
93840
[root@node1 ~]# kill -2 93840
|
192.168.60.10.:27018
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
ywnds:PRIMARY>
2016-02-15T04:16:16.354+0800 DBClientCursor::init call() failed
2016-02-15T04:16:16.382+0800 trying reconnect to 192.168.60.10:27018 (192.168.60.10) failed
2016-02-15T04:16:16.382+0800 reconnect 192.168.60.10:27018 (192.168.60.10) ok
ywnds:SECONDARY>
ywnds:SECONDARY> rs.isMaster()
{
"setName" : "ywnds",
"setVersion" : 4,
"ismaster" : false,
"secondary" : true,
"hosts" : [
"192.168.60.10:27018",
"192.168.60.10:27017"
],
"me" : "192.168.60.10:27018",
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2016-02-14T20:18:08.922Z"),
"maxWireVersion" : 2,
"minWireVersion" : 0,
"ok" : 1
}
|
rs.addArb(hostportstr)
添加一个ARBITER成员到复制集,只能在主节点上操作,所以我们要先把27017节点启动起来,重新选举一个主节点。
192.168.60.10:27017
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[root@node1 ~]# mongod -f /mongodb/conf/conf27017/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 99692
child process started successfully, parent exiting
[root@node1 ~]# mongo 192.168.60.10:27017
MongoDB shell version: 2.6.0
connecting to: 192.168.60.10:27017/test
ywnds:SECONDARY>
ywnds:SECONDARY>
ywnds:SECONDARY>
ywnds:PRIMARY>
ywnds:PRIMARY> rs.addArb("192.168.60.10:27019")
{ "ok" : 1 }
|
192.168.60.10:27019
|
1
2
3
4
5
6
7
8
9
10
11
12
|
[root@node1 ~]# mongo 192.168.60.10:27019
MongoDB shell version: 2.6.0
connecting to: 192.168.60.10:27019/test
ywnds:REMOVED>
ywnds:REMOVED>
ywnds:REMOVED>
ywnds:REMOVED>
ywnds:REMOVED>
ywnds:REMOVED>
ywnds:REMOVED>
ywnds:ARBITER>
ywnds:ARBITER>
|
rs.add(hostportstr)
添加一个成员到复制集,会短暂断开连接。下面创建一个新的节点(27010)并启动,然后加入到现在的复制集中。
192.168.60.10:27010
|
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
|
[root@node1 ~]# mkdir /mongodb/conf/conf27010
[root@node1 ~]# mkdir /mongodb/data/data27010
[root@node1 ~]# mkdir /mongodb/pid/pid27010
[root@node1 ~]# mkdir /mongodb/log/log27010
[root@node1 ~]# cp /mongodb/conf/conf27017/mongod.conf /mongodb/conf/conf27010/
[root@node1 ~]# vi /mongodb/conf/conf27010/mongod.conf
#/etc/mongod.conf
logpath = /mongodb/log/log27010/mongod.log
logappend = true
dbpath = /mongodb/data/data27010
port = 27010
bind_ip=192.168.60.10
fork = true
pidfilepath = /mongodb/pid/pid27010/mongod.pid
logRotate = rename
timeStampFormat = ctime
#Replica Set
oplogSize = 1024
replSet = ywnds
replIndexPrefetch = _id_only
[root@node1 ~]# mongod -f /mongodb/conf/conf27010/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 101491
child process started successfully, parent exiting
|
192.168.60.10:27017
|
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
|
ywnds:PRIMARY> rs.add("192.168.60.10:27010")
{ "ok" : 1 }
ywnds:PRIMARY> rs.conf()
{
"_id" : "ywnds",
"version" : 8,
"members" : [
{
"_id" : 0,
"host" : "192.168.60.10:27017"
},
{
"_id" : 1,
"host" : "192.168.60.10:27018"
},
{
"_id" : 2,
"host" : "192.168.60.10:27019",
"arbiterOnly" : true
},
{
"_id" : 3,
"host" : "192.168.60.10:27010"
}
]
}
|
192.168.60.10:27010
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
[root@node1 ~]# mongo 192.168.60.10:27010
MongoDB shell version: 2.6.0
connecting to: 192.168.60.10:27010/test
ywnds:SECONDARY>
ywnds:SECONDARY>
ywnds:SECONDARY> show dbs
admin (empty)
local 2.077GB
ywnds 0.078GB
ywnds:SECONDARY> use ywnds
switched to db ywnds
ywnds:SECONDARY> show tables
2016-02-15T06:16:18.362+0800 error: { "$err" : "not master and slaveOk=false", "code" : 13435 } at src/mongo/shell/query.js:131
ywnds:SECONDARY> rs.slaveOk()
ywnds:SECONDARY> show tables
system.indexes
ywnds
ywnds:SECONDARY> db.ywnds.find()
{ "_id" : ObjectId("56b174aed239dcb7b2dacc1f"), "name" : "ywnds", "age" : "20", "gender" : "B" }
|
rs.printReplicationInfo()
检查主节点oplog大小和时间范围.
|
1
2
3
4
5
6
|
ywnds:PRIMARY> rs.printReplicationInfo()
configured oplog size: 1958.92041015625MB
log length start to end: 1023492secs (284.3hrs)
oplog first event time: Wed Feb 03 2016 09:56:23 GMT+0800 (CST)
oplog last event time: Mon Feb 15 2016 06:14:35 GMT+0800 (CST)
now: Mon Feb 15 2016 06:18:57 GMT+0800 (CST)
|
rs.printSlaveReplicationInfo()
检查从节点复制状态.
|
1
2
3
4
5
6
7
|
ywnds:SECONDARY> rs.printSlaveReplicationInfo()
source: 192.168.60.10:27018
syncedTo: Mon Feb 15 2016 06:14:35 GMT+0800 (CST)
0 secs (0 hrs) behind the primary
source: 192.168.60.10:27010
syncedTo: Mon Feb 15 2016 06:14:35 GMT+0800 (CST)
0 secs (0 hrs) behind the primary
|
MongoDB复制集相关方法使用(五)的更多相关文章
- MongoDB复制集成员及状态转换
此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 复制集(Replica Set)是MongoDB核心组件,相比早期版本采用的主从(Master-Slave) ...
- MongoDB复制集与Raft协议异同点分析
此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 一.日志复制流程: a.raft leader节点在接收client请求后,先将请求写到日志中,再将日志通过 ...
- spring mongodb 复制集配置(实现读写分离)
注:mongodb当前版本是3.4.3 spring连接mongodb复制集的字符串格式: mongodb://[username:password@]host1[:port1][,host2[: ...
- MongoDB 复制集节点增加移除及节点属性配置
复制集(replica Set)或者副本集是MongoDB的核心高可用特性之一,它基于主节点的oplog日志持续传送到辅助节点,并重放得以实现主从节点一致.再结合心跳机制,当感知到主节点不可访问或宕机 ...
- MongoDB复制集概念架构浅析
一.复制集的作用 (1) 高可用 防止设备(服务器.网络)故障. 提供自动failover 功能. 技术来保证数 (2) 灾难恢复 当发生故障时,可以从其他节点恢复. (3) 功能隔离 用于分析.报表 ...
- MongoDB 复制集 (一) 成员介绍
一 MongoDB 复制集简介 MongoDB的复制机制主要分为两种: Master-Slave (主从复制) 这个已经不建议使用 ...
- mongodb 复制集
mongodb 复制集 复制集简介 Mongodb复制集由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点,Mongodb Driver(客户端)的所有数据都写 ...
- Raft与MongoDB复制集协议比较
在一文搞懂raft算法一文中,从raft论文出发,详细介绍了raft的工作流程以及对特殊情况的处理.但算法.协议这种偏抽象的东西,仅仅看论文还是比较难以掌握的,需要看看在工业界的具体实现.本文关注Mo ...
- MongoDB复制集
1.1 MongoDB复制集简介 一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合.复制集提供了数据冗余和高等级的可靠性,这是生产部署的基础. 1.1.1 复制集的目的 ...
随机推荐
- Data Binding Guide——google官方文档翻译(上)
android引入MVVM框架时间还不长,眼下还非常少有应用到app中的.但它是比較新的技术,使用它来搭建项目能省非常多代码,并且能使用代码架构比較清晰.本篇文章是我在学习MVVM时翻译的.篇幅比較长 ...
- com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database 'user'
1.错误描写叙述 2014-7-12 21:06:05 com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource getPoolManager 信息: ...
- Optimizer统计信息管理介绍
1. 前言 在我们的日常维护中受理一些一直以来运行得非常好的系统,突然有一天用户反馈没有做不论什么操作,系统的某个功能模块或者是某个报表曾经仅仅须要几秒.但如今须要几分钟或更长的时间都没有返回结 ...
- QC3.0快充技术详解
QC3.0 智能手机的电池容量愈来愈大,除了省电能力外,充电速度更成为用户愈来愈重视的特点.高通(Qualcomm)的 Quick Charge 快充技术已成为业界的典范之一,继 Quick Char ...
- 技术总结--android篇(三)--代码规格和编码规范
命名规则 变量名: 1)尽量要取有意义的名字,比方说:一个用户名的成员变量.应该写成username.而不要仅仅写个string: 2)假设是常量.既在编码过程中.这个值是不会改变的,应该写成大写的名 ...
- caffe学习--cifar10学习-ubuntu16.04-gtx650tiboost--1g--01
引用了下文的资料,在此感谢! http://www.cnblogs.com/alexcai/p/5468164.html http://blog.csdn.net/garfielder007/arti ...
- caffeModels--models-caffes-大全
caffe的伯克利主页:http://caffe.berkeleyvision.org/caffe的github主页:https://github.com/BVLC/caffe caffe的model ...
- C#读取自定义的config
今天说下C#读写自定义config文件的各种方法.由于这类文章已经很多,但是大多数人举例子都是默认的在app.confg或者web.config进行读写,而不是一般的XML文件,我主要写的是一般的Xm ...
- Web性能测试工具:Siege安装&使用简介
在Web性能测试工具中,siege是比较热门和常见的,它有安装简单,使用简单,测试报告详细的特点. 并且可以在文本中预定义一系列待测试url模拟,并可设定一定并发量下持续指定时间or测试进行测试. 比 ...
- WPF控件模板和数据模板 - 醉意人间
来自:http://www.th7.cn/Program/WPF/2011/12/21/51676.shtml ControlTemplate用于描述控件本身. 使用TemplateBinding来绑 ...