MongoDB複製集(實現選舉複製、故障切換、升級oplog大小、認證複製)

來源:互聯網
上載者:User

標籤:用戶端   技術   協助   root   寫入   ann   not   http   alt   

什麼是複製集?
  • 複製集(replica sets)是額外的資料副本,是跨多個伺服器同步資料的過程,複製集提供了冗餘並增加了資料可用性,通過複製集可以對硬體故障和中斷服務進行恢複。
複製集的優勢
  • 讓資料更安全。
  • 高資料可用性。
  • 災難恢複。
  • 無停機維護(如備份、索引重建、容錯移轉)
  • 讀縮放(額外的副本讀取)
  • 複本集對應用程式是透明的。
複製集概述
  • MongoDB複製集是額外的資料副本,複製集提供了冗餘和增加資料可用性。
  • MongoDB的複製集至少需要兩個節點,其中主節點負責處理用戶端請求,從節點負責複製主節點上的資料。
  • MongoDB複製集可以實現群集的高可用,當主節點出現故障時會自動切換。
  • 複製是基於動作記錄oplog,相當於MySQL中的二進位日誌,只記錄發生改變的記錄。複製是將主節點的oplog日誌同步並應用到其他節點的過程。
  • 節點類型分為標準節點、被動節點、仲裁節點。只有標準節點可能被選舉為活躍(主)節點。
  • 盡量保證主節點的oplog足夠大,能夠存放相當長時間的操作記錄。
複製集服務配置1、建立多執行個體

mkdir -p /data/mongodb/mongodb{2,3,4} //建立資料目錄
mkdir logs
touch logs/mongodb{2,3,4}.log //建立記錄檔
cd logs/
chmod 777 *.log //賦予許可權

  • 修改多執行個體設定檔

vim /etc/mongod2.conf

# where to write logging data.systemLog:  destination: file  logAppend: true  path: /data/mongodb/logs/mongodb2.log    //記錄檔存放位置# Where and how to store data.storage:  dbPath: /data/mongodb/mongodb2   //資料檔案存放位置  journal:    enabled: true#  engine:#  mmapv1:#  wiredTiger:# how the process runsprocessManagement:  fork: true  # fork and run in background  pidFilePath: /var/run/mongodb/mongod.pid  # location of pidfile  timeZoneInfo: /usr/share/zoneinfo# network interfacesnet:  port: 27018    //監聽連接埠及IP地址  bindIp: 0.0.0.0  # Listen to local interface only, comment to listen on all interfaces.#security:#operationProfiling:replication:  replSetName: abc   //開啟主從複製集功能,每個節點都要配置相同名稱

2、配置三個節點的複製集
  • 如上建立多執行個體完成後,修改完成設定檔後,依次重啟每個服務。

mongod -f /etc/mongod.conf --shutdown
mongod -f /etc/mongod.conf
mongod -f /etc/mongod2.conf
mongod -f /etc/mongod3.conf
mongod -f /etc/mongod4.conf

  • 進入主節點配置複製集

mongo

> show dbs    //查看資料庫> rs.status()   //查看複製集狀態> cfg={"_id":"abc","members":[{"_id":0,"host":"192.168.144.112:27017"},{"_id":1,"host":"192.168.144.112:27018"},{"_id":2,"host":"192.168.144.112:27019"}]}    //配置複製集節點IP> rs.initiate(cfg)      //初始化配置時保證從節點沒有資料> rs.status()   //此時再查看複製集狀態 
  • 當能夠看到狀態,可以看到各節點狀態代表複製集配置完成。

3、複製集的節點添加和刪除
abc:PRIMARY> rs.add("192.168.144.112:27020")    //添加節點abc:PRIMARY> rs.remove("192.168.144.112:27020")    //刪除節點> rs.status()

4、容錯移轉切換自動切換

ps aux | grep mongod

  • 類比故障,複製集完成自動切換

kill -9 46374


手動切換
abc:PRIMARY> rs.freeze(30)      //暫停30s不參與選舉abc:PRIMARY> rs.stepDown(60,30)   //交出主節點位置,維持從節點狀態不少於60秒,等待30秒使主節點和從節點日誌同步
MongoDB複製選舉1、複製原理
  • 複製是基於動作記錄oplog,相當於MySQL中的二進位日誌,只記錄發生改變的記錄,複製是將主節點的oplog日誌同步並應用到其他從節點的過程。
