• MongoDB之Replica Set(复制集复制)


    MongoDB支持两种复制模式:

    • 主从复制(Master/Slave)
    • 复制集复制(Replica Set)

    下面主要记录我在centos虚拟机上安装replica set,主要参考:http://docs.mongodb.org/manual/tutorial/deploy-replica-set/

    首先准备好3份配置文件:

    1 port = 27017
    2 
    3 dbpath = /home/bells/install/data1
    4 logpath = /home/bells/install/log1/1.log
    5 
    6 fork = true
    7 replSet = rs0
    1 port = 27016
    2 
    3 dbpath = /home/bells/install/data2
    4 logpath = /home/bells/install/log2/2.log
    5 
    6 fork = true
    7 replSet = rs0
    1 port = 27015
    2 
    3 dbpath = /home/bells/install/data3
    4 logpath = /home/bells/install/log3/3.log
    5 
    6 fork = true
    7 replSet = rs0

    然后再启动这3个mongodb服务

    sudo ./mongodb1/bin/mongod --smallfiles --config 1.conf
    sudo ./mongodb2/bin/mongod --smallfiles --config 2.conf
    sudo ./mongodb3/bin/mongod --smallfiles --config 3.conf

         其实smallfiles也应该写进*.conf文件中的。

    最后配置:

       主要是通过下面的命令

         rs.initiate()   使用默认的配置初始化replica set在当前的服务器

         rs.status()    显示当前replica set的状态

         rs.add(serverInfo)   增加新的成员到replica set 中

         rs.addArb(serverInfo)    增加一个arbiter到replica set中

     1 rs.initiate()
     2 {
     3     "info2" : "no configuration explicitly specified -- making one",
     4     "me" : "localhost.localdomain:27017",
     5     "info" : "Config now saved locally.  Should come online in about a minute.",
     6     "ok" : 1
     7 }
     8 > rs.conf()
     9 {
    10     "_id" : "rs0",
    11     "version" : 1,
    12     "members" : [
    13         {
    14             "_id" : 0,
    15             "host" : "localhost.localdomain:27017"
    16         }
    17     ]
    18 }
    19 rs0:PRIMARY> rs.add("localhost.localdomain:27016")
    20 { "ok" : 1 }
    21 rs0:PRIMARY> rs.add("localhost.localdomain:27015")
    22 { "ok" : 1 }
    23 rs0:PRIMARY> rs.status()
    24 {
    25     "set" : "rs0",
    26     "date" : ISODate("2014-02-23T01:43:16Z"),
    27     "myState" : 1,
    28     "members" : [
    29         {
    30             "_id" : 0,
    31             "name" : "localhost.localdomain:27017",
    32             "health" : 1,
    33             "state" : 1,
    34             "stateStr" : "PRIMARY",
    35             "uptime" : 602,
    36             "optime" : Timestamp(1393119782, 1),
    37             "optimeDate" : ISODate("2014-02-23T01:43:02Z"),
    38             "self" : true
    39         },
    40         {
    41             "_id" : 1,
    42             "name" : "localhost.localdomain:27016",
    43             "health" : 1,
    44             "state" : 5,
    45             "stateStr" : "STARTUP2",
    46             "uptime" : 17,
    47             "optime" : Timestamp(0, 0),
    48             "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
    49             "lastHeartbeat" : ISODate("2014-02-23T01:43:15Z"),
    50             "lastHeartbeatRecv" : ISODate("2014-02-23T01:43:15Z"),
    51             "pingMs" : 0,
    52             "lastHeartbeatMessage" : "initial sync need a member to be primary or secondary to do our initial sync"
    53         },
    54         {
    55             "_id" : 2,
    56             "name" : "localhost.localdomain:27015",
    57             "health" : 1,
    58             "state" : 5,
    59             "stateStr" : "STARTUP2",
    60             "uptime" : 14,
    61             "optime" : Timestamp(0, 0),
    62             "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
    63             "lastHeartbeat" : ISODate("2014-02-23T01:43:16Z"),
    64             "lastHeartbeatRecv" : ISODate("2014-02-23T01:43:16Z"),
    65             "pingMs" : 1,
    66             "lastHeartbeatMessage" : "syncThread: 12520 new file allocation failure"
    67         }
    68     ],
    69     "ok" : 1
    70 }
    71 rs0:PRIMARY> db.person.insert({"name":"jack", "age":20})
    72 rs0:PRIMARY> db.person.find()
    73 { "_id" : ObjectId("5309529869d3a7216c59ef2a"), "name" : "jack", "age" : 20 }
    1 [bells@localhost install]$ ./mongodb2/bin/mongo --port 27016
    2 MongoDB shell version: 2.4.5
    3 connecting to: 127.0.0.1:27016/test
    4 rs0:SECONDARY> db.person.find()
    5 error: { "$err" : "not master and slaveOk=false", "code" : 13435 }
    6 rs0:SECONDARY> rs.slaveOk();
    7 rs0:SECONDARY> db.person.find()
    8 { "_id" : ObjectId("5309529869d3a7216c59ef2a"), "name" : "jack", "age" : 20 }

    安装部署过程中,遇到两个问题:

    1. 启动mongodb时,错误日志:

         

    1 Sun Feb 23 09:47:57.930 [initandlisten] ERROR: Insufficient free space for journal files
    2 Sun Feb 23 09:47:57.930 [initandlisten] Please make at least 3379MB available in /home/bells/install/data1/journal or use --smallfiles
    3 Sun Feb 23 09:47:57.930 [initandlisten] 
    4 Sun Feb 23 09:47:57.953 [initandlisten] exception in initAndListen: 15926 Insufficient free space for journals, terminating

          解决办法就是,启动的时候,加个   --smallfiles : 这个参数默认值是false,如果设为true,则会是每个文件最大的大小限定为512M而不是默认的2G

    2. 在secondary中,查询时:

    1 rs0:SECONDARY> db.person.find()
    2 error: { "$err" : "not master and slaveOk=false", "code" : 13435 }

    这个是正常的,因为SECONDARY默认是不允许读写操作的,可以:

    rs0:SECONDARY> db.slaveOk();

    来解决!

  • 相关阅读:
    java小学生四则运算带面板版 但我不知道为什么同类变量却进不了动作监听中去
    超实用 2 ArrayList链表之 员工工资管理系统
    超实用 1 ArrayList 链表
    我的JAVA运算符理解
    小学生四则运算
    一、二周冲刺总结
    阅读《构建之法》第8,9,10章
    第一次Sprint计划
    作业6
    5.2
  • 原文地址:https://www.cnblogs.com/pigzhu/p/3172463.html
Copyright © 2020-2023  润新知