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学习笔记(二)(复制)的更多相关文章

  1. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

  2. [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计

    源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...

  3. 《SQL必知必会》学习笔记二)

    <SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语 ...

  4. InterSystems Ensemble学习笔记(二) Ensemble创建镜像, 实现自动故障转移

    系列目录 InterSystems Ensemble学习笔记(一) Ensemble介绍及安装InterSystems Ensemble学习笔记(二) Ensemble创建镜像, 实现自动故障转移 一 ...

  5. Linux学习笔记(二) 文件管理

    了解 Linux 系统基本的文件管理命令可以帮助我们更好的使用 Linux 系统,以下介绍几个常用的文件管理命令 1.pwd pwd 是 Print Working Directory 的简写,用于显 ...

  6. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  7. JMX学习笔记(二)-Notification

    Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...

  8. java之jvm学习笔记二(类装载器的体系结构)

    java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...

  9. 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 ...

  10. Java IO学习笔记二

    Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...

随机推荐

  1. 设计模式的征途—15.观察者(Observer)模式

    在日常生活中,交通信号灯指挥者日益拥挤的城市交通.红灯亮,汽车停止:绿灯亮,汽车继续前行:在这个过程中,交通信号灯是汽车的观察目标,而汽车则是观察者.随着交通信号灯的变化,汽车的行为也会随之变化,一盏 ...

  2. [转]如何查询SQL Server连接数

    1.获取SQL Server允许同时用户连接的最大数 SELECT @@MAX_CONNECTIONS 2.获取当前指定数据库的连接信息 SELECT * FROM master.dbo.syspro ...

  3. shell中条件判断语法与判断条件小结

    1. IF条件判断语法: if Athen   dosthelif B   dosthelse   dosthfi 2. 判断条件:   2.1 字符串判断   str1 = str2 当两个串有相同 ...

  4. sqoop: mysql to hive

    sqoop import --connect 数据库连接 --username 数据库用户名--password 数据库密码 --table 导入的表 -m 1 --hive-import --tar ...

  5. Office隐藏17年的漏洞CVE_2017_11882测试记录

    Office隐藏17年的漏洞CVE_2017_11882测试记录 创建时间: 2017/11/25 0:18 作者: CN_Simo 标签: Office漏洞 参考文章1:https://www.cn ...

  6. Maven3 快速入门

    Maven3 快速入门 Maven 是目前大型项目构建的必备知识.本章会通过介绍 Maven 的作用,Maven 的基本语法,以及搭建企业级项目架构来快速入门 Maven .前两部分是理论知识只需要了 ...

  7. 开始python成长之路

    因为某种特殊原因很不幸的得了脱髓鞘 正要去实习 大展身手 甚至公司都选好了 可就在这个节骨眼..得了传说中的脱髓鞘.经过一年的修养 我决定还是要站起来 毕竟一生的时间很长 这一段时间 我都在玩游戏赚钱 ...

  8. 最大信息系数(MIC)——Detecting Novel Associations in Large Data Sets

    本文介绍了一种发现两个随机变量之间依赖关系强度的度量MIC(最大信息系数,类似于相关系数的作用).MIC具有以下性质和优势: MIC度量具有普适性.其不仅可以发现变量间的线性函数关系,还能发现非线性函 ...

  9. RFID电动车管理,智慧城市物联网建设的入口

    原谷歌CEO施密特说:"我可以非常直接地说,互联网将消失." 互联网在20多年来帮助人们解决了信息共享.交互,几乎在瞬间颠覆了很多传统的商业模式,把卖产品变为卖内容和服务,是个了不 ...

  10. CATransition

    CATransition *transition = [CATransition animation];    transition.duration = 1.0f;         /* 间隔时间* ...