二,mongo 副本集
副本集也是一个主从的同步,不过他支持主从的自动切换
这里的master不是固定的,因为副本集会根据选举来决定谁是master,而且,当一个master挂掉以后,会进行重新选举,选出新master,踢掉挂掉的机器
配置步骤:
hostname rac1.example.com 192.168.78.130
hostname rac2.example.com 192.168.78.131
首先每个机器的/etc/hosts 文件中,都有服务器ip对应的主机名
步骤一:
在130上
启动mongo:
. [root@rac1 bin]# ./mongod --dbpath=/root/data --logpath=/root/data/mongo.log --logappend --fork --port=10001 --replSet test/rac1.example.com:10001
forked process: 6661
all output going to: /root/data/mongo.log
child process started successfully, parent exiting
在131上:
[root@rac2 bin]# ./mongod --dbpath=/root/data --logpath=/root/data/mongo.log --logappend --fork --port=10002 --replSet test/rac2.example.com:10002
forked process: 5617
all output going to: /root/data/mongo.log
child process started successfully, parent exiting
下面进行初始化
> use admin
switched to db admin
> db.runCommand({"replSetInitiate":{"_id":"test","member":[{"_id":1,"host":"rac1.example.com:10001"},{"_id":2,"host":"rac2.example.com:10002"}]}})
如果在这里报错了,是因为没有初始化成功,我们需要使用rs.initiate() 进行初始化
> rs.initiate()
{
"info2" : "no configuration explicitly specified -- making one",
"me" : "rac1.example.com:10001",
"info" : "Config now saved locally. Should come online in about a minute.",
"ok" : 1
}
成功后,我们查看一下,会发现提示符已经变化了,提示符的前面test表示这个副本集的名字,后面表示primary
test:PRIMARY> use local
switched to db local
test:PRIMARY> show dbs
local 0.140625GB
pincer 0.0625GB
test:PRIMARY> show collections
oplog.$main
oplog.rs
slaves
system.indexes
system.replset
通过system.replset去查看状态
test:PRIMARY> db.system.replset.find()
{ "_id" : "test", "version" : 1, "members" : [ { "_id" : 0, "host" : "rac1.example.com:10001" } ] }
这里可以看到,这里只有一个member rac1 但是rac2不见了
我们去rac2 机器上,发现这里还是没有加入,
通过rs命令,我们去rac1上执行
新加,则用rs.add("rac2.example.com:10002"))
}
test:PRIMARY> rs.add("rac2.example.com:10002")
然后过一会,发现rac2上的状态变了
test:STARTUP2>
test:SECONDARY>
通过提示符,可以看到状态从startup 变成secondary了
然后再查看一下状态
test:SECONDARY> rs.status()
{
"set" : "test",
"date" : ISODate("2013-08-08T02:24:07Z"),
"myState" : 2,
"syncingTo" : "rac1.example.com:10001",
"members" : [
{
"_id" : 0,
"name" : "rac1.example.com:10001",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 54,
"optime" : Timestamp(1376785130000, 1),
"optimeDate" : ISODate("2013-08-18T00:18:50Z"),
"lastHeartbeat" : ISODate("2013-08-08T02:24:05Z"),
"pingMs" : 1
},
{
"_id" : 1,
"name" : "rac2.example.com:10002",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 1514,
"optime" : Timestamp(1376785130000, 1),
"optimeDate" : ISODate("2013-08-18T00:18:50Z"),
"self" : true
}
],
"ok" : 1
}
也可以使用一下方法初始化
cfg={"_id":1,members:[{"_id":1,"host":"rac1.example.com:10001"},{"_id":2,"host":"rac2.example.com:10002"}]}
rs.initiate(cfg)
新加,则用rs.add("rac2.example.com:10002"))
下面做个自动切换,到130 上去关闭mongo
test:PRIMARY> use admin
switched to db admin
test:PRIMARY> db.shutdownServer()
Sun Aug 18 08:46:45 DBClientCursor::init call() failed
Sun Aug 18 08:46:45 query failed : admin.$cmd { shutdown: 1.0 } to: 127.0.0.1:10001
server should be down...
Sun Aug 18 08:46:45 trying reconnect to 127.0.0.1:10001
Sun Aug 18 08:46:45 reconnect 127.0.0.1:10001 failed couldn't connect to server 127.0.0.1:10001
> exit
bye
然后到131上,过1分总登陆上去
[root@rac2 bin]# ./mongo rac2.example.com:10002/admin
MongoDB shell version: 2.2.2
connecting to: rac2.example.com:10002/admin
test:PRIMARY>
这时提示符都已经变成primary了,可以在这里插入和查询了
从下面可以看到,rac1的statestr变成了"SECONDARY"
test:PRIMARY> rs.status()
{
"set" : "test",
"date" : ISODate("2013-08-08T02:58:19Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" : "rac1.example.com:10001",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 374,
"optime" : Timestamp(1376786436000, 1),
"optimeDate" : ISODate("2013-08-18T00:40:36Z"),
"lastHeartbeat" : ISODate("2013-08-08T02:58:18Z"),
"pingMs" : 1
},
{
"_id" : 1,
"name" : "rac2.example.com:10002",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 3566,
"optime" : Timestamp(1376786436000, 1),
"optimeDate" : ISODate("2013-08-18T00:40:36Z"),
"self" : true
}
],
"ok" : 1
}
也可以使用一下方法初始化
cfg={"_id":1,members:[{"_id":1,"host":"rac1.example.com:10001"},{"_id":2,"host":"rac2.example.com:10002"}]}
rs.initiate(cfg)
本文出自 “pincer” 博客,转载请与作者联系!