標籤:用戶端 技術 協助 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、選舉的原理
複製選舉配置
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
mongodump --port 27027 --db local --collection ‘oplog.rs‘ //全備份當前節點oplog記錄
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
[[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/
進入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大小、認證複製)