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 复制集的目的 ...
随机推荐
- Python实战之自己主动化评论
Python实战之自己主动化评论 玩csdn博客一个多月了,渐渐发现了一些有意思的事,常常会有人用相同的评论到处刷.不知道是为了加没什么用的积分,还是纯粹为了表达楼主好人.那么问题来了,这种无聊的事情 ...
- JavaScript包管理器综述
JavaScript包管理器综述 作者:chszs,未经博主同意不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs 对于JavaScript来说.包管理器 ...
- kubernetes之故障现场二,节点名称冲突
系列目录 问题描述:测试环境由于异常断电导致服务器重启一后,有一个节点的状态一直是NotReady.通过journalctl -f -u kubelet没有错误日志输出.通过tail /var/log ...
- Linux多线程编程的条件变量
在stackoverflow上看到一关于多线程条件变量的问题,题主问道:什么时候会用到条件变量,mutex还不够吗?有个叫slowjelj的人做了很好的回答,我再看这个哥们其他话题的一些回答,感觉水平 ...
- Apcahe Shiro学习笔记(二):通过JDBC进行权限控制
一.概述: 官方对Realm(领域)的描述:https://www.infoq.com/articles/apache-shiro 其功能本质上是一个安全特定的DAO,用于链接数据持久层(任何形式的都 ...
- 话说Session
Session这个概念,对于搞软件的来说,再熟悉不过了.就拿我来说,Hibernate, Shiro, Spring, JSP, Web Server等等,全都涉及到Session. 不怕笑话,一直都 ...
- 阿里云 访问控制RAM
https://help.aliyun.com/product/28625.html 为用户分配最小权限 别名主要用于 RAM 用户登录以及成功登录后的显示名. 强烈建议您给主账号绑定多因素认证. 设 ...
- iOS9新特性之新添加的关键字
iOS9 新出的关键字:用来修饰属性,或者方法的参数,返回值 好处:1.迎合swift 2.提高我们开发人员开发规范,减少程序员之间的交流 注意:iOS9新出的的关键字nonnull,nullable ...
- Lombok引入简化Java代码
转载 http://t.cn/RS0UdrX Lombok简介 如Github上项目介绍所言,Lombok项目通过添加“处理程序”,使java成为一种更为简单的语言.作为一个Old Java Deve ...
- Communicating sequential processes
the-way-to-go_ZH_CN/01.2.md at master · Unknwon/the-way-to-go_ZH_CN https://github.com/Unknwon/the-w ...