標籤:技術 備份 c中 pwd 部分 登出 RoCE code dip
MongoDB複製集的選舉原理MongoDB複製的原理
MongoDB的複製是基於動作記錄oplog,相當於MySQL中的二進位日誌,只記錄發生改變的記錄。複製是將主節點的oplog日誌同步並應用到其他從節點的過程。
MongoDB選舉的原理
MongoDB的節點分為三種類型,分別為標準節點(host)、被動節點(passive)和仲裁節點(arbiter)
- 只有標準節點才有可能被選舉為活躍節點(主節點),擁有選舉權。被動節點有完整副本,不可能成為活躍節點,具有選舉權。仲裁節點不複製資料,不可能成為活躍節點,只有選舉權。說白了就是只有標準節點才有可能被選舉為主節點,即使在一個複製集中說有的標準節點都宕機,被動節點和仲裁節點也不會成為主節點。後續有樣本示範驗證。
- 標準節點與被動節點的區別:priority值高者是標準節點,低者則為被動節點
- 選舉規則是票數高的獲勝,priority是優先權0~1000的值,相當於額外增加0~1000的票數。選舉結果:票數高者獲勝;若票數相同,資料新者獲勝。
MongoDB複製集節點間選舉所示
前文連結
Yum安裝MongoDB及資料庫管理
配置MongoDB複製集
樣本驗證複製集選舉原理建立4個執行個體建立新執行個體的path檔案和dbpath的檔案目錄,並為記錄檔設定許可權
mkdir -p /data/mongodb/logs// path目錄,因為在安裝完成之後就會有一個執行個體,所以這裡我們只需要建立三個執行個體即可mkdir -p /data/mongodb/mongo{2,3,4} //建立dbpath目錄touch /data/mongodb/logs/mongod{2,3,4}.log //建立記錄檔chmod 777 /data/mongodb/logs/*.log //為記錄檔賦予許可權
修改設定檔(/etc/mongod.conf)
path:dbPath: port: bindIp:replication: replSetName: //修改設定檔中這五個項目的值
關閉防火牆及selinux防火牆
systemctl disable firewalld.servicesystemctl stop firewalld.servicesetenforce 0
啟動執行個體
mongod -f /etc/mongod.conf
配置複製集建立有四個節點群組成的複製集,建立時設定優先權
本次複製集由四個節點群組成,分別包括兩個標準節點,一個被動節點,一個仲裁節點。
mongo //=進入資料庫chen={"_id":"chenrs","members":[{"_id":0,"host":"172.16.10.29:27017","priority":100},{"_id":1,"host":"172.16.10.29:27018","priority":100},{"_id":2,"host":"172.16.10.29:27019","priority":0},{"_id":3,"host":"172.16.10.29:27020","arbiterOnly":true}]}
初始化複製集
rs.initiate(chen)
查看各節點的的身份
rs.isMaster()
查看oplpog日誌
此時對資料庫進行一些增刪改查的操作,注意在oplog日誌中不會記錄查詢的語句,只會記錄對資料庫變更的語句
use stady //使用stady庫db.abc.insert({"id":1,"name":"zhangsan"}) //向表abc中寫入一條資料db.abc.insert({"id":2,"name":"lisi"}) //再次插入一條資料db.abc.find() //查看錶中內容db.abc.update({"id":2},{$set:{"name":"jack"}}) //修改表資料db.abc.remove({"id":1} //刪除表資料
查看oplog中內容
use localshow collections //可以看到其中有一個oplog.rs檔案db.oplog.rs.find() //由於內容過多,在這裡就不展示,查看之後就會發現,沒有記錄查詢的記錄,只有記錄對資料庫做更改的操作
類比主節點故障關閉主節點
kill -9 + 進程號 //關閉主節點mongod -f /etc/mongod4.conf --shutdown //關閉主節點mongo --port 27018chenrs:PRIMARY> rs.status() //此時該節點已經成為主節點{ "set" : "chenrs", "date" : ISODate("2018-07-16T05:30:04.152Z"), "myState" : 1, ···省略部分內容 "members" : [ "_id" : 0, "name" : "172.16.10.29:27017", "health" : 0, //健康值為0,處於非活躍狀態 "state" : 8, "stateStr" : "(not reachable/healthy)", ···省略部分內容 "_id" : 1, "name" : "172.16.10.29:27018", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", //此時1為主節點 ···省略部分內容 "_id" : 2, "name" : "172.16.10.29:27019", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", ···省略部分內容 "_id" : 3, "name" : "172.16.10.29:27020", "health" : 1, "state" : 7, "stateStr" : "ARBITER", ···省略部分內容 ]
類比另外一個主節點故障
mongod -f /etc/mongod2.conf --shutdownmongo --port 27019chenrs:SECONDARY> rs.status() //仍處於secondary狀態{ "set" : "chenrs", "date" : ISODate("2018-07-16T05:40:09.740Z"), "members" : [ { "_id" : 0, "name" : "172.16.10.29:27017", "health" : 0, "state" : 8, "stateStr" : "(not reachable/healthy)", ···省略部分內容 "_id" : 1, "name" : "172.16.10.29:27018", "health" : 0, "state" : 8, "stateStr" : "(not reachable/healthy)", ···省略部分內容 "_id" : 2, "name" : "172.16.10.29:27019", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", //即使兩個標準節點都處於宕機狀態,被動節點和仲裁節點也沒有成為主節點 ···省略部分內容 "_id" : 3, "name" : "172.16.10.29:27020", "health" : 1, "state" : 7, "stateStr" : "ARBITER", ] ···省略部分內容
MongoDB複製集管理配置允許在從節點讀取資料
預設MongoDB複製集的從節點是不能讀取資料的,但是可以使用密令來允許能夠在從節點讀取資料
rs.slaveOk() //允許從節點能夠讀取資料
查看複製集狀態資訊
rs.help rs.printReplicationInfo() //查看oplog記錄檔的大小及時間範圍rs.printSlaveReplicationInfo() //查詢節點及節點複製的時間
調整oplog記錄檔大小
如果節點屬於複製整合員,此時你想要修改oplog的大小是不被允許的,所以要將節點移出複製集想要修改記錄檔的預設大小。此時要做的是首先要關閉節點的服務,然後退出複製集
關閉節點服務(屬於離線升級)
use admin //在複製集的從節點上做db.shutdownServer() //關閉服務,此時再想登陸該節點則會失敗
節點退出複製集
登出掉replication的值和修改port值,將其作為單一實例啟動
vim /etc/mongod2.conf#replication:# replSetName: chenrsport: 27028mongod -f /etc/mongod2.conf //啟動執行個體,此時該執行個體不屬於複製集
完全備份oplog日誌
mongodump --port 27028 --db local --collection ‘oplog.rs‘ //在linux介面操作
刪除節點中oplog檔案
> use local> db.oplog.rs.drop()
重建oplog日誌
db.runCommand( { create: "oplog.rs", capped: true, size: (2 * 1024 * 1024 * 1024) } )
再次關閉節點服務
use admindb.shutdownServer()
將節點加入到複製集
回調參數,同時要加一個參數指定記錄檔大小
vim /etc/mongod2.confreplication: replSetName: chenrs oplogSizeMB: 2048 //單位為兆mongod -f /etc/mongod2.conf //啟動執行個體mongo -port 27018 //進入執行個體
查看oplog大小
rs.printReplicationInfo()
對於記錄檔大小的更改,只對該節點生效,其他節點仍然是預設值
部署認證複製建立系統管理使用者
use admindb.createUser({"user":"root","pwd":"123123","roles":["root"]})
配置密鑰驗證
為了使其他的節點還能夠和主節點進行同步,建立密鑰檔案使其他節點能夠同步
- 建立驗證檔案
# cd /usr/bin/# echo "chenrs key"> chenrskey1# echo "chenrs key"> chenrskey2# echo "chenrs key"> chenrskey3# echo "chenrs key"> chenrskey4 //金鑰產製原料自訂,但是要保證內容的一致性# chmod 600 chenrskey{1..4} //設定檔案許可權,不設定在接下來的啟動中會報錯
- 修改設定檔,開啟mongodb的安全驗證功能(四個設定檔都要修改,注意內容差異)
vim /etc/mongod.confsecurity:keyFile: /usr/bin/chenrskey1 //每個節點的驗證檔案不同,要根據不同的節點修改clusterAuthMode: keyFile //認證類型,密鑰檔案認證
- 重啟服務
mongod -f /etc/mongod.conf --shutdownmongod -f /etc/mongod.conf /其他幾台的重啟方式都相同,重複操作即可
身分識別驗證登陸(先驗證主,再驗證從)當你直接使用登陸命令登陸系統時,使用show dbs 是不能夠查看資料的,此時就需要使用身分識別驗證
mongo --port 27018use admindb.auth("root","123123")
MongoDB複製選舉原理及複製集管理