mongodb副本集介紹
mongodb支持兩種類型的集羣架構:mysql
- 相似於mysql的master/slave的主從複製集羣,不過此集羣已經不多使用了,貌似不支持故障自動轉移;
- 副本集集羣:多個節點共屬於同一個副本集,有一個主節點和若干的從節點,主節點讀寫,從節點只讀。支持故障自動轉移,是目前經常使用的架構;
mongodb副本集工做原理
工做原理以下:
sql
- mongodb有一個local庫,此庫記錄了全部的mongodb副本集元數據和oplog信息,此庫維護着oplog日誌,此日誌位於local庫中的oplog.rc collection中,此collection只有開啓了副本集功能加入副本集以後纔會生成。oplog日誌是有大小的,不像mysql的二進制日誌能夠一直寫入。此日誌大小默認爲可用磁盤空間的5%,不滿1G按照1G計算,大小能夠本身定義;
- 主節點把全部的數據變化寫入到oplog中,從節點複製主節點的oplog並保存到本身的oplog進行數據重現以保持主從節點的數據一致;
主節點每2秒往各從節點發送一次心跳信息,若是各從節點10秒鐘尚未收到主節點的心跳信息則會觸發選舉;mongodb
注意:
- 副本集的節點個數至少須要3個以上,必須有一個仲裁節點,預防發生腦裂行爲;
- 只有主節點纔會寫oplog,從節點只能從主節點複製oplog。可是每一個節點都會持有一個oplog,由於因此節點(除了特殊節點)均可能會被選舉爲主節點;
mongodb選舉影響因素
- 心跳信息
- 各節點優先級
- optime:數據副本新鮮度
- 網絡鏈接
觸發選舉的因素
- 主節點收到stepDown指令
- 出現優先級更高的節點
- 主節點聯繫不到大多數節點
mongodb副本集的特殊節點
- 0優先級的節點:此節點能夠和正常節點同樣持有副本集,也能夠參與選舉,可是不會主動被選舉爲主節點。因此一般做爲冷備節點使用,經常使用於異地容災架構;
- 被隱藏的從節點:此節點首先必須是0優先級的節點,並且此節點對客戶端不可見,在mongodb的不少狀態信息中也看不到它,可是它有用選舉權;
- 延遲複製節點:必須是0優先級節點,它也不能成爲主節點,可是數據落後於主節點,經常使用於防止人工誤刪除數據;
- arbiter:仲裁節點,安裝mongodb就行,不持有副本集,沒有選舉權;
mongodb副本集步驟
- 克隆全部的數據庫;
- 複製oplog到本地,應用全部的數據改變操做;
- 爲全部collection構建索引
副本集具體操做
- 副本集各節點配置文件須要添加以下配置:
- replSet:副本集名字 相同副本集節點都須要設置爲一致的;
- replIndexprefetch:{none|_id_only|all} 實現索引預取,_id_only表示只取_id_字段索引;
- 啓動mongodb服務,主節點執行rs.initiate()操做,初始化數據集;
- 主節點執行rs.add(),添加各從節點,此時執行rs.status()能夠看到各個節點的信息,執行db.isMaster()能夠查看本身是否爲主節點;
- 從節點此時還沒法進行讀取操做,從節點執行rs.slaveOk()操做表示開啓從節點讀取操做,此時從節點能夠正常查詢數據;
- 各節點執行rs.printReplicationInfo()能夠查看本身的oplog同步時間信息;
- 各節點執行rs.printSlaveReplicationInfo()能夠查看各從節點是否落後於主節點;
- 此時主節點故障則其餘從節點會自動進行切換操做,也能夠執行rs.stepDown()操做手動把主節點下線,此時主節點會自動切換爲從節點;
mongodb副本集經常使用操做命令:
rs.status() 查看副本集狀態信息,包括各節點信息;
rs.initiate() 主節點用於進行副本集初始化;
rs.conf() 查看副本集配置信息
rs.reconf() 應用指定的副本集配置信息
rs.add() 添加從節點
rs.addArb() 添加仲裁節點
rs.stepDown() 手動把主節點下線
rs.freeze() 表示指定時間內不容許進行主節點切換
rs.remove() 刪除指定從節點
rs.slaveOk() 從節點容許讀操做
rs.printReplicationInfo() 查看本身的oplog time信息
rs.printSlaveReplicationInfo() 查看各從節點是否落後於主節點
db.isMaster() 查看本身是否爲主節點數據庫
修改副本集conf信息:網絡
- conf=rs.conf() 把當前配置信息賦值給一個變量;
- conf.members[1].priority=2 表示修改節點1的優先級爲2。以此類推,全部配置均可以這樣修改;
- rs.reconf(conf) 從新應用修改好的配置信息
配置副本集遇到的問題:架構
- 主節點沒法加進從節點:
緣由是從節點不能執行rs.initiate()操做,不然每一個節點都會把本身變成主節點,再次添加會報錯,提示節點ID都是相同的;
- 從節點沒法進行數據讀取: 沒有執行rs.slaveOK()的緣由。注意:主節點能夠讀寫,從節點只讀。並且不少操做只能在主節點進行。