2、選舉的原理
  • 節點類型分為:標準(host)節點、被動(passive)和仲裁(arbiter)節點。

  • (1)只有標準節點可以被選舉為活躍(primary)節點,有選舉權,被動節點有完整副本,不可能成為活躍節點,有選舉權,仲裁節點不複製資料,不可能成為活躍節點,只有選舉權。
  • 標準節點與被動節點的區別:priority優先順序值高者是標準節點,低著則為被動節點。
  • 選舉規則是票數高者獲勝,priority是優先權為0~100的值,相當於額外增加的0~100的票數。
複製選舉配置
  • 如上一小節,開啟設定檔中複製功能:
replication:  replSetName: abc

選舉節點設定

mongo //進入資料庫

cfg={"_id":"abc","members":[{"_id":0,"host":"192.168.144.112:27017","priority":100},{"_id":1,"host":"192.168.144.112:27018","priority":100},{"_id":2,"host":"192.168.144.112:27019","priority":0},{"_id":3,"host":"192.168.144.112:27020","arbiterOnly":true}]}//設定節點IP連接埠以及節點類型> rs.initiate(cfg)    //初始化資料庫> rs.isMaster()       //查看狀態

  • 在主節點所有的修改操作將會被記錄在oplog日誌中,下面將類比修改操作,以及查看oplog日誌記錄。
abc:PRIMARY> use kgc   //建立資料庫abc:PRIMARY> db.t1.insert({"id":1,"name":"tom"})   //建立集合t1並插入資料abc:PRIMARY> db.t1.insert({"id":2,"name":"jerry"})abc:PRIMARY> db.t1.find()   //查看集合資料abc:PRIMARY> db.t1.update({"id":2},{$set:{"name":"jack"}})    //修改集合資料abc:PRIMARY> db.t1.remove({"id":1})    //刪除資料abc:PRIMARY> use local     //進入oplog所在資料庫abc:PRIMARY> show collections    //查看所有集合    oplog.rs                    //oplog集合abc:PRIMARY> db.oplog.rs.find()     //查看日誌記錄所有操作,此時從節點會從oplog中同步資料
類比標準節點故障
  • 當標準節點1選舉為primary時,為了類比故障,直接選擇關閉節點1

mongod -f /etc/mongod.conf --shutdown

  • 進入節點2,查看節點2狀態
  • 此時會選舉第二個標準節點為主節點

mongo --port 27018

  • 當繼續類比標準節點2故障時,此時兩個標準節點都不能工作,此時進入被動節點三,發現被動節點三不能成為主節點

mongo --port 27019

允許從節點讀取資料
  • 在標準節點上寫入資料,其他節點上也會同步複製,如何從從節點上讀取資料?

  • 進入從節點資料庫

[[email protected]]# mongo --port 27018

abc:SECONDARY> show dbs   //此時從節點不允許讀取資料abc:SECONDARY> rs.slaveOk()        //允許預設從節點讀取資料abc:SECONDARY> show dbs   //再次查看時就可以了
查看複製狀態資訊
abc:SECONDARY> rs.help()     //查看命令協助手冊abc:SECONDARY> rs.printReplicationInfo()configured oplog size:   990MBlog length start to end: 1544secs (0.43hrs)oplog first event time:  Mon Jul 16 2018 05:49:12 GMT+0800 (CST)oplog last event time:   Mon Jul 16 2018 06:14:56 GMT+0800 (CST)now:                     Mon Jul 16 2018 06:14:59 GMT+0800 (CST)abc:SECONDARY> rs.printSlaveReplicationInfo()source: 192.168.235.200:27018    syncedTo: Mon Jul 16 2018 06:16:16 GMT+0800 (CST)    0 secs (0 hrs) behind the primary source: 192.168.235.200:27019    syncedTo: Mon Jul 16 2018 06:16:16 GMT+0800 (CST)    0 secs (0 hrs) behind the primary abc:ARBITER> rs.printReplicationInfo()cannot provide replication status from an arbiter.       //會發現仲裁節點並不具備資料複製
更改oplog日誌大小
  • oplog即operation log的簡寫,儲存在local資料庫中。oplog中新操作會自動替換舊的操作,以保證oplog不會超過預設的大小。預設情況下,oplog大小會佔用64位的執行個體5%的磁碟空間。
  • 在MongoDB複製的過程中,主節點應用業務操作修改到資料庫中,然後記錄這些操作到oplog中,從節點複製這些oplog,然後應用這些修改、這些操作是非同步,如果從節點的操作已經被主節點落下很遠,oplog日誌在從節點上還沒執行完,oplog可能已經輪滾一圈了,從節點跟不上同步,複製就會停下,從節點需要重新做完整的同步,為了避免這種情況,盡量保證主節點的oplog足夠大,能夠存放相當長時間的操作記錄。
