博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MongodDB学习笔记(二)(复制)
阅读量:6265 次
发布时间:2019-06-22

本文共 6770 字,大约阅读时间需要 22 分钟。

    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:27017MongoDB shell version: 3.0.6connecting 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:27018MongoDB shell version: 3.0.6connecting to: 192.168.1.223:27018/testtestset:SECONDARY> db.students.count()2015-09-30T17:31:11.883+0800 E QUERY    Error: count failed: { "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" }    at Error (
) 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:326testset:SECONDARY> rs.slaveOk()testset:SECONDARY> db.students.count()10000
D:\mongodb_data>mongo 192.168.1.223:27019MongoDB shell version: 3.0.6connecting to: 192.168.1.223:27019/testtestset:SECONDARY> rs.slaveOk()testset:SECONDARY> db.students.count()10000

     此时可以看到复制已经成功了,但是从服务器默认是不能查询的,需要设置slaveOk,才可以查询,大部分的驱动程序都支持这个设置,并且在连接集群的时候,驱动程序会自动切换,找到合适的服务器,如果某一个服务器宕机了,就可以无缝切换到其他服务器。

     在这种集群环境下,如果主服务器宕掉了,其他的几个服务器会经过投票,选出一个服务器作为主服务器,所以集群是无缝切换的,只有在投票期间是不对外服务的,不过这个时间很短,如果网络较好、且服务器不多,可以在几秒内切换完毕。

 

转载于:https://www.cnblogs.com/stone-fly/p/4849684.html

你可能感兴趣的文章
firefox
查看>>
PS批处理的使用
查看>>
七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC 【转】
查看>>
Quartz作业调度框架
查看>>
腾讯云下安装 nodejs + 实现 Nginx 反向代理
查看>>
js-权威指南学习笔记13
查看>>
《超级时间整理术》晨读笔记
查看>>
Spring Boot 2.0(二):Spring Boot 2.0尝鲜-动态 Banner
查看>>
Delphi IdTCPClient IdTCPServer 点对点传送文件
查看>>
Delphi中使用ActiveX的一些心得
查看>>
QT5.8.0+MSVC2015安装以及环境配置(不需要安装VS2015)
查看>>
(原創) C/C++的function prototype和header file (C/C++) (C)
查看>>
深入理解JavaScript系列(29):设计模式之装饰者模式
查看>>
程序员的罪与罚
查看>>
SQL*LOADER错误总结
查看>>
SQL日志收缩
查看>>
【转】MySQL Query Cache 小结
查看>>
SVN分支和合并的简单例子
查看>>
PHP实现的封装验证码类
查看>>
Augular初探
查看>>