MongoDB副本集

副本集的做法比前面的主从服务器就高级很多,它是这样的:

1、比喻有A、B、C三台服务器,A是主服务器,B、C是备份服务器,A插入数据,B、C也会有该数据

2、当A挂掉后,自动会选择B、C中的一台做为主服务器,但A恢复的时候,A可以变成一台备服务器。这样安全性就高了很多,除非三台服务器都挂了,才会造成巨大影响。

3、而刚刚的主从服务器,主服务器挂了,从服务器是不会变成主服务器的。

下面看看具体配置:

1、A服务器
     A.conf
     dbpath = D:\MongoDB\A
     port = 1111  #端口
     bind_ip = 127.0.0.1 #服务地址
     replSet = child/127.0.0.1:2222 #设定同伴

     mongodbA.bat

     mongod --config A.conf

2、B服务器

     B.conf

    dbpath = D:\MongoDB\B
     port = 2222 #端口
     bind_ip = 127.0.0.1 #服务地址
     replSet = child/127.0.0.1:3333 #设定同伴

    mongodbA.bat

    mongod --config A.conf

3、B服务器

     B.conf

    dbpath = D:\MongoDB\C
     port = 3333 #端口
     bind_ip = 127.0.0.1 #服务地址
     replSet = child/127.0.0.1:1111 #设定同伴

    mongodbA.bat

     mongod --config A.conf

  注意看replSet设置,这三个服务器形成了一个闭环

4、随便登陆一台服务器

     mongo 127.0.0.1:1111

     执行

    

> use admin
switched to db admin
> db.runCommand({"replSetInitiate":
...    {
...       "_id":'child',
...        "members":[{
...         "_id":1,
... "host":"127.0.0.1:1111"
...     },{
... "_id":2,
... "host":"127.0.0.1:2222"
...     },{
... "_id":3,
... "host":"127.0.0.1:3333"
...     }]
...     }
... })
{ "ok" : 1 }

5、再退出,重新启三个客户端登陆三台服务器,任何一台服务器都可以查看三台服务器情况。

child:SECONDARY> rs.status()
{
        "set" : "child",
        "date" : ISODate("2016-07-09T14:42:13.029Z"),
        "myState" : 2,
        "term" : NumberLong(1),
        "syncingTo" : "127.0.0.1:1111",
        "heartbeatIntervalMillis" : NumberLong(2000),
        "members" : [
                {
                        "_id" : 1,
                        "name" : "127.0.0.1:1111",
                        "health" : 1,
                        "state" : 1,
                       "stateStr" : "PRIMARY",--------主服务器
                        "uptime" : 504,
                        "optime" : {
                                "ts" : Timestamp(1468074840, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDate" : ISODate("2016-07-09T14:34:00Z"),
                        "lastHeartbeat" : ISODate("2016-07-09T14:42:11.860Z"),
                        "lastHeartbeatRecv" : ISODate("2016-07-09T14:42:11.704Z"
),
                        "pingMs" : NumberLong(0),
                        "electionTime" : Timestamp(1468074839, 1),
                        "electionDate" : ISODate("2016-07-09T14:33:59Z"),
                        "configVersion" : 1
                },
                {
                        "_id" : 2,
                        "name" : "127.0.0.1:2222",
                        "health" : 1,
                        "state" : 2,
                       "stateStr" : "SECONDARY", --------备份服务器
                         "uptime" : 504,
                        "optime" : {
                                "ts" : Timestamp(1468074840, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDate" : ISODate("2016-07-09T14:34:00Z"),
                        "lastHeartbeat" : ISODate("2016-07-09T14:42:11.855Z"),
                        "lastHeartbeatRecv" : ISODate("2016-07-09T14:42:12.888Z"
),
                        "pingMs" : NumberLong(0),
                        "syncingTo" : "127.0.0.1:1111",
                        "configVersion" : 1
                },
                

 6、在主服务器插入一条数据 
  

  
child:PRIMARY> use test1
switched to db test1
child:PRIMARY> db.boot.insert({name:"dddddd"})
WriteResult({ "nInserted" : 1 })

7、在从服务器中,可以查看到这条数据,但由于从服务器直接查看,必须要执行 rs.slaveOk() 后才能查看
 
child:SECONDARY> rs.slaveOk()
child:SECONDARY> show dbs
local  0.000GB
test1  0.000GB
child:SECONDARY> use test1
switched to db test1
child:SECONDARY> db.boot.find()
{ "_id" : ObjectId("57810e691e08f8ee2277cb8e"), "name" : "dddddd" }
child:SECONDARY>

8、关掉主服务器,测试

测试结果,随机选择一台备份服务器为活跃服务器

9、开启原先的活跃服务器,测试

测试结果,原先的变成了备份服务器

10、设置读写分离

      slaveOkay :  true
      很遗憾他在shell中无法演示,这个特性是被写到mongoDB的
      驱动程序中的,在JAVA和node等其他语言中可以完成。

      读写分离的的用处,在处理大数据量读写操作时,可以分把读写分开来,来减少数据库负担,主库用来写,备份库用来读取


------------------------------------------------------------------------------------------------------------------------------------------

    节点和初始化高级参数

     standard 常规节点:参与投票有可能成为活跃节点
     passive 副本节点:参与投票,但是不能成为活跃节点
     arbiter 仲裁节点:只是参与投票不复制节点也不能成为活跃节点

    Priority  0到1000之间 ,0代表是副本节点 ,1到1000是常规节点
   arbiterOnly : true 仲裁节点
   用法
    members":[{
      "_id":1,
      "host":"127.0.0.1:1111“,
      arbiterOnly : true
}]”


你可能感兴趣的:(Mongodb)