MongoDB復制集管理優化
- 復制集的選舉原理
復制是基於操作日誌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復制集管理優化