這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)MongoDB中復(fù)制選舉的原理是什么,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
10年積累的成都網(wǎng)站制作、做網(wǎng)站、外貿(mào)營銷網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有固鎮(zhèn)免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
MongoDB的復(fù)制是基于操作日志oplog,相當(dāng)于MySQL中的二進(jìn)制日志,只記錄發(fā)生改變的記錄。復(fù)制是將主節(jié)點(diǎn)的oplog日志同步并應(yīng)用到其他從節(jié)點(diǎn)的過程。
MongoDB的節(jié)點(diǎn)分為三種類型,分別為標(biāo)準(zhǔn)節(jié)點(diǎn)(host)、被動(dòng)節(jié)點(diǎn)(passive)和仲裁節(jié)點(diǎn)(arbiter)
只有標(biāo)準(zhǔn)節(jié)點(diǎn)才有可能被選舉為活躍節(jié)點(diǎn)(主節(jié)點(diǎn)),擁有選舉權(quán)。被動(dòng)節(jié)點(diǎn)有完整副本,不可能成為活躍節(jié)點(diǎn),具有選舉權(quán)。仲裁節(jié)點(diǎn)不復(fù)制數(shù)據(jù),不可能成為活躍節(jié)點(diǎn),只有選舉權(quán)。說白了就是只有標(biāo)準(zhǔn)節(jié)點(diǎn)才有可能被選舉為主節(jié)點(diǎn),即使在一個(gè)復(fù)制集中說有的標(biāo)準(zhǔn)節(jié)點(diǎn)都宕機(jī),被動(dòng)節(jié)點(diǎn)和仲裁節(jié)點(diǎn)也不會(huì)成為主節(jié)點(diǎn)。后續(xù)有示例演示驗(yàn)證。
標(biāo)準(zhǔn)節(jié)點(diǎn)與被動(dòng)節(jié)點(diǎn)的區(qū)別:priority值高者是標(biāo)準(zhǔn)節(jié)點(diǎn),低者則為被動(dòng)節(jié)點(diǎn)
選舉規(guī)則是票數(shù)高的獲勝,priority是優(yōu)先權(quán)0~1000的值,相當(dāng)于額外增加0~1000的票數(shù)。選舉結(jié)果:票數(shù)高者獲勝;若票數(shù)相同,數(shù)據(jù)新者獲勝。
MongoDB復(fù)制集節(jié)點(diǎn)間選舉所示
前文鏈接
Yum安裝MongoDB及數(shù)據(jù)庫管理
配置MongoDB復(fù)制集
mkdir -p /data/mongodb/logs
// path目錄,因?yàn)樵诎惭b完成之后就會(huì)有一個(gè)實(shí)例,所以這里我們只需要?jiǎng)?chuàng)建三個(gè)實(shí)例即可
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: //修改配置文件中這五個(gè)項(xiàng)目的值

