2個Standard節點+1個Arbiter節點 搭建MongoDB Replication Sets
建立目錄[root@localhost ~]# mkdir -p /data/replset/r0[root@localhost ~]# mkdir -p /data/replset/r1[root@localhost ~]# mkdir -p /data/replset/r2[root@localhost ~]# mkdir -p /data/replset/key[root@localhost ~]# mkdir -p /data/replset/log
建立KEY[root@localhost ~]# echo "replset1 key" > /data/replset/key/r0[root@localhost ~]# echo "replset1 key" > /data/replset/key/r1[root@localhost ~]# echo "replset1 key" > /data/replset/key/r2[root@localhost ~]# chmod 600 /data/replset/key/r* //600,防止其它程式改寫此KEY
/Apps/mongo/bin/mongod --dbpath=/data/replset/r0 --replSet replset1 --keyFile /data/replset/key/r0 --port 28010
/Apps/mongo/bin/mongod --dbpath=/data/replset/r1 --replSet replset1 --keyFile /data/replset/key/r1 --port 28011
/Apps/mongo/bin/mongod --dbpath=/data/replset/r2 --replSet replset1 --keyFile /data/replset/key/r2 --port 28012
註:--keyFile /data/key/r0 加了這個後,MongVUE就連不到了
改用下面的就行了(這是裡為方便看日誌,直接在命令列輸出查看)
/Apps/mongo/bin/mongod --dbpath=/data/replset/r0 --replSet replset1 --port 28010 --directoryperdb
/Apps/mongo/bin/mongod --dbpath=/data/replset/r1 --replSet replset1 --port 28011 --directoryperdb
/Apps/mongo/bin/mongod --dbpath=/data/replset/r2 --replSet replset1 --port 28012 --directoryperdb
正式運行要後台運行就用下面的:
/Apps/mongo/bin/mongod --dbpath=/data/replset/r0 --replSet replset1 --port 28010 --logpath=/data/replset/log/r0.log --logappend --fork --directoryperdb
/Apps/mongo/bin/mongod --dbpath=/data/replset/r1 --replSet replset1 --port 28011 --logpath=/data/replset/log/r1.log --logappend --fork --directoryperdb
/Apps/mongo/bin/mongod --dbpath=/data/replset/r2 --replSet replset1 --port 28012 --logpath=/data/replset/log/r2.log --logappend --fork --directoryperdb
初始化複本集:
/Apps/mongo/bin/mongo --port 28010config_replset1 = {_id:"replset1",members:[{_id:0,host:"127.0.0.1:28010",priority:4},{_id:1,host:"127.0.0.1:28011",priority:2},{_id:2,host:"127.0.0.1:28012",arbiterOnly : true}]}注意arbiter仲裁節點只投票,不接收複製的資料!
rs.initiate(config_replset1);
/Apps/mongo/bin/mongo --port 28010/Apps/mongo/bin/mongo --port 28011/Apps/mongo/bin/mongo --port 28012
//向PRIMARY寫入一條資料
//SECONDARY不能寫,而設定slaveOk後,可能從SECONDARY讀取資料預設情況下SECONDARY不能讀寫,要設定db.getMongo().setSlaveOk();才可以從SECONDARY讀取replSet裡只能有一個Primary庫,只能從Primary寫資料,不能向SECONDARY寫資料
//ARBITER 讀取寫入都不能
注意arbiter仲裁節點只投票,不接收複製的資料!,不接收PRIMARY寫入的mydb的資料!
從ARBITER節點看到, ARBITER 只存放了local.system.replset裡的複本集的配置資訊,沒有oplog.rs,而ARBITER 也沒有接收PRIMARY寫入的mydb的資料!說明ARBITER"僅僅起投票作用,而不接收複製的資料"!
看看PRIMARY的local.slaves,看到只有一個slave(而不是兩個),這個slave就是SECONDARY節點,這裡ARBITER節點不是PRIMARY的slave,
這也說明ARBITER"僅僅起投票作用,而不接收複製的資料"!
故障切換測試:
Ctrl+C退出PRIMARY進程, PRIMARY節點28010就DOWN了,
看看原來的SECONDARY(28011)節點,再看看ARBITER節點(28012)PRIMARY節點28010 DOWN了之後, ARBITER就投票給SECONDARY 28011, SECONDARY 就成為新的PRIMARY節點
總結:1:當複本集的總可投票數為偶數時,可能出現無法選舉出主節點的情況,mongod會提示:
2個Standard節點群組成Replication Sets是不合理的,因為不具備故障切換能力!A:當SECONDARY Down掉,剩下一個PRIMARY,此時複本集運行不會出問題,因為不用選擇PRIMARY節點B:當PRIMARY Down掉,此時複本集只剩下一個SECONDARY,它只有1票,不超過總節點數的半數,它不會選舉自己為PRIMARY節點!提示如下:3個Standard節點群組成Replication Sets是可以的,當PRIMARY節點DOWN了還是可以再選出一個PRIMARY節點,此時要馬上修複DOWN機的節點,因為不修複的話如果當前的PRIMARY節點再DOWN了,剩下一個SECONDARY節點是不能選出PRIMARY節點的!
可行方案: 3個Standard節點 或 2個Standard節點+1個Arbiter節點
個人感覺如果只有2台伺服器,可以將優先順序高的Standard部署到1台高效能的伺服器,然後將另一個Standard節點+1個Arbiter節點部署到另一台伺服器,這樣PRIMARY節點在1台伺服器,SECONDARY結點和ARBITER節點和另一台伺服器,這樣無論哪個節點壞了,ReplSet同樣可以服務