環境:
192.168.99.129 master
192.168.99.130 slave1
1、配置復制集
在兩台服務器上分別執行
mongod --replSet "rs0"
執行mongo命令,先添加一台
rs.initiate( { _id : "rs0", members: [ { _id : 0, host : "master:27017" } ] })
再添加另外一台
rs.add("slave1")
執行rs.status()查看復制集節點的狀態
rs0:PRIMARY> rs.status() { "set" : "rs0", "date" : ISODate("2017-01-01T05:08:29.623Z"), "myState" : 1, "term" : NumberLong(3), "heartbeatIntervalMillis" : NumberLong(2000), "optimes" : { "lastCommittedOpTime" : { "ts" : Timestamp(1483247303, 1), "t" : NumberLong(3) }, "appliedOpTime" : { "ts" : Timestamp(1483247303, 1), "t" : NumberLong(3) }, "durableOpTime" : { "ts" : Timestamp(1483247303, 1), "t" : NumberLong(3) } }, "members" : [ { "_id" : 0, "name" : "master:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 38, "optime" : { "ts" : Timestamp(1483247303, 1), "t" : NumberLong(3) }, "optimeDate" : ISODate("2017-01-01T05:08:23Z"), "infoMessage" : "could not find member to sync from", "electionTime" : Timestamp(1483247282, 1), "electionDate" : ISODate("2017-01-01T05:08:02Z"), "configVersion" : 2, "self" : true }, { "_id" : 1, "name" : "slave1:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 33, "optime" : { "ts" : Timestamp(1483247303, 1), "t" : NumberLong(3) }, "optimeDurable" : { "ts" : Timestamp(1483247303, 1), "t" : NumberLong(3) }, "optimeDate" : ISODate("2017-01-01T05:08:23Z"), "optimeDurableDate" : ISODate("2017-01-01T05:08:23Z"), "lastHeartbeat" : ISODate("2017-01-01T05:08:29.007Z"), "lastHeartbeatRecv" : ISODate("2017-01-01T05:08:27.902Z"), "pingMs" : NumberLong(0), "syncingTo" : "master:27017", "configVersion" : 2 } ], "ok" : 1 }
2、驗證復制集數據同步
在主節點插入數據后,看從節點是否存在同樣的數據,但在從節點執行查詢數據庫指令時拋錯
rs0:SECONDARY> show dbs 2016-12-31T20:49:59.362-0800 E QUERY [main] Error: listDatabases failed:{ "ok" : 0, "errmsg" : "not master and slaveOk=false", "code" : 13435, "codeName" : "NotMasterNoSlaveOk" } :
因為從節點默認是不允許讀寫的,解決這個問題,有兩種方式
- 在從節點上執行rs.slaveOk()
- 或者在主節點上執行db.getMongo().setSlaveOk()
下面開始驗證
首先在主節點上插入數據
rs0:PRIMARY> db.student.insert({"name":"xiaoming"}) WriteResult({ "nInserted" : 1 }) rs0:PRIMARY> db.student.find() { "_id" : ObjectId("58688fa863a36c070316cd69"), "name" : "xiaoming" }
然后在從節點上可以查詢到這條數據
rs0:SECONDARY> db.student.find() { "_id" : ObjectId("58688fa863a36c070316cd69"), "name" : "xiaoming" }
3、驗證復制集故障遷移
mongodb的復制集至少有3個節點才會自動故障遷移,當只有兩個節點時,主節點掛掉,從節點的日志顯示
Not starting an election, since we are not electable due to: Not standing for election because I cannot see a majority (mask 0x1)
所以要再添加一個節點,才能驗證,執行如下命令啟動第三個節點
mongod --replSet "rs0" --port 27018 --dbpath /data/db2 &
在主節點上執行如下命令,將第三個節點添加到集群中
rs.add("slave1:27018")
此時將主節點的進程殺掉,在其他從節點上執行rs.status()查看結果如下:
"members" : [ { "_id" : 0, "name" : "master:27017", "health" : 0, "state" : 8, "stateStr" : "(not reachable/healthy)", "uptime" : 0, "optime" : { "ts" : Timestamp(0, 0), "t" : NumberLong(-1) }, "optimeDurable" : { "ts" : Timestamp(0, 0), "t" : NumberLong(-1) }, "optimeDate" : ISODate("1970-01-01T00:00:00Z"), "optimeDurableDate" : ISODate("1970-01-01T00:00:00Z"), "lastHeartbeat" : ISODate("2017-01-01T14:41:23.260Z"), "lastHeartbeatRecv" : ISODate("2017-01-01T14:41:03.671Z"), "pingMs" : NumberLong(0), "lastHeartbeatMessage" : "Connection refused", "configVersion" : -1 }, { "_id" : 1, "name" : "slave1:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 317, "optime" : { "ts" : Timestamp(1483281677, 2), "t" : NumberLong(8) }, "optimeDate" : ISODate("2017-01-01T14:41:17Z"), "infoMessage" : "could not find member to sync from", "electionTime" : Timestamp(1483281677, 1), "electionDate" : ISODate("2017-01-01T14:41:17Z"), "configVersion" : 3, "self" : true }, { "_id" : 2, "name" : "slave1:27018", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 75, "optime" : { "ts" : Timestamp(1483281677, 2), "t" : NumberLong(8) }, "optimeDurable" : { "ts" : Timestamp(1483281677, 2), "t" : NumberLong(8) }, "optimeDate" : ISODate("2017-01-01T14:41:17Z"), "optimeDurableDate" : ISODate("2017-01-01T14:41:17Z"), "lastHeartbeat" : ISODate("2017-01-01T14:41:23.252Z"), "lastHeartbeatRecv" : ISODate("2017-01-01T14:41:22.253Z"), "pingMs" : NumberLong(0), "syncingTo" : "slave1:27017", "configVersion" : 3 } ], "ok" : 1 }