標籤:
1:資料同步的原理:
當Primary節點完成資料操作後,Secondary會做出一系列的動作保證資料的同步:1:檢查自己local庫的oplog.rs集合找出最近的時間戳記。2:檢查Primary節點local庫oplog.rs集合,找出大於此時間戳記的記錄。3:將找到的記錄插入到自己的oplog.rs集合中,並執行這些操作。
2:查看複本集的資訊
gechongrepl:PRIMARY> rs.status(){"set" : "gechongrepl","date" : ISODate("2015-07-02T02:38:15Z"),"myState" : 1,"members" : [{"_id" : 6,"name" : "192.168.91.144:27017","health" : 1,"state" : 7,"stateStr" : "ARBITER","uptime" : 1678,"lastHeartbeat" : ISODate("2015-07-02T02:38:14Z"),"lastHeartbeatRecv" : ISODate("2015-07-02T02:38:14Z"),"pingMs" : 1},{"_id" : 10,"name" : "192.168.91.135:27017","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 1678,"optime" : Timestamp(1435803750, 1),"optimeDate" : ISODate("2015-07-02T02:22:30Z"),"lastHeartbeat" : ISODate("2015-07-02T02:38:14Z"),"lastHeartbeatRecv" : ISODate("2015-07-02T02:38:13Z"),"pingMs" : 1,"syncingTo" : "192.168.91.148:27017"},{"_id" : 11,"name" : "192.168.91.148:27017","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 1698,"optime" : Timestamp(1435803750, 1),"optimeDate" : ISODate("2015-07-02T02:22:30Z"),"electionTime" : Timestamp(1435803023, 1),"electionDate" : ISODate("2015-07-02T02:10:23Z"),"self" : true},{"_id" : 12,"name" : "192.168.91.134:27017","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 1655,"optime" : Timestamp(1435803750, 1),"optimeDate" : ISODate("2015-07-02T02:22:30Z"),"lastHeartbeat" : ISODate("2015-07-02T02:38:14Z"),"lastHeartbeatRecv" : ISODate("2015-07-02T02:38:14Z"),"pingMs" : 1,"syncingTo" : "192.168.91.135:27017"}],"ok" : 1}
myState:1表示primarystate:1表示primary;7表示arbiteruptime:成員的線上時間lastHeartbeat:當前執行個體到遠端最近一次成功接收到心跳包的時間pingMs:本執行個體到遠端路由包的來回時間optime:讀取oplog.rs集合。本執行個體最近一次的更改時間。
MongoDB通過lastHeartbeat來實現自動轉移。
mongod執行個體每隔兩秒就會向其他成員發送一個心跳包,並且通過rs.status()中返回的成員的health來判斷成員的狀態。如果primary節點不可用了,那麼複製集中的所有secondary節點都會觸發一次選舉操作。選出新的primary節點。如果secondary節點有多個,則會選舉擁有最新oplog時間戳記錄的或者有較高許可權的節點成為primary(注意:如果secondary停止時間過長,導致primary節點的oplog內容被迴圈寫覆蓋掉,則需要手動同步secondary節點)
MongoDB複本集配置系列十一:MongoDB 資料同步原理和自動容錯移轉的原理