查看當前oplog記錄檔大小
abc:PRIMARY> db.printReplicationInfo()configured oplog size:   1613.301513671875MB    //預設大小log length start to end: 18650secs (5.18hrs)oplog first event time:  Tue Jul 17 2018 11:08:30 GMT+0800 (CST)oplog last event time:   Tue Jul 17 2018 16:19:20 GMT+0800 (CST)now:                     Tue Jul 17 2018 16:19:21 GMT+0800 (CST)
離線升級,更改oplog日誌大小
  • 針對於主節點伺服器oplog日誌大小,如果主節點伺服器存在於複製集當中,我們需要先將主節點服務關閉,然後再在設定檔中關閉replication複製相關選項,並且修改連接埠號碼,因為如果連接埠號碼不改,當服務啟動時,還是會被加入到複製集隊列。將其服務作為單一實例啟動。

mongo

abc:PRIMARY> use adminswitched to db adminabc:PRIMARY> db.shutdownServer()也可以採用mongod -f /etc/mongod.conf --shutdown  方式關閉服務

vim /etc/mongod.conf

  • 登出replication:相關啟動參數,並修改port連接埠號碼27027
...# network interfacesnet:  port: 27027     //修改連接埠  bindIp: 0.0.0.0  # Listen to local interface only, comment to listen on all interfaces.#security:#operationProfiling:#replication:       //注釋複製功能 # replSetName: abc...
  • 主節點的單一實例啟動

mongo -f /etc/mongod.conf

  • 備份當前oplog日誌

mongodump --port 27027 --db local --collection ‘oplog.rs‘ //全備份當前節點oplog記錄

  • 進入當前節點MongoDB

mongo --port 27027

> use local            //進入local資料庫> db.oplog.rs.drop()   //刪除oplog原有集合> db.runCommand( { create: "oplog.rs", capped: true, size: (2 * 1024 * 1024 * 1024) } )  //重建oplog,並指定大小> use admin> db.shutdownServer()   //關閉服務
  • 把設定檔修改回來
...# network interfacesnet:  port: 27017     //連接埠修改回原有連接埠  bindIp: 0.0.0.0  # Listen to local interface only, comment to listen on all interfaces.#security:#operationProfiling:replication:       //取消注釋複製功能  replSetName: abc  oplogSizeMB:2048   //添加指定oplog日誌大小...
  • 啟動節點服務

mongod -f /etc/mongod.conf
mongo --port 27017

abc:SECONDARY> db.printReplicationInfo()configured oplog size:   2048MB       //oplog日誌大小已經改變log length start to end: 30secs (0.01hrs)oplog first event time:  Tue Jul 17 2018 17:33:18 GMT+0800 (CST)oplog last event time:   Tue Jul 17 2018 17:33:48 GMT+0800 (CST)now:                     Tue Jul 17 2018 17:33:54 GMT+0800 (CST)abc:SECONDARY> 
部署認證複製

mongo

  • 進入primary

    kgcrs:PRIMARY> use adminkgcrs:PRIMARY> db.createUser({"user":"root","pwd":"123","roles":["root"]})   //建立系統管理使用者,並且使用系統管理使用者認證
  • 在每個執行個體設定檔中開啟認證功能

[[email protected]]# vim /etc/mongod.conf
[[email protected]]# vim /etc/mongod2.conf
[[email protected]]# vim /etc/mongod3.conf
[[email protected]]# vim /etc/mongod4.conf

...security:   keyFile: /usr/bin/kgcrskey1   clusterAuthMode: keyFile...

cd /usr/bin/

  • 建立認證檔案,並且輸入統一認證密匙

    [[email protected] bin]# echo "kgcrs key"> kgcrskey1[[email protected] bin]# echo "kgcrs key"> kgcrskey2[[email protected] bin]# echo "kgcrs key"> kgcrskey3[[email protected] bin]# echo "kgcrs key"> kgcrskey4[[email protected] bin]# chmod 600 kgcrskey{1..4}     //設定許可權,只有屬主可以查看
  • 重啟四個執行個體
進入primarykgcrs:PRIMARY> show dbs   //無法查看資料庫kgcrs:PRIMARY> rs.status()   ///無法查看複製集kgcrs:PRIMARY> use admin    //身份登入驗證kgcrs:PRIMARY> db.auth("root","123")kgcrs:PRIMARY> rs.status()  //可以查看資料庫kgcrs:PRIMARY> show dbs   //可以查看複製集

MongoDB複製集(實現選舉複製、故障切換、升級oplog大小、認證複製)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.