MongodDB学习笔记(二)(复制)
mongoDB的复制非常容易配置,其实现有两种方式,一种是主从复制,一种是复制集,前者的好处是容易配置,但是如果主服务器宕掉了,整个系统就崩溃了,后者的好处是如果主服务器宕掉了,其他服务器会通过投票选择一个主服务器,所谓的主从服务器的区别在于,主服务器是可以写入的,从服务器默认连查询都不支持,除非设置了slaveOK。
1、主从复制
1)环境
| 角色 | 数据位置 | 端口 |
| 主服务器 | d:\mongodb_data\db1 | 27017 |
| 从服务器 | d:\mongodb_data\db2 | 27018 |
| 从服务器 | d:\mongodb_data\db3 | 27019 |
2)启动(将对应数据位置的目录清空)
D:\mongodb_data>mongod --dbpath d:\mongodb_data\db1 --port=27017 --master
D:\mongodb_data>mongod --dbpath=d:\mongodb_data\db2 --port 27018 --slave --source 192.168.1.223:27017
这里的参数很容易理解,--master 代表主服务器, --slave 代表从服务器, --source 代表复制来源
3)主服务器
D:\mongodb_data>mongo 192.168.1.223:27017
MongoDB shell version: 3.0.6
connecting to: 192.168.1.223:27017/test
> for(var i=0;i<10000;i++){
... db.students.insert({name:'ss'+i,code:'a'+i,id:i});
... }
WriteResult({ "nInserted" : 1 })
> db.students.count()
10000
4)从服务器
D:\mongodb_data>mongo 192.168.1.223:27018
MongoDB shell version: 3.0.6
connecting to: 192.168.1.223:27018/test
> db.students.count()
10000
可以看出复制成功了
5)增加一个从服务器,但不指定来源
D:\mongodb_data>mongod --dbpath d:\mongodb_data\db3 --port 27019 --slave
可以在日志中看出提示没有指定复制来源
D:\mongodb_data>mongo 192.168.1.223:27019
MongoDB shell version: 3.0.6
connecting to: 192.168.1.223:27019/test
> db.students.count()
0
> use local
switched to db local
> db.sources.insert({host:'192.168.1.223:27017'});
WriteResult({ "nInserted" : 1 })
> use test
switched to db test
> db.students.count()
10000
可以看出加入复制源之后,很快就同步过来了
这种复制方式非常简单,但是不够健壮,如果关掉主服务器,从服务器会收到如下信息
2015-09-30T17:13:39.073+0800 W NETWORK [replslave] Failed to connect to 192.168.1.223:27017, reason: errno:10061 由于目标计算机积极拒绝,无法连接。
2015-09-30T17:13:39.074+0800 I REPL [replslave] repl: couldn't connect to server 192.168.1.223:27017 (192.168.1.223), connection attempt failed
2、复制集
1)环境
| 角色 | 数据位置 | 端口 |
| 服务器1 | d:\mongodb_data\db1 | 27017 |
| 服务器2 | d:\mongodb_data\db2 | 27018 |
| 服务器3 | d:\mongodb_data\db3 | 27019 |
| 仲裁服务器 | d:\mongodb_data\db4 | 27020 |
2)启动服务器(复制集的名称为testset,清除db1,db2,db3目录)
D:\mongodb_data>mongod --dbpath db1 --port 27017 --replSet testset
D:\mongodb_data>mongod --dbpath db2 --port 27018 --replSet testset
D:\mongodb_data>mongod --dbpath db3 --port 27019 --replSet testset
3)连接和配置
D:\mongodb_data>mongo 192.168.1.223:27017
MongoDB shell version: 3.0.6
connecting to: 192.168.1.223:27017/test
> rs.initiate()
{
"info2" : "no configuration explicitly specified -- making one",
"me" : "DESKTOP-3B9N9SB:27017",
"ok" : 1
}
testset:SECONDARY> rs.status()
{
"set" : "testset",
"date" : ISODate("2015-09-30T09:25:42.449Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" : "DESKTOP-3B9N9SB:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 162,
"optime" : Timestamp(1443605129, 1),
"optimeDate" : ISODate("2015-09-30T09:25:29Z"),
"electionTime" : Timestamp(1443605129, 2),
"electionDate" : ISODate("2015-09-30T09:25:29Z"),
"configVersion" : 1,
"self" : true
}
],
"ok" : 1
}
testset:PRIMARY> rs.add('192.168.1.223:27018');
{ "ok" : 1 }
testset:PRIMARY> rs.add('192.168.1.223:27019');
{ "ok" : 1 }
testset:PRIMARY> rs.status()
{
"set" : "testset",
"date" : ISODate("2015-09-30T09:26:12.584Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" : "DESKTOP-3B9N9SB:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 192,
"optime" : Timestamp(1443605169, 1),
"optimeDate" : ISODate("2015-09-30T09:26:09Z"),
"electionTime" : Timestamp(1443605129, 2),
"electionDate" : ISODate("2015-09-30T09:25:29Z"),
"configVersion" : 3,
"self" : true
},
{
"_id" : 1,
"name" : "192.168.1.223:27018",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 6,
"optime" : Timestamp(1443605169, 1),
"optimeDate" : ISODate("2015-09-30T09:26:09Z"),
"lastHeartbeat" : ISODate("2015-09-30T09:26:11.742Z"),
"lastHeartbeatRecv" : ISODate("2015-09-30T09:26:12.447Z"
),
"pingMs" : 0,
"syncingTo" : "DESKTOP-3B9N9SB:27017",
"configVersion" : 3
},
{
"_id" : 2,
"name" : "192.168.1.223:27019",
"health" : 1,
"state" : 5,
"stateStr" : "STARTUP2",
"uptime" : 2,
"optime" : Timestamp(0, 0),
"optimeDate" : ISODate("1970-01-01T00:00:00Z"),
"lastHeartbeat" : ISODate("2015-09-30T09:26:11.755Z"),
"lastHeartbeatRecv" : ISODate("2015-09-30T09:26:11.782Z"
),
"pingMs" : 12,
"configVersion" : 3
}
],
"ok" : 1
}
需要注意的是,首先要运行rs.initiate(),然后要运行rs.add()增加复制服务器,用rs.status()可以看到状态,可以看出27017是Primary,其他都是Secondary
3)验证
在27017插入
testset:PRIMARY> for(var i=0;i<10000;i++){
... db.students.insert({name:'ss'+i,code:'aa'+i,id:i});
... }
WriteResult({ "nInserted" : 1 })
testset:PRIMARY> db.students.count();
10000
D:\mongodb_data>mongo 192.168.1.223:27018
MongoDB shell version: 3.0.6
connecting to: 192.168.1.223:27018/test
testset:SECONDARY> db.students.count()
2015-09-30T17:31:11.883+0800 E QUERY Error: count failed: { "note" : "from ex
ecCommand", "ok" : 0, "errmsg" : "not master" }
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:13 at src/mongo/shell/query.js:326
testset:SECONDARY> rs.slaveOk()
testset:SECONDARY> db.students.count()
10000
D:\mongodb_data>mongo 192.168.1.223:27019
MongoDB shell version: 3.0.6
connecting to: 192.168.1.223:27019/test
testset:SECONDARY> rs.slaveOk()
testset:SECONDARY> db.students.count()
10000
此时可以看到复制已经成功了,但是从服务器默认是不能查询的,需要设置slaveOk,才可以查询,大部分的驱动程序都支持这个设置,并且在连接集群的时候,驱动程序会自动切换,找到合适的服务器,如果某一个服务器宕机了,就可以无缝切换到其他服务器。
在这种集群环境下,如果主服务器宕掉了,其他的几个服务器会经过投票,选出一个服务器作为主服务器,所以集群是无缝切换的,只有在投票期间是不对外服务的,不过这个时间很短,如果网络较好、且服务器不多,可以在几秒内切换完毕。
MongodDB学习笔记(二)(复制)的更多相关文章
- AJax 学习笔记二(onreadystatechange的作用)
AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...
- [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计
源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...
- 《SQL必知必会》学习笔记二)
<SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语 ...
- InterSystems Ensemble学习笔记(二) Ensemble创建镜像, 实现自动故障转移
系列目录 InterSystems Ensemble学习笔记(一) Ensemble介绍及安装InterSystems Ensemble学习笔记(二) Ensemble创建镜像, 实现自动故障转移 一 ...
- Linux学习笔记(二) 文件管理
了解 Linux 系统基本的文件管理命令可以帮助我们更好的使用 Linux 系统,以下介绍几个常用的文件管理命令 1.pwd pwd 是 Print Working Directory 的简写,用于显 ...
- WPF的Binding学习笔记(二)
原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...
- JMX学习笔记(二)-Notification
Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...
- java之jvm学习笔记二(类装载器的体系结构)
java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...
- OGG学习笔记04-OGG复制部署快速参考
OGG学习笔记04-OGG复制部署快速参考 源端:Oracle 10.2.0.5 RAC + ASM 节点1 Public IP地址:192.168.1.27 目标端:Oracle 10.2.0.5 ...
- Java IO学习笔记二
Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...
随机推荐
- WebView之js调用Android类的方法传递数据
1,具体的思路如下: 在android中写一个Activity,里面写一个webview,这个webview加载本地的一个html文件,显示这个网页,这个网页包括一个用户名和密码的输入框和两个按钮(只 ...
- Python后端开发要求
关于Python后端开发要求 一.对Python有兴趣,熟悉Python(标准库) 最好阅读过源码 了解Python的优化(熟悉pypy更佳) 二.至少至少一门语言(不说"精通") ...
- Hi3518EV200平台ADC多通道采样
Hi3518EV200平台ADC多通道采样流程 Hi3518EV200 ADC 本文针对Hi3518EV200平台处理器,通过ADC单次采样方式,实现对多通道(1~4通道)ADC进行采样控制.本文仅仅 ...
- Python——正则表达式特殊符号及用法
由于正则表达式的内容比较多,所以单独写成一系列文章,主要内容是根据小甲鱼所讲的内容综合一下正则表达式的笔记. 贴上小甲鱼的<Python3 如何优雅地使用正则表达式>系列可观看的博客地址: ...
- 第二个MapReduce
大家在学习Hadoop的MapReduce的时候,90%的第一个程序都是WordCount,所以在这里分享一下我的第二个MapReduce程序.对于学习编程语言的人来说,有时候代码是最好的沟通方式之一 ...
- socket的简单例子
最近刚刚开始学了socket的模块,就写了一个服务器与客户端交互的程序 有两种模式: 1.就是先电脑自动回复 2.就是人工服务 接下来就是代码了 服务器端的代码: #Author:陈浩彬 import ...
- Vue.js简单的应用
1:一个简单实现 下面代码部分: <body> <div id="myDiv1"> {{userName}} </div> </body& ...
- unity3d资源打包总结
http://www.manew.com/blog-33734-12973.html unity 打包的时候会把下面几个文件资源打进apk或者ipa包里面 1. Asset下的所有脚本文件 2. As ...
- 方法的形参、ref参数、out参数的区别
我们在定义方法时,经常会涉及到传参.因为引用类型的数据在用变量存储时,是存储的地址,所以在传参时,依然是传递的地址,但是值类型的数据在传参时就会有所不同.值类型数据在调用方法传参时,普通情况下是值传递 ...
- laravel MethodNotAllowedHttpException错误一个原因
前两天在写api的时候,出现一个之前都没有碰到过的问题,如图 可以说提示信息是很不友好了,然后打开错误日志,发现报了一个MethodNotAllowedHttpException这样的错误,这样错误我 ...