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
时间: 2024-08-28 08:19:06

MongodDB学习笔记(二)(复制)的相关文章

马哥学习笔记二十四——分布式复制快设备drbd

DRBD: 主从 primary: 可执行读.写操作 secondary: 文件系统不能挂载 DRBD: dual primay, 双主(基于集群文件系统的高可用集群) 磁盘调度器:合并读请求,合并写请求: Procotol:drbd数据同步协议 A: Async, 异步  数据发送到本机tcp/ip协议栈 B:semi sync, 半同步  数据发送到对方tcp/ip协议 C:sync, 同步  数据到达对方存储设备 DRBD Source: DRBD资源 资源名称:可以是除了空白字符外的任意

JavaScript--基于对象的脚本语言学习笔记(二)

第二部分:DOM编程 1.文档象模型(DOM)提供了访问结构化文档的一种方式,很多语言自己的DOM解析器. DOM解析器就是完成结构化文档和DOM树之间的转换关系. DOM解析器解析结构化文档:将磁盘上的结构化文档转换成内存中的DOM树 从DOM树输出结构化文档:将内存中的DOM树转换成磁盘上的结构化文档 2.DOM模型扩展了HTML元素,为几乎所有的HTML元素都新增了innerHTML属性,该属性代表该元素的"内容",即返回的某个元素的开始标签.结束标签之间的字符串内容(不包含其它

APUE 学习笔记(二) 文件I/O

1. 文件I/O 对于内核而言,所有打开的文件都通过文件描述符引用,内核不区分文本文件和二进制文件 open函数:O_RDONLY  O_WRONLY  O_RDWR create函数: close函数:关闭一个文件时还会释放该进程加在该文件上的所有记录锁 lseek函数:显式地为一个打开的文件设置其偏移量 每个打开的文件都有一个与其相关联的 "当前文件偏移量",用以度量从文件开始处计算的字节数,通常,读.写操作都从当前文件偏移量处开始,并使偏移量增加所读写的字节数 文件偏移量可以大于

Linux学习笔记二:Linux的文件处理命令

1.文件处理命令:ls 作用:显示目录文件 语法:ls [选项] [文件或目录] [选项]:-a 显示所有文件,包括隐藏文件   -l 显示详细信息 -d 查看目录属性 [文件或目录]:当省略时默认将当前路径作为参数 实例: · ls 显示当前文件夹下所有文件(不包括隐藏文件)的信息 · ls -l 显示当前文件夹下所有文件(不包括隐藏文件)的详细信息 · ls -ld  显示当前文件夹的详细信息 技巧:要查看文件夹的信息,必须加-d参数:要查看详细参数,必须加-l参数. 2.文件的属性 使用”

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

<SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语句,但是实际应用中的业务逻辑往往会非常复杂,所以会用到一些比较复杂的查询,如子查询,联合查询. 1.子查询 当一个查询是另一个查询的条件时,称为子查询.但是说到子查询又不的不说它与嵌套查询两者的区别,下面一张图来说明 下面再用一条sql语句来说明他们的关系. 其中在查询中又分为嵌套子查询和相关子查询,他们之间

马哥学习笔记二十六——MySQL主从复制

配置MySQL复制基本步骤: 一.master 1.启用二进制日志 log-bin = master-bin log-bin-index = master-bin.index 2.选择一个惟一server-id server-id = {0-2^32} 3.创建具有复制权限的用户 REPLICATION SLAVE REPLICATION CLIENT 二.slave 1.启用中继日志 relay-log = relay-log relay-log-index = 2.选择一个惟一的server

angularjs 学习笔记(二) ----- bootstrap框架

1.  下载新的jquery-1.11.1文件. 2.  下载新的bootstrap文件. 3.  选择流式布局的模板填充入index.html文件. 4.  将top.foot转为nginclude文件 nginclude必须使用$scope对象,因此需要设置一个全局的mainctrl来将字符串或全局变量注入$cope中. $rootScope.global =global; 直接将全局变量global赋值给$rootScope,并且之后的子$Scope会获得继承,静态定义与ctrl分开. 5

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

AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了onreadyStateChange事件实现这一功能.这类似于回调函数的做法.onreadyStateChange事件可指定一个事件处理函数来处理XMLHttpRequest对象的执行结果,如: 复制代码 代码如下: ajaxObj=createAjaxObject(); var url="/MyTod

Caliburn.Micro学习笔记(二)----Actions

Caliburn.Micro学习笔记(二)----Actions 上一篇已经简单说了一下引导类和简单的控件绑定 我的上一个例子里的button自动匹配到ViewModel事件你一定感觉很好玩吧 今天说一下它的Actions,看一下Caliburn.Micro给我们提供了多强大的支持 我们还是从做例子开始 demo的源码下载在文章的最后 例子1.无参数方法调用 点击button把textBox输入的文本弹出来 如果textbox里没有文本button不可点,看一下效果图 看一下前台代码 <Stac

2. 蛤蟆Python脚本学习笔记二基本命令畅玩

2. 蛤蟆Python脚本学习笔记二基本命令畅玩 本篇名言:"成功源于发现细节,没有细节就没有机遇,留心细节意味着创造机遇.一件司空见惯的小事或许就可能是打开机遇宝库的钥匙!" 下班回家,咱先来看下一些常用的基本命令. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/48092873 1.  数字和表达式 看下图1一就能说明很多问题: 加法,整除,浮点除,取模,幂乘方等.是不是很直接也很粗暴. 关于上限,蛤蟆不太清楚