以前採用Master-Slave模式的時候,一旦Master停掉,Java客戶端就會報異常,這個時候已經沒有Master了,Slave不會自動接管Master
測試Replica Sets很是簡單,在單臺服務器上,建了三個用戶來測試。
爲了簡化測試,先把啓動腳本寫好
#!/bin/sh
#filename start.sh
#usage sh start.sh port
if [ $# != 1 ] ; then
echo "USAGE: $0 [port]"
exit 1;
fi
MONGODB_HOME=$HOME/work/mongodb
DATA_PATH=$MONGODB_HOME/data
LOG_PATH=$MONGODB_HOME/logs/mongodb.log
MONGODB_PORT=$1
$MONGODB_HOME/bin/mongod --rest --replSet=testset --dbpath=$DATA_PATH --port=$MONGODB_PORT --fork --logpath=$LOG_PATH
用戶一:db1
>sh start.sh 30000
用戶一:db2
>sh start.sh 40000
此時,兩個用戶下的mongodb沒有任何關係,日誌文件輸出
Fri Aug 5 23:35:01 [startReplSets] replSet can't get local.system.replset config from self or any seed (EMPTYCONFIG)
Fri Aug 5 23:35:01 [startReplSets] replSet info you may need to run replSetInitiate -- rs.initiate() in the shell
意思是還沒初始化,如今咱們來初始化兩個mongodb,使之創建master-slave關係
在db1下
>./mongo --port=30000
MongoDB shell version: 1.8.2
connecting to: 127.0.0.1:30000/test
>use admin
>cfg={
"_id" :
"myset",
"version" : 1,
"members" : [
{
"_id" : 0,
"host" :
"10.16.46.113:30000"
},
{
"_id" : 1,
"host" :
"10.16.46.113:40000"
}
]}
>rs.initiate(cfg)
稍等片刻,在db1的日誌裏就能夠看到以下信息,代表db1上的mongodb已經成爲master
Fri Aug 5 23:43:05 [rs Manager] replSet info electSelf 0
Fri Aug 5 23:43:05 [rs Manager] replSet PRIMARY
在控制檯中經過
rs.status()
查看它們之間的關係
如今來往集羣中添加一個mongodb
在用戶三:db3中啓動mongodb
>sh start.sh 50000
起好後
在master中將db3的mongodb加到集羣中
testset:PRIMARY>rs.add(
"10.16.46.113:50000")
稍等片刻,經過rs.status()查看集羣中的節點
測試master停機的狀況,看一下java客戶端調用狀況,停掉後客戶端會有異常日誌,但並無像以前的master-slave那樣報錯
經過rs.status(),另一個節點已經成爲PRIMARY服務節點