1. 程式人生 > >MongoDB復制集管理優化

MongoDB復制集管理優化

優先 過程 密鑰 內容 clu 類型 ember 執行 保存

本文章將介紹MongoDB復制集的基本配置和管理,分別包括配置從節點可以讀取數據、查看復制集狀態、更改oplog大小、配置帶認證的復制集

  • 復制集的選舉原理

復制是基於操作日誌oplog,相當於Mysql中的二進制日誌,只記錄發生改變的記錄。復制是將主節點的oplog日誌同步並應用到其他從節點的過程。

  • 選舉的原理

節點的類型分為標準(host)節點、被動(passive)節點和仲裁(arbiter)節點。

  • 標準節點可能被選舉為活躍(primary)節點,有選舉權。
  • 被動節點有完整副本,不可能成為活躍節點,有選舉權。
  • 仲裁節點不復制數據,不可能成為活躍節點,只有選舉權。
  • 標準節點和被動節點的區別:priority值高的是標準節點,低的是被動節點。
  • 選舉規則是票高者獲勝,priority是優先權為0~1000的值,相當於額外增加0~1000的票數。選舉結果:票高者獲勝。若票數相同:數據新者獲勝。

  • 配置復制集的優先級
  • 先創建4個實例 教程
  • 設置2個標準節點,一個被動節點,一個仲裁節點。

    > cfg={"_id":"kgcrs","members":[{"_id":0,"host":"192.168.86.128:27017","priority":100},{"_id":1,"host":"192.168.86.128:27018","priority":100},{"_id":2,"host":"192.168.86.128:27019","priority":0},{"_id":3,"host":"192.168.86.128:27020","arbiterOnly":true}]}

技術分享圖片

    > rs.initiate(cfg)    //初始化配置
    > rs.isMaster()    //查看復制集的狀態

技術分享圖片

  • 模擬主節點故障

    # mongod -f /etc/mongod.conf --shutdown   //主節點服務關掉
    # mongo --port 27018
    > rs.isMaster()   //查看節點的身份狀態  主節點已經換到27018

    技術分享圖片

  • 模擬所有標準節點故障

    # mongod -f /etc/mongod.conf --shutdown   
    # mongod -f /etc/mongod2.conf --shutdown    
    # mongo --port 27019
    > rs.isMaster()   //查看節點身份狀態 可以看到主節點沒有了(當所有標準節點故障,被動節點也不能成為主節點)

    技術分享圖片

  • 允許從節點讀取數據
  • 默認的MongoDB復制集的基本配置和管理,可以使用rs.slaveOK() 命令允許能夠在從節點讀取數據。

    # mongo --port 27018
    > rs.slaveOk()        //允許默認從節點讀取數據
    > show dbs

    技術分享圖片

  • 查看復制狀態信息

  • 查看Master的oplog元數據信息:

    > rs.printReplicationInfo()
  • 查看Slave的同步狀態:

    > rs.printSlaveReplicationInfo()
  • 查看主從配置信息:

    > rs.conf() //或db.system.replset.find()

技術分享圖片

  • 更改oplog大小
  • oplog簡介:

oplog:operations log的簡寫,存儲在一個特殊的數據庫中(local),oplog就存儲在其中的oplog.$main集合裏面,這個集合是一個固定集合,新操作會自動替換舊的操作,以保證oplog不會超過預設的大小,其中的每個文檔都代表主節點上執行的一個操作,oplog會包含所有對數據有修改的的操作(查詢操作不會記錄),默認下,oplog大小會占用64位的實例5%的可用磁盤空間。
mongo復制的過程:主節點應用業務操作修改到數據庫中,然後記錄這些操作到oplog中,從節點復制這些oplog,然後應用這些修改。ps:這些操作是異步的。如果從節點的操作已經被主節點落下很遠,oplog日誌在從節點還沒執行完,oplog可能已經輪滾一圈了,從節點跟不上同步,復制就會停下,從節點需要重新做完整的同步,為了避免此種情況,盡量保證主節點的oplog足夠大,能夠存放相當長時間的操作記錄。


    > use local
    >  db.oplog.rs.find()             //查看.oplog
    > db.oplog.rs.stats()             //查看.oplog內容
    > rs.printReplicationInfo()    //查詢oplog的大小及保存的操作記錄持續的時長

技術分享圖片

  • 這裏僅是單實例27018的修改,其他實例參照如下
  • 關閉服務

     # mongo --port 27018
     > use admin
     > db.shutdownServer()      //關閉服務
  • 註銷replication:相關啟動參數,並修改port端口號27028

    # vim /etc/mongod2.conf 

    技術分享圖片

  • 備份當前節點的所有oplog記錄

    # mongodump --port 27028 --db local --collection ‘oplog.rs‘
    # mongo --port 27028
    > use local
    > db.oplog.rs.drop()    //刪除原來的oplog
    > db.runCommand( { create: "oplog.rs", capped: true, size: (2 * 1024 * 1024 * 1024) } )    //創建新的
    > use admin
    > db.shutdownServer()

    技術分享圖片
    技術分享圖片

  • 開啟replication:相關啟動參數,並修改port端口號27018

    # vim /etc/mongod2.conf 

    技術分享圖片

    mongod -f /etc/mongod2.conf

    mongo //進入主節點

    rs.stepDown() //讓出主節點位置

  • 部署認證復制
  • 在主節點創建root用戶

    kgcrs:PRIMARY> use admin
    kgcrs:PRIMARY> db.createUser({"user":"root","pwd":"123","roles":["root"]})
  • 生成4個實例的密鑰文件

     # cd /usr/bin/
     # echo "kgcrs key"> kgcrskey1
     # echo "kgcrs key"> kgcrskey2
     # echo "kgcrs key"> kgcrskey3
     # echo "kgcrs key"> kgcrskey4
     # chmod 600 kgcrskey{1..4}
    
     # vim /etc/mongod.conf  (mongod2.conf /mongod3.conf/mongod4.conf 都要改)
    security:
       keyFile: /usr/bin/kgcrskey1     //(分別為 kgcrskey2、kgcrskey3、kgcrskey4)
       clusterAuthMode: keyFile
  • 4個實例依次重啟

    # mongod -f /etc/mongod.conf --shutdown
    # mongod -f /etc/mongod.conf
  • 進入主節點驗證

    > show dbs   #無法查看數據庫
    > rs.status()   #無法查看復制集

    技術分享圖片

    > use admin    #身份登錄驗證
    > db.auth("root","123")
    > rs.status()  #可以查看數據庫
    > show dbs    #可以查看復制集

    技術分享圖片

MongoDB復制集管理優化