MongodDB学习笔记(二)(复制)

    mongoDB的复制很是容易配置,其实现有两种方式,一种是主从复制,一种是复制集,前者的好处是容易配置,可是若是主服务器宕掉了,整个系统就崩溃了,后者的好处是若是主服务器宕掉了,其余服务器会经过投票选择一个主服务器,所谓的主从服务器的区别在于,主服务器是能够写入的,从服务器默认连查询都不支持,除非设置了slaveOK。mongodb

    一、主从复制shell

        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           spa

D:\mongodb_data>mongod --dbpath=d:\mongodb_data\db2 --port 27018 --slave --source 192.168.1.223:27017日志

这里的参数很容易理解,--master 表明主服务器, --slave 表明从服务器, --source 表明复制来源code

 3)主服务器     server

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()
10000blog

   4)从服务器     ci

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

 二、复制集

       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,才能够查询,大部分的驱动程序都支持这个设置,而且在链接集群的时候,驱动程序会自动切换,找到合适的服务器,若是某一个服务器宕机了,就能够无缝切换到其余服务器。

     在这种集群环境下,若是主服务器宕掉了,其余的几个服务器会通过投票,选出一个服务器做为主服务器,因此集群是无缝切换的,只有在投票期间是不对外服务的,不过这个时间很短,若是网络较好、且服务器很少,能够在几秒内切换完毕。

相关文章
相关标签/搜索