systemctl disable firewalld.service systemctl stop firewalld.service setenforce 0
mongod -f /etc/mongod.conf
本次復(fù)制集由四個(gè)節(jié)點(diǎn)組成,分別包括兩個(gè)標(biāo)準(zhǔn)節(jié)點(diǎn),一個(gè)被動(dòng)節(jié)點(diǎn),一個(gè)仲裁節(jié)點(diǎn)。
mongo //=進(jìn)入數(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í)對數(shù)據(jù)庫進(jìn)行一些增刪改查的操作,注意在oplog日志中不會(huì)記錄查詢的語句,只會(huì)記錄對數(shù)據(jù)庫進(jìn)行更改的語句
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 //可以看到其中有一個(gè)oplog.rs文件 db.oplog.rs.find() //由于內(nèi)容過多,在這里就不展示,查看之后就會(huì)發(fā)現(xiàn),沒有記錄查詢的記錄,只有記錄對數(shù)據(jù)庫做更改的操作
kill -9 + 進(jìn)程號(hào) //關(guān)閉主節(jié)點(diǎn)
mongod -f /etc/mongod4.conf --shutdown //關(guān)閉主節(jié)點(diǎn)
mongo --port 27018
chenrs:PRIMARY> rs.status() //此時(shí)該節(jié)點(diǎn)已經(jīng)成為主節(jié)點(diǎn)
{
"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", //此時(shí)1為主節(jié)點(diǎn)
···省略部分內(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", //即使兩個(gè)標(biāo)準(zhǔn)節(jié)點(diǎn)都處于宕機(jī)狀態(tài),被動(dòng)節(jié)點(diǎn)和仲裁節(jié)點(diǎn)也沒有成為主節(jié)點(diǎn)
···省略部分內(nèi)容
"_id" : 3,
"name" : "172.16.10.29:27020",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
]
···省略部分內(nèi)容默認(rèn)MongoDB復(fù)制集的從節(jié)點(diǎn)是不能讀取數(shù)據(jù)的,但是可以使用密令來允許能夠在從節(jié)點(diǎn)讀取數(shù)據(jù)
rs.slaveOk() //允許從節(jié)點(diǎn)能夠讀取數(shù)據(jù)
rs.help rs.printReplicationInfo() //查看oplog日志文件的大小及時(shí)間范圍 rs.printSlaveReplicationInfo() //查詢節(jié)點(diǎn)及節(jié)點(diǎn)復(fù)制的時(shí)間

如果節(jié)點(diǎn)屬于復(fù)制集成員,此時(shí)你想要修改oplog的大小是不被允許的,所以要將節(jié)點(diǎn)移出復(fù)制集想要修改日志文件的默認(rèn)大小。此時(shí)要做的是首先要關(guān)閉節(jié)點(diǎn)的服務(wù),然后退出復(fù)制集
use admin //在復(fù)制集的從節(jié)點(diǎn)上做 db.shutdownServer() //關(guān)閉服務(wù),此時(shí)再想登陸該節(jié)點(diǎn)則會(huì)失敗
注銷掉replication的值和修改port值,將其作為單實(shí)例啟動(dòng)
vim /etc/mongod2.conf #replication: # replSetName: chenrs port: 27028 mongod -f /etc/mongod2.conf //啟動(dòng)實(shí)例,此時(shí)該實(shí)例不屬于復(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í)要加一個(gè)參數(shù)指定日志文件大小
vim /etc/mongod2.conf replication: replSetName: chenrs oplogSizeMB: 2048 //單位為兆 mongod -f /etc/mongod2.conf //啟動(dòng)實(shí)例 mongo -port 27018 //進(jìn)入實(shí)例

rs.printReplicationInfo()
對于日志文件大小的更改,只對該節(jié)點(diǎn)生效,其他節(jié)點(diǎn)仍然是默認(rèn)值
use admin
db.createUser({"user":"root","pwd":"123123","roles":["root"]})
為了使其他的節(jié)點(diǎn)還能夠和主節(jié)點(diǎn)進(jìn)行同步,創(chuàng)建密鑰文件使其他節(jié)點(diǎn)能夠同步
創(chuàng)建驗(yàn)證文件
# 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è)置在接下來的啟動(dòng)中會(huì)報(bào)錯(cuò)修改配置文件,開啟mongodb的安全驗(yàn)證功能(四個(gè)配置文件都要修改,注意內(nèi)容差異)
vim /etc/mongod.conf security: keyFile: /usr/bin/chenrskey1 //每個(gè)節(jié)點(diǎn)的驗(yàn)證文件不同,要根據(jù)不同的節(jié)點(diǎn)修改 clusterAuthMode: keyFile //認(rèn)證類型,密鑰文件認(rèn)證

重啟服務(wù)
mongod -f /etc/mongod.conf --shutdown mongod -f /etc/mongod.conf /其他幾臺(tái)的重啟方式都相同,重復(fù)操作即可
當(dāng)你直接使用登陸命令登陸系統(tǒng)時(shí),使用show dbs 是不能夠查看數(shù)據(jù)的,此時(shí)就需要使用身份驗(yàn)證
mongo --port 27018
use admin
db.auth("root","123123")
上述就是小編為大家分享的MongoDB中復(fù)制選舉的原理是什么了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
分享文章:MongoDB中復(fù)制選舉的原理是什么
當(dāng)前網(wǎng)址:http://chinadenli.net/article38/ihhcsp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、ChatGPT、網(wǎng)站制作、服務(wù)器托管、做網(wǎng)站、網(wǎng)站策劃
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)