Mongodb的副本集集羣設置

mongodb副本集介紹

mongodb支持兩種類型的集羣架構:mysql

  1. 相似於mysql的master/slave的主從複製集羣,不過此集羣已經不多使用了,貌似不支持故障自動轉移;
  2. 副本集集羣:多個節點共屬於同一個副本集,有一個主節點和若干的從節點,主節點讀寫,從節點只讀。支持故障自動轉移,是目前經常使用的架構;

mongodb副本集工做原理

工做原理以下:
sql

  1. mongodb有一個local庫,此庫記錄了全部的mongodb副本集元數據和oplog信息,此庫維護着oplog日誌,此日誌位於local庫中的oplog.rc collection中,此collection只有開啓了副本集功能加入副本集以後纔會生成。oplog日誌是有大小的,不像mysql的二進制日誌能夠一直寫入。此日誌大小默認爲可用磁盤空間的5%,不滿1G按照1G計算,大小能夠本身定義;
  2. 主節點把全部的數據變化寫入到oplog中,從節點複製主節點的oplog並保存到本身的oplog進行數據重現以保持主從節點的數據一致;
  3. 主節點每2秒往各從節點發送一次心跳信息,若是各從節點10秒鐘尚未收到主節點的心跳信息則會觸發選舉;mongodb

    注意:
    1. 副本集的節點個數至少須要3個以上,必須有一個仲裁節點,預防發生腦裂行爲;
    2. 只有主節點纔會寫oplog,從節點只能從主節點複製oplog。可是每一個節點都會持有一個oplog,由於因此節點(除了特殊節點)均可能會被選舉爲主節點;

mongodb選舉影響因素

  1. 心跳信息
  2. 各節點優先級
  3. optime:數據副本新鮮度
  4. 網絡鏈接

觸發選舉的因素

  1. 主節點收到stepDown指令
  2. 出現優先級更高的節點
  3. 主節點聯繫不到大多數節點

mongodb副本集的特殊節點

  1. 0優先級的節點:此節點能夠和正常節點同樣持有副本集,也能夠參與選舉,可是不會主動被選舉爲主節點。因此一般做爲冷備節點使用,經常使用於異地容災架構;
  2. 被隱藏的從節點:此節點首先必須是0優先級的節點,並且此節點對客戶端不可見,在mongodb的不少狀態信息中也看不到它,可是它有用選舉權;
  3. 延遲複製節點:必須是0優先級節點,它也不能成爲主節點,可是數據落後於主節點,經常使用於防止人工誤刪除數據;
  4. arbiter:仲裁節點,安裝mongodb就行,不持有副本集,沒有選舉權;

mongodb副本集步驟

  1. 克隆全部的數據庫;
  2. 複製oplog到本地,應用全部的數據改變操做;
  3. 爲全部collection構建索引

副本集具體操做

  1. 副本集各節點配置文件須要添加以下配置:
    • replSet:副本集名字 相同副本集節點都須要設置爲一致的;
    • replIndexprefetch:{none|_id_only|all} 實現索引預取,_id_only表示只取_id_字段索引;
  2. 啓動mongodb服務,主節點執行rs.initiate()操做,初始化數據集;
  3. 主節點執行rs.add(),添加各從節點,此時執行rs.status()能夠看到各個節點的信息,執行db.isMaster()能夠查看本身是否爲主節點;
  4. 從節點此時還沒法進行讀取操做,從節點執行rs.slaveOk()操做表示開啓從節點讀取操做,此時從節點能夠正常查詢數據;
  5. 各節點執行rs.printReplicationInfo()能夠查看本身的oplog同步時間信息;
  6. 各節點執行rs.printSlaveReplicationInfo()能夠查看各從節點是否落後於主節點;
  7. 此時主節點故障則其餘從節點會自動進行切換操做,也能夠執行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信息:網絡

  1. conf=rs.conf() 把當前配置信息賦值給一個變量;
  2. conf.members[1].priority=2 表示修改節點1的優先級爲2。以此類推,全部配置均可以這樣修改;
  3. rs.reconf(conf) 從新應用修改好的配置信息

配置副本集遇到的問題:架構

  1. 主節點沒法加進從節點:
    緣由是從節點不能執行rs.initiate()操做,不然每一個節點都會把本身變成主節點,再次添加會報錯,提示節點ID都是相同的;
  2. 從節點沒法進行數據讀取: 沒有執行rs.slaveOK()的緣由。注意:主節點能夠讀寫,從節點只讀。並且不少操做只能在主節點進行。
相關文章
相關標籤/搜索