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