這期內(nèi)容當中小編將會給大家?guī)碛嘘P(guān)MongoDB中復(fù)制選舉的原理是什么,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
創(chuàng)新互聯(lián)專注于企業(yè)網(wǎng)絡(luò)營銷推廣、網(wǎng)站重做改版、下城網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、H5頁面制作、商城網(wǎng)站開發(fā)、集團公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為下城等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。MongoDB的復(fù)制是基于操作日志oplog,相當于MySQL中的二進制日志,只記錄發(fā)生改變的記錄。復(fù)制是將主節(jié)點的oplog日志同步并應(yīng)用到其他從節(jié)點的過程。
MongoDB的節(jié)點分為三種類型,分別為標準節(jié)點(host)、被動節(jié)點(passive)和仲裁節(jié)點(arbiter)
只有標準節(jié)點才有可能被選舉為活躍節(jié)點(主節(jié)點),擁有選舉權(quán)。被動節(jié)點有完整副本,不可能成為活躍節(jié)點,具有選舉權(quán)。仲裁節(jié)點不復(fù)制數(shù)據(jù),不可能成為活躍節(jié)點,只有選舉權(quán)。說白了就是只有標準節(jié)點才有可能被選舉為主節(jié)點,即使在一個復(fù)制集中說有的標準節(jié)點都宕機,被動節(jié)點和仲裁節(jié)點也不會成為主節(jié)點。后續(xù)有示例演示驗證。
標準節(jié)點與被動節(jié)點的區(qū)別:priority值高者是標準節(jié)點,低者則為被動節(jié)點
選舉規(guī)則是票數(shù)高的獲勝,priority是優(yōu)先權(quán)0~1000的值,相當于額外增加0~1000的票數(shù)。選舉結(jié)果:票數(shù)高者獲勝;若票數(shù)相同,數(shù)據(jù)新者獲勝。
MongoDB復(fù)制集節(jié)點間選舉所示
前文鏈接
Yum安裝MongoDB及數(shù)據(jù)庫管理
配置MongoDB復(fù)制集
mkdir -p /data/mongodb/logs // path目錄,因為在安裝完成之后就會有一個實例,所以這里我們只需要創(chuàng)建三個實例即可 mkdir -p /data/mongodb/mongo{2,3,4} //創(chuàng)建dbpath目錄 touch /data/mongodb/logs/mongod{2,3,4}.log //創(chuàng)建日志文件 chmod 777 /data/mongodb/logs/*.log //為日志文件賦予權(quán)限
path: dbPath: port: bindIp: replication: replSetName: //修改配置文件中這五個項目的值
systemctl disable firewalld.service systemctl stop firewalld.service setenforce 0
mongod -f /etc/mongod.conf
本次復(fù)制集由四個節(jié)點組成,分別包括兩個標準節(jié)點,一個被動節(jié)點,一個仲裁節(jié)點。
mongo //=進入數(shù)據(jù)庫 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()
此時對數(shù)據(jù)庫進行一些增刪改查的操作,注意在oplog日志中不會記錄查詢的語句,只會記錄對數(shù)據(jù)庫進行更改的語句
use stady //使用stady庫 db.abc.insert({"id":1,"name":"zhangsan"}) //向表abc中寫入一條數(shù)據(jù) db.abc.insert({"id":2,"name":"lisi"}) //再次插入一條數(shù)據(jù) db.abc.find() //查看表中內(nèi)容 db.abc.update({"id":2},{$set:{"name":"jack"}}) //修改表數(shù)據(jù) db.abc.remove({"id":1} //刪除表數(shù)據(jù)
use local show collections //可以看到其中有一個oplog.rs文件 db.oplog.rs.find() //由于內(nèi)容過多,在這里就不展示,查看之后就會發(fā)現(xiàn),沒有記錄查詢的記錄,只有記錄對數(shù)據(jù)庫做更改的操作
kill -9 + 進程號 //關(guān)閉主節(jié)點 mongod -f /etc/mongod4.conf --shutdown //關(guān)閉主節(jié)點 mongo --port 27018 chenrs:PRIMARY> rs.status() //此時該節(jié)點已經(jīng)成為主節(jié)點 { "set" : "chenrs", "date" : ISODate("2018-07-16T05:30:04.152Z"), "myState" : 1, ···省略部分內(nèi)容 "members" : [ "_id" : 0, "name" : "172.16.10.29:27017", "health" : 0, //健康值為0,處于非活躍狀態(tài) "state" : 8, "stateStr" : "(not reachable/healthy)", ···省略部分內(nèi)容 "_id" : 1, "name" : "172.16.10.29:27018", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", //此時1為主節(jié)點 ···省略部分內(nèi)容 "_id" : 2, "name" : "172.16.10.29:27019", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", ···省略部分內(nèi)容 "_id" : 3, "name" : "172.16.10.29:27020", "health" : 1, "state" : 7, "stateStr" : "ARBITER", ···省略部分內(nèi)容 ]
mongod -f /etc/mongod2.conf --shutdown mongo --port 27019 chenrs:SECONDARY> rs.status() //仍處于secondary狀態(tài) { "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)", ···省略部分內(nèi)容 "_id" : 1, "name" : "172.16.10.29:27018", "health" : 0, "state" : 8, "stateStr" : "(not reachable/healthy)", ···省略部分內(nèi)容 "_id" : 2, "name" : "172.16.10.29:27019", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", //即使兩個標準節(jié)點都處于宕機狀態(tài),被動節(jié)點和仲裁節(jié)點也沒有成為主節(jié)點 ···省略部分內(nèi)容 "_id" : 3, "name" : "172.16.10.29:27020", "health" : 1, "state" : 7, "stateStr" : "ARBITER", ] ···省略部分內(nèi)容
默認MongoDB復(fù)制集的從節(jié)點是不能讀取數(shù)據(jù)的,但是可以使用密令來允許能夠在從節(jié)點讀取數(shù)據(jù)
rs.slaveOk() //允許從節(jié)點能夠讀取數(shù)據(jù)
rs.help rs.printReplicationInfo() //查看oplog日志文件的大小及時間范圍 rs.printSlaveReplicationInfo() //查詢節(jié)點及節(jié)點復(fù)制的時間
如果節(jié)點屬于復(fù)制集成員,此時你想要修改oplog的大小是不被允許的,所以要將節(jié)點移出復(fù)制集想要修改日志文件的默認大小。此時要做的是首先要關(guān)閉節(jié)點的服務(wù),然后退出復(fù)制集
use admin //在復(fù)制集的從節(jié)點上做 db.shutdownServer() //關(guān)閉服務(wù),此時再想登陸該節(jié)點則會失敗
注銷掉replication的值和修改port值,將其作為單實例啟動
vim /etc/mongod2.conf #replication: # replSetName: chenrs port: 27028 mongod -f /etc/mongod2.conf //啟動實例,此時該實例不屬于復(fù)制集
mongodump --port 27028 --db local --collection 'oplog.rs' //在linux界面操作
> use local > db.oplog.rs.drop()
db.runCommand( { create: "oplog.rs", capped: true, size: (2 * 1024 * 1024 * 1024) } )
use admin db.shutdownServer()
回調(diào)參數(shù),同時要加一個參數(shù)指定日志文件大小
vim /etc/mongod2.conf replication: replSetName: chenrs oplogSizeMB: 2048 //單位為兆 mongod -f /etc/mongod2.conf //啟動實例 mongo -port 27018 //進入實例
rs.printReplicationInfo()
對于日志文件大小的更改,只對該節(jié)點生效,其他節(jié)點仍然是默認值
use admin db.createUser({"user":"root","pwd":"123123","roles":["root"]})
為了使其他的節(jié)點還能夠和主節(jié)點進行同步,創(chuàng)建密鑰文件使其他節(jié)點能夠同步
創(chuàng)建驗證文件
# cd /usr/bin/ # echo "chenrs key"> chenrskey1 # echo "chenrs key"> chenrskey2 # echo "chenrs key"> chenrskey3 # echo "chenrs key"> chenrskey4 //密鑰內(nèi)容自定義,但是要保證內(nèi)容的一致性 # chmod 600 chenrskey{1..4} //設(shè)置文件權(quán)限,不設(shè)置在接下來的啟動中會報錯
修改配置文件,開啟mongodb的安全驗證功能(四個配置文件都要修改,注意內(nèi)容差異)
vim /etc/mongod.conf security: keyFile: /usr/bin/chenrskey1 //每個節(jié)點的驗證文件不同,要根據(jù)不同的節(jié)點修改 clusterAuthMode: keyFile //認證類型,密鑰文件認證
重啟服務(wù)
mongod -f /etc/mongod.conf --shutdown mongod -f /etc/mongod.conf /其他幾臺的重啟方式都相同,重復(fù)操作即可
當你直接使用登陸命令登陸系統(tǒng)時,使用show dbs 是不能夠查看數(shù)據(jù)的,此時就需要使用身份驗證
mongo --port 27018 use admin db.auth("root","123123")
上述就是小編為大家分享的MongoDB中復(fù)制選舉的原理是什么了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。