master : 192.168.1.102  (主机名是a1)

slave  : 192.168.1.104   (主机名是a2)


在master的机器上开启mongodb,


[root@a1 bin]# ./mongod --master --dbpath=/usr/local/mongodb/data/ --logpath=/usr/local/mongodb/dblogs --fork


--master这参数是主服务必须带的参数


在slave的服务器上开启mongodb,

[root@a2 bin]# ./mongod --slave --source 192.168.1.102:27017  --dbpath=/usr/local/mongodb/data/ --logpath=/usr/local/mongodb/logspath  --fork

--slave      表示从服务器

--source 192.168.1.102:27017  指向主服务的ip和端口


接下来进行测试

进入主服务器的mongodb

[root@a1 bin]# ./mongo

MongoDB shell version: 2.4.3

connecting to: test

添加一个数据

> db.c1.insert({name:"user1"})

> db.c1.find();

{ "_id" : ObjectId("5197343611a4e2f4a90b09e8"), "name" : "user1" }

>


进入从服务器的mongodb

[root@a2 bin]# ./mongo

MongoDB shell version: 2.4.3

connecting to: test

> db.c1.find();

{ "_id" : ObjectId("5197343611a4e2f4a90b09e8"), "name" : "user1" }

>

说明我们的主从配置成功。


由于主从配置中无法设置用户验证,所以安全性比较差(不过我们可以在iptables上设置允许某ip访问该端口),下面介绍 Replica Sets 复制(副本集),这是比较安全,而且高可用性,可以自动切换,而且保证数据不丢失。

Replica Sets 复制(副本集)

我们设置三个mongod 事例

A:192.168.1.102:27017

B:192.168.1.104:20001

C:192.168.1.104:20002

在同一台服务器上可以挂载多个mongod,只要端口不相同即可。


首先,创建副本集的key,必须设置key的权限为600,否则后面会报错

A:[root@a2 bin]# echo "123456" >  /usr/local/mongodb/key/ro

  [root@a2 bin]# chmod 600  /usr/local/mongodb/key/ro

B:[root@a1 bin]# echo "123456" >  /usr/local/mongodb/key/r1

  [root@a1 bin]# chmod 600  /usr/local/mongodb/key/ro    

C: [root@a1 bin]# echo "123456" >  /usr/local/mongodb/key/r2

  [root@a1 bin]# chmod 600  /usr/local/mongodb/key/r2


分别开启mongod

A: [root@a2 bin]# ./mongod --replSet rs1 --keyFile=/usr/local/mongodb/key/r0     --dbpath=/usr/local/mongodb/data/ --logpath=/usr/local/mongodb/logspath --nojournal --fork

B:  [root@a1 bin]# ./mongod --replSet rs1 --keyFile=/usr/local/mongodb/key/r0  --dbpath=/usr/local/mongodb/data/d1/ --logpath=/usr/local/mongodb/log/log1 --port 20001 --fork

C:  [root@a1 bin]# ./mongod --replSet rs1 --keyFile=/usr/local/mongodb/key/r1  --dbpath=/usr/local/mongodb/data/d2/ --logpath=/usr/local/mongodb/log/log2 --port 20002 --fork


随便进入一个mongodb中进行副本集的配置

config_rs1 = {_id: 'rs1', members: [

{_id: 0, host: '192.168.1.102:20001', priority:1},      

{_id: 1, host: '192.168.1.102:20002',priority:2},

{_id: 2, host: '192.168.1.104:27017',priority:3}

]}

> rs.initiate(config_rs1);


由于A的priority=3,这A作为主的服务器,其他的服务器作为从服务器,当A服务器出现故障,这B就会自动替代A服务器(priority=2,权限第二大),当A恢复后,数据会自动备份到A,并且A还将作为主服务器。


如下,当我们分别进入A,B,C mongodb中,会出现如下情况,这表示我们副本集配置成功。

A:

[root@a2 bin]# ./mongo

MongoDB shell version: 2.4.3

connecting to: test

rs1:PRIMARY>

B:

[root@a1 bin]# ./mongo --port 20001

MongoDB shell version: 2.4.3

connecting to: 127.0.0.1:20001/test

rs1:SECONDARY>

C:

[root@a1 bin]# ./mongo --port 20002

MongoDB shell version: 2.4.3

connecting to: 127.0.0.1:20002/test

rs1:SECONDARY>


如果B,C查看不了数据的话 ,输入 rs.slaveOk();就可以解决

rs1:SECONDARY> rs.slaveOk();


查看副本集的信息:

rs1:PRIMARY> db.printReplicationInfo();

configured oplog size:   990MB

log length start to end: 1354secs (0.38hrs)

oplog first event time:  Sat May 18 2013 02:04:28 GMT-0700 (PDT)

oplog last event time:   Sat May 18 2013 02:27:02 GMT-0700 (PDT)

now:                     Sat May 18 2013 06:28:27 GMT-0700 (PDT)


字段说明

configured oplog size: 配置的oplog文件大小

log length start to end: oplog日志的启用时间段

oplog first event time: 产生时间oplog last

event time: 最后一个事务日志的产生时间

now: 现在的时间


查看副本集的配置信息:

rs1:PRIMARY> use local

rs1:PRIMARY> db.system.replset.find()