二,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)