文档章节

21.33 mongodb副本集介绍

脑洞老湿_
 脑洞老湿_
发布于 2017/10/19 20:16
字数 1666
阅读 14
收藏 0

21.33 mongodb副本集介绍

MongoDB副本集:

早期版本使用master-slave,一主一从和MySQL类似,但slave在此架构中为只读,当主库宕机后,从库不能自动切换为主
目前已经淘汰master-slave模式,改为副本集,这种模式下有一个主(primary),和多个从(secondary),只读。支持给它们设置权重,当主宕掉后,权重最高的从切换为主
在此架构中还可以建立一个仲裁(arbiter)的角色,它只负责裁决,而不存储数据
再此架构中读写数据都是在主上,要想实现负载均衡的目的需要手动指定读库的目标server

副本集架构图:
mark
mark
副本集primary宕机示意图: mark

21.34 mongodb副本集搭建

三台机器: 192.168.133.130(primary) 192.168.133.132(secondary) 192.168.133.133(secondary)
编辑三台机器的配置文件,更改或增加:
replication://把此行前面的#删除
##oplog大小
oplogSizeMB: 20//前面有两个空格
##复制集名称
replSetName: aminglinux//前面有两个空格
分别重启三台机器服务

 连接主,在主上运行命令mongo
>use admin
>config={_id:"aminglinux",members:[{_id:0,host:"192.168.133.130:27017"},{_id:1,host:"192.168.133.132:27017"},{_id:2,host:"192.168.133.133:27017"}]}
>rs.initiate(config)
 rs.status() //查看状态
 如果两个从上的状态为"stateStr" : "STARTUP", 则需要进行如下操作
> var config={_id:"aminglinux",members:[{_id:0,host:"192.168.133.130:27017"},{_id:1,host:"192.168.133.132:27017"},{_id:2,host:"192.168.133.133:27017"}]}
 >rs.reconfig(config)
 此时再次查看rs.status()会发现从的状态变为SECONDARY
> use admin
switched to db admin
> config={_id:"aminglinux",members:[{_id:0,host:"192.168.60.11:27017"},{_id:1,host:"192.168.60.12:27017"},{_id:2,host:"192.168.60.13:27017"}]}
{
	"_id" : "aminglinux",
	"members" : [
		{
			"_id" : 0,
			"host" : "192.168.60.11:27017"
		},
		{
			"_id" : 1,
			"host" : "192.168.60.12:27017"
		},
		{
			"_id" : 2,
			"host" : "192.168.60.13:27017"
		}
	]
}
> 
> rs.initiate(config)
{ "ok" : 1 }  ##是1 就对了;
aminglinux:PRIMARY> rs.status()    ##查看状态;
{
	"set" : "aminglinux",
	"date" : ISODate("2017-10-19T19:41:16.726Z"),
	"myState" : 1,
	"term" : NumberLong(1),
	"heartbeatIntervalMillis" : NumberLong(2000),
	"optimes" : {
		"lastCommittedOpTime" : {
			"ts" : Timestamp(1508442074, 1),
			"t" : NumberLong(1)
		},
		"appliedOpTime" : {
			"ts" : Timestamp(1508442074, 1),
			"t" : NumberLong(1)
		},
		"durableOpTime" : {
			"ts" : Timestamp(1508442074, 1),
			"t" : NumberLong(1)
		}
	},
	"members" : [
		{
			"_id" : 0,
			"name" : "192.168.60.11:27017",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",
			"uptime" : 2851,
			"optime" : {
				"ts" : Timestamp(1508442074, 1),
				"t" : NumberLong(1)
			},
			"optimeDate" : ISODate("2017-10-19T19:41:14Z"),
			"electionTime" : Timestamp(1508439306, 1),
			"electionDate" : ISODate("2017-10-19T18:55:06Z"),
			"configVersion" : 6,
			"self" : true
		},
		{
			"_id" : 2,
			"name" : "192.168.60.12:27017",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 75,
			"optime" : {
				"ts" : Timestamp(1508442074, 1),
				"t" : NumberLong(1)
			},
			"optimeDurable" : {
				"ts" : Timestamp(1508442074, 1),
				"t" : NumberLong(1)
			},
			"optimeDate" : ISODate("2017-10-19T19:41:14Z"),
			"optimeDurableDate" : ISODate("2017-10-19T19:41:14Z"),
			"lastHeartbeat" : ISODate("2017-10-19T19:41:16.633Z"),
			"lastHeartbeatRecv" : ISODate("2017-10-19T19:41:14.635Z"),
			"pingMs" : NumberLong(0),
			"syncingTo" : "192.168.60.11:27017",
			"configVersion" : 6
		},
		{
			"_id" : 3,
			"name" : "192.168.60.13:27017",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 0,
			"optime" : {
				"ts" : Timestamp(1508442074, 1),
				"t" : NumberLong(1)
			},
			"optimeDurable" : {
				"ts" : Timestamp(1508442074, 1),
				"t" : NumberLong(1)
			},
			"optimeDate" : ISODate("2017-10-19T19:41:14Z"),
			"optimeDurableDate" : ISODate("2017-10-19T19:41:14Z"),
			"lastHeartbeat" : ISODate("2017-10-19T19:41:16.630Z"),
			"lastHeartbeatRecv" : ISODate("2017-10-19T19:41:16.645Z"),
			"pingMs" : NumberLong(0),
			"syncingTo" : "192.168.60.11:27017",
			"configVersion" : 6
		}
	],
	"ok" : 1
}

21.35 mongodb副本集测试

MongoDB副本集测试:

 主上建库,建集合
 >use mydb
 >db.acc.insert({AccountID:1,UserName:"123",password:"123456"})
 >show dbs
 从上查看
 >show dbs   
 若出现错误Error: listDatabases failed:{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" },需要执行
 >rs.slaveok() 
aminglinux:PRIMARY> use mysql   ##在从上面创建mysql
switched to db mysql
aminglinux:PRIMARY> db.acc.insert({AccountID:1,UserName:"123",password:"123456"})  
##创建一个集合acc,并插入数据
WriteResult({ "nInserted" : 1 })
aminglinux:PRIMARY> show dbs;
db1    0.000GB
local  0.000GB
mysql  0.000GB
##接下来我们等了60.12secondary查看同步
aminglinux:SECONDARY> show dbs
2017-10-19T20:47:39.795+0800 E QUERY    [thread1] Error: listDatabases failed:{
	"ok" : 0,
	"errmsg" : "not master and slaveOk=false",  ##这里无法查看
	"code" : 13435,
	"codeName" : "NotMasterNoSlaveOk"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:62:1
shellHelper.show@src/mongo/shell/utils.js:769:19
shellHelper@src/mongo/shell/utils.js:659:15
@(shellhelp2):1:1
aminglinux:SECONDARY> rs.slaveOk()  ##执行这个,让slave可以查看;
aminglinux:SECONDARY> show dbs
db1    0.000GB
local  0.000GB
mysql  0.000GB

副本集更改权重模拟主宕机:

默认三台机器权重都为1,如果任何一个权重设置为比其他的高,则该台机器马上切换为primary角色,所以我们预设三台机器的权重分别为:130:3,132:2,133:1
 在主上执行
 cfg = rs.conf()
 cfg.members[0].priority = 3
 cfg.members[1].priority = 2
 cfg.members[2].priority = 1
 rs.reconfig(cfg)
 这样的话,第二个节点将会成为候选主节点。
 主上执行 iptables -I INPUT -p tcp --dport 27017 -j DROP
aminglinux:PRIMARY> rs.config()    ##查看配置,priority是其权重
{
	"_id" : "aminglinux",
	"version" : 6,
	"protocolVersion" : NumberLong(1),
	"members" : [
		{
			"_id" : 0,
			"host" : "192.168.60.11:27017",
			"arbiterOnly" : false,
			"buildIndexes" : true,
			"hidden" : false,
			"priority" : 1,
			"tags" : {
				
			},
			"slaveDelay" : NumberLong(0),
			"votes" : 1
		},
		{
			"_id" : 2,
			"host" : "192.168.60.12:27017",
			"arbiterOnly" : false,
			"buildIndexes" : true,
			"hidden" : false,
			"priority" : 1,
			"tags" : {
				
			},
			"slaveDelay" : NumberLong(0),
			"votes" : 1
		},
		{
			"_id" : 3,
			"host" : "192.168.60.13:27017",
			"arbiterOnly" : false,
			"buildIndexes" : true,
			"hidden" : false,
			"priority" : 1,
			"tags" : {
				
			},
			"slaveDelay" : NumberLong(0),
			"votes" : 1
		}
	],
	"settings" : {
		"chainingAllowed" : true,
		"heartbeatIntervalMillis" : 2000,
		"heartbeatTimeoutSecs" : 10,
		"electionTimeoutMillis" : 10000,
		"catchUpTimeoutMillis" : 60000,
		"getLastErrorModes" : {
			
		},
		"getLastErrorDefaults" : {
			"w" : 1,
			"wtimeout" : 0
		},
		"replicaSetId" : ObjectId("59e8f4ffee48611ad04ee633")
	}
}
[root@Dasoncheng ~]# iptables -I INPUT -p tcp --dport 27017 -j DROP
##在primary上面执行这条命令,drop掉27017端口的通信;在其他副本集查看状态
aminglinux:PRIMARY> rs.status()  ##60.12已经成为primary了;
{
	"set" : "aminglinux",
	"date" : ISODate("2017-10-19T13:04:55.021Z"),
	"myState" : 1,
	"term" : NumberLong(2),
	"heartbeatIntervalMillis" : NumberLong(2000),
	"optimes" : {
		"lastCommittedOpTime" : {
			"ts" : Timestamp(1508443618, 5),
			"t" : NumberLong(2)
		},
		"appliedOpTime" : {
			"ts" : Timestamp(1508443618, 5),
			"t" : NumberLong(2)
		},
		"durableOpTime" : {
			"ts" : Timestamp(1508443618, 5),
			"t" : NumberLong(2)
		}
	},
	"members" : [
		{
			"_id" : 0,
			"name" : "192.168.60.11:27017",
			"health" : 0,
			"state" : 8,
			"stateStr" : "(not reachable/healthy)",
			"uptime" : 0,
			"optime" : {
				"ts" : Timestamp(0, 0),
				"t" : NumberLong(-1)
			},
			"optimeDurable" : {
				"ts" : Timestamp(0, 0),
				"t" : NumberLong(-1)
			},
			"optimeDate" : ISODate("1970-01-01T00:00:00Z"),
			"optimeDurableDate" : ISODate("1970-01-01T00:00:00Z"),
			"lastHeartbeat" : ISODate("2017-10-19T13:04:50.892Z"),
			"lastHeartbeatRecv" : ISODate("2017-10-19T13:04:54.910Z"),
			"pingMs" : NumberLong(1),
			"lastHeartbeatMessage" : "Couldn't get a connection within the time limit",
			"configVersion" : -1
		},
		{
			"_id" : 2,
			"name" : "192.168.60.12:27017",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",
			"uptime" : 6295,
			"optime" : {
				"ts" : Timestamp(1508443618, 5),
				"t" : NumberLong(2)
			},
			"optimeDate" : ISODate("2017-10-19T20:06:58Z"),
			"electionTime" : Timestamp(1508443618, 2),
			"electionDate" : ISODate("2017-10-19T20:06:58Z"),
			"configVersion" : 6,
			"self" : true
		},
		{
			"_id" : 3,
			"name" : "192.168.60.13:27017",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 1591,
			"optime" : {
				"ts" : Timestamp(1508443618, 1),
				"t" : NumberLong(1)
			},
			"optimeDurable" : {
				"ts" : Timestamp(1508443618, 1),
				"t" : NumberLong(1)
			},
			"optimeDate" : ISODate("2017-10-19T20:06:58Z"),
			"optimeDurableDate" : ISODate("2017-10-19T20:06:58Z"),
			"lastHeartbeat" : ISODate("2017-10-19T13:04:53.973Z"),
			"lastHeartbeatRecv" : ISODate("2017-10-19T13:04:53.173Z"),
			"pingMs" : NumberLong(1),
			"syncingTo" : "192.168.60.11:27017",
			"configVersion" : 6
		}
	],
	"ok" : 1
}
##在这里呢,因为权重都为1 所有选择primary具有随机性;我们这里设置权重来指定
aminglinux:PRIMARY> cfg=rs.conf()    ##设置一个变量,下面为设置权重
aminglinux:PRIMARY> cfg.members[0].priority = 3
3
aminglinux:PRIMARY> cfg.members[1].priority = 2
2
aminglinux:PRIMARY> cfg.members[2].priority = 1
1
aminglinux:PRIMARY> rs.reconfig(cfg)    ##重新加载配置
{ "ok" : 1 }
2017-10-19T21:10:12.635+0800 I NETWORK  [thread1] trying reconnect to 127.0.0.1:27017 (127.0.0.1) failed
2017-10-19T21:10:12.638+0800 I NETWORK  [thread1] reconnect 127.0.0.1:27017 (127.0.0.1) ok
aminglinux:SECONDARY> rs.config()  ##我们可以看到,60.12已经变成secondary了;
{
	"_id" : "aminglinux",
	"version" : 7,
	"protocolVersion" : NumberLong(1),
	"members" : [
		{
			"_id" : 0,
			"host" : "192.168.60.11:27017",
			"arbiterOnly" : false,
			"buildIndexes" : true,
			"hidden" : false,
			"priority" : 3,
			"tags" : {
				
			},
			"slaveDelay" : NumberLong(0),
			"votes" : 1
		},
		{
			"_id" : 2,
			"host" : "192.168.60.12:27017",
			"arbiterOnly" : false,
			"buildIndexes" : true,
			"hidden" : false,
			"priority" : 2,
			"tags" : {
				
			},
			"slaveDelay" : NumberLong(0),
			"votes" : 1
		},
		{
			"_id" : 3,
			"host" : "192.168.60.13:27017",
			"arbiterOnly" : false,
			"buildIndexes" : true,
			"hidden" : false,
			"priority" : 1,
			"tags" : {
				
			},
			"slaveDelay" : NumberLong(0),
			"votes" : 1
		}
	],
	"settings" : {
		"chainingAllowed" : true,
		"heartbeatIntervalMillis" : 2000,
		"heartbeatTimeoutSecs" : 10,
		"electionTimeoutMillis" : 10000,
		"catchUpTimeoutMillis" : 60000,
		"getLastErrorModes" : {
			
		},
		"getLastErrorDefaults" : {
			"w" : 1,
			"wtimeout" : 0
		},
		"replicaSetId" : ObjectId("59e8f4ffee48611ad04ee633")
	}
}

小提示:这是副本集的操作; rs.slaveOk();--sencondary机器授权查询
rs.isMaster()--查看副本集状态
rs.status()--查看副本集状态
rs.remove("localhost:20001");--删除节点 在主服务器执行
rs.add("localhost:20001");--增加节点
rs.initiate(config_rs1);--Initializes a new replica set.
rs.reconfig(config_rs1);--Re-configures a replica set by applying a new replica set configuration object.
rs.的命令官网
http://docs.mongodb.org/manual/reference/method/js-replication/
Replica Set官网说明:
http://docs.mongodb.org/manual/core/replica-set-architecture-three-members/

© 著作权归作者所有

下一篇: scp命令
脑洞老湿_
粉丝 3
博文 152
码字总数 124412
作品 0
荆州
私信 提问
mongodb安装、连接,mongodb用户管理、创建集合、数据管理、备份恢复,副本集介绍、搭建、测试,分片介绍、搭建、测试,php的mongodb扩展、mongo扩展

21.26 mongodb介绍 21.27 mongodb安装 21.28 连接mongodb 21.29 mongodb用户管理 21.30 mongodb创建集合、数据管理 21.31 php的mongodb扩展 21.32 php的mongo扩展 21.33 mongodb副本集介绍 ...

tobej
07/16
76
0
83.mongodb副本集介绍 搭建 测试

21.33 mongodb副本集介绍 21.34 mongodb副本集搭建 21.35 mongodb副本集测试 21.33 mongodb副本集介绍 像mysql主宕机之后,我们可以让从成为新的主,但是需要手动去改的,甚至新的主从关系都...

axin-linux
04/01
7
0
【0716】NoSQL——mogodb

21.26 mongodb介绍 介绍: 官网www.mongodb.com, 当前最新版3.4 C++ 编写,基于分布式的,属于 NoSQL 的一种 在 NoSQL 中是最像关系型数据库的 MongoDB 将数据存储为一个文档,数据结构由键...

alexis7gunner
07/21
0
0
21.36 mongodb分片介绍

21.36 mongodb分片介绍 分片就是将数据库进行拆分,将大型集合分隔到不同服务器上。比如,本来100G的数据,可以分割成10份存储到10台服务器上,这样每台机器只有10G的数据。 通过一个mongos的...

脑洞老湿_
2017/10/20
24
0
mongodb(一)mongodb 副本集配置

---layout: blogistop: truetitle: "mongodb 副本集配置"date: 2018-08-29category: mongodbtags: mongodb --- 环境 下载解压 基本配置: 假定已经解压安装完成,现在所处的目录是 /usr/loc......

开心的哈士奇
2018/10/17
199
0

没有更多内容

加载失败,请刷新页面

加载更多

uni app 零基础小白到项目实战

$emit 子组件传给父组件$ref 父组件操作子组件 公用模板 uni-app全局变量的几种实现方法 const websiteUrl = 'http'const now = Date.now || function() { return new Date().getTime......

达达前端小酒馆
31分钟前
7
0
Tomcat是如何实现异步Servlet的

前言 通过我之前的Tomcat系列文章,相信看我博客的同学对Tomcat应该有一个比较清晰的了解了,在前几篇博客我们讨论了Tomcat在SpringBoot框架中是如何启动的,讨论了Tomcat的内部组件是如何设...

木木匠
55分钟前
29
0
mysql中间件分享(Mysql-prxoy,Atlas,DBProxy,Amoeba,cobar,TDDL)

hello 各位小伙伴大家好,我是小栈君,这期我们分享关于mysql中间件的研究,也就是数据层的读写分离和负载均衡,希望能够在实际的应用中能够帮助到各位小伙伴。 下期我们将继续分享go语言的系...

IT干货栈
今天
10
0
OSChina 周一乱弹 —— 人生,还真是到处是意外

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @这次装个文艺青年吧 :#今日歌曲推荐# 分享lil peep的单曲《High School》 《High School》- lil peep 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
今天
943
13
Spring使用ThreadPoolTaskExecutor自定义线程池及实现异步调用

多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实现异步调用多线程。 一、ThreadPoolTaskExecutor 本文采用 Executors 的工厂...

CREATE_17
今天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部