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();

来解决!

原文地址:https://www.cnblogs.com/pigzhu/p/3172463.html