摘要:此文已由作者溫正湖授權(quán)網(wǎng)易云社區(qū)發(fā)布。歡迎訪問(wèn)網(wǎng)易云社區(qū),了解更多網(wǎng)易技術(shù)產(chǎn)品運(yùn)營(yíng)經(jīng)驗(yàn)。而嚴(yán)格的不會(huì)出現(xiàn)這個(gè)情況。最后安利下,網(wǎng)易蜂巢云服務(wù)已經(jīng)重磅上線,蜂巢由業(yè)界著名的數(shù)據(jù)庫(kù)專家姜承堯親自把關(guān)架構(gòu)設(shè)計(jì),免費(fèi)提供售前技術(shù)支持。
此文已由作者溫正湖授權(quán)網(wǎng)易云社區(qū)發(fā)布。
歡迎訪問(wèn)網(wǎng)易云社區(qū),了解更多網(wǎng)易技術(shù)產(chǎn)品運(yùn)營(yíng)經(jīng)驗(yàn)。
Primary(主)是MongoDB復(fù)制集中的最重要的角色,是能夠接受客戶端/Driver寫請(qǐng)求的節(jié)點(diǎn),(讀請(qǐng)求也是默認(rèn)路由到Primary節(jié)點(diǎn))。在復(fù)制集中,與Primary相對(duì)應(yīng)的有Secondary節(jié)點(diǎn)和Arbiter節(jié)點(diǎn),分別表示從節(jié)點(diǎn)(可以接受讀請(qǐng)求)和投票節(jié)點(diǎn)(僅用于投票選出新的Primary)。復(fù)制集是MongoDB的高可用框架,同時(shí)可以作為業(yè)務(wù)讀寫分離的一種方式。復(fù)制集提供了自動(dòng)故障處理功能(當(dāng)然還有其他功能,本文不展開),能夠自動(dòng)檢測(cè)Primary節(jié)點(diǎn)是否宕機(jī),進(jìn)而選取新的Primary節(jié)點(diǎn),并通過(guò)數(shù)據(jù)回追或數(shù)據(jù)回滾等方式實(shí)現(xiàn)復(fù)制集中數(shù)據(jù)一致。本文借助蜂巢MongoDB云服務(wù)的運(yùn)行日志查看功能,來(lái)簡(jiǎn)要介紹Primary的選舉過(guò)程。
MongoDB提供了強(qiáng)大的SystemLog模塊,相比MySQL,MongoDB的運(yùn)行日志模塊做得更為貼心,通過(guò)日志能夠有效跟蹤MongoDB內(nèi)部是如何進(jìn)行一個(gè)個(gè)操作的。下面的圖都截取自蜂巢MongoDB云服務(wù)的運(yùn)行日志模塊,從中能夠看到了一串的MongoDB選主日志,非常清晰明了。
1、什么時(shí)候會(huì)發(fā)起選舉?
圖中所示,該節(jié)點(diǎn)(我)發(fā)現(xiàn)在過(guò)去的10s中時(shí)間內(nèi),復(fù)制集中沒有Primary,
那么我怎么知道這段時(shí)間沒有主呢,因?yàn)槲颐?s會(huì)給復(fù)制集中的其他節(jié)點(diǎn)發(fā)送心跳,
有些節(jié)點(diǎn)不回我
在超時(shí)時(shí)間內(nèi)(默認(rèn)10s)我會(huì)一直發(fā)。
除了心跳,我還會(huì)發(fā)送其他的命令,另外我還需要跟著Primary的opLog做復(fù)制,但是我發(fā)現(xiàn)沒法再跟他做復(fù)制了,也找不到其他節(jié)點(diǎn)做復(fù)制
既然沒有Primary。。。
2、我能不能被選為Primary呢?
我先試探性的問(wèn)大家愿不愿意讓我當(dāng)Primary。于是我打算先發(fā)起 “dry election”,讓人驚喜的是另一個(gè)節(jié)點(diǎn)竟然同意了,開心 :)。由于復(fù)制集中一共3個(gè)節(jié)點(diǎn)。除了自己外另一個(gè)節(jié)點(diǎn)也同意了,那么我就有資格當(dāng)Primary;注意此時(shí)term 沒有更新,還是0(看第一個(gè)圖~~)。因?yàn)檫@個(gè)是非正式選舉
3、既然這樣,那我就發(fā)起正式選舉吧
結(jié)果當(dāng)然是十拿九穩(wěn)了,那么為什么要先有dry呢,為了保證選舉成功率,相比正式選舉,dry階段檢查的東西少,效率更高些。此時(shí)term已經(jīng)自豪地更新為1。
4、我果然被大家選為Primary
一切盡在掌握中的感覺真爽!!
5、那我就把自己的角色切換為Primary唄
等等,這個(gè)時(shí)候我還不能馬上接受客戶端的寫請(qǐng)求,因?yàn)槲业每纯醋约旱臄?shù)據(jù)是不是最新的,怎么辦呢,oplog里面的optime。看看大家的狀態(tài)(數(shù)據(jù)新舊情況)
我等大家回復(fù)我:
好了,節(jié)點(diǎn)202回我了(他把他自己的rs.status()發(fā)給我, 看看在他的世界里這個(gè)復(fù)制集是什么情況),(200連不上),從這些信息我可以知道,我的數(shù)據(jù)是最新的。而且我從202知道200確實(shí)掛了。
6、既然我的數(shù)據(jù)是最新的,那么我就不需要從其他節(jié)點(diǎn)拷貝數(shù)據(jù)了
這里跟raft不一樣,從raft的論文中,可以確定raft選為primary是必須要求數(shù)據(jù)最新的。但MongoDB選出的Primary,數(shù)據(jù)不一定要最新,只需要滿足一個(gè)約定條件即可(oplog落后10s以內(nèi))。如果數(shù)據(jù)落后集群中的某個(gè)/些存活節(jié)點(diǎn)(這個(gè)情況一般出現(xiàn)在當(dāng)前節(jié)點(diǎn)的priority比擁有更新數(shù)據(jù)的節(jié)點(diǎn)高的時(shí)候),在我對(duì)外提供寫服務(wù)前,我先把這些數(shù)據(jù)從其他節(jié)點(diǎn)從抓過(guò)來(lái),應(yīng)用到我自己這里。但是我這個(gè)是有原則的,我不會(huì)那么貪婪,給我2s(catchUpTimeoutMillis)就好了。我能追上多少就追多少。如果時(shí)間到了,我還沒有完全追上咋辦呢,那也沒有辦法,讓這些節(jié)點(diǎn)把沒追上的數(shù)據(jù)回滾掉好了。
7、現(xiàn)在我的數(shù)據(jù)是最新的了,我開始作為Primary對(duì)外提供寫服務(wù)。你們把寫請(qǐng)求發(fā)過(guò)來(lái)吧~~~
也就是說(shuō),并不是成為Primary后馬上就會(huì)提供寫服務(wù),而是會(huì)有個(gè)追數(shù)據(jù)的過(guò)程。我覺得這個(gè)特性如果大家么有正確理解,很容易出現(xiàn)問(wèn)題。比如用戶設(shè)置了writeconcern是majority,在主從切換的場(chǎng)景下,可能還未寫到大多數(shù)節(jié)點(diǎn)的請(qǐng)求因?yàn)橹鲯炝朔祷厥。鋵?shí)這個(gè)數(shù)據(jù)會(huì)被持久化到新主上。而嚴(yán)格的raft不會(huì)出現(xiàn)這個(gè)情況。
以上用第一張圖大體介紹了選舉過(guò)程。然后每一點(diǎn)的仔細(xì)介紹時(shí),我將MongoDB的SystemLog級(jí)別通過(guò)db.setLogLevel()從0設(shè)置為2,重演了一遍選舉。讓大家看到更多的細(xì)節(jié)。
最后安利下,網(wǎng)易蜂巢MongoDB云服務(wù)已經(jīng)重磅上線,蜂巢MongoDB由業(yè)界著名的數(shù)據(jù)庫(kù)專家姜承堯親自把關(guān)架構(gòu)設(shè)計(jì),免費(fèi)提供售前技術(shù)支持。要知道姜大神的出臺(tái)費(fèi)可是業(yè)界最貴的 :),歡迎大家注冊(cè)試用。有任何意見和建議,請(qǐng)隨時(shí)提出。
網(wǎng)易云免費(fèi)體驗(yàn)館,0成本體驗(yàn)20+款云產(chǎn)品!
更多網(wǎng)易技術(shù)、產(chǎn)品、運(yùn)營(yíng)經(jīng)驗(yàn)分享請(qǐng)點(diǎn)擊。
文章來(lái)源: 網(wǎng)易云社區(qū)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/25249.html
摘要:另外,支持對(duì)復(fù)制集的節(jié)點(diǎn)進(jìn)行靈活的配置,以適應(yīng)多種場(chǎng)景的需求。節(jié)點(diǎn)只參與投票,不能被選為,并且不從同步數(shù)據(jù)。節(jié)點(diǎn)不能被選為主為,并且對(duì)不可見。根據(jù)各集合的設(shè)置,在上為相應(yīng)集合創(chuàng)建。 復(fù)制集簡(jiǎn)介 Mongodb復(fù)制集由一組Mongod實(shí)例(進(jìn)程)組成,包含一個(gè)Primary節(jié)點(diǎn)和多個(gè)Secondary節(jié)點(diǎn),Mongodb Driver(客戶端)的所有數(shù)據(jù)都寫入Primary,Second...
摘要:大體分為成員的角色及轉(zhuǎn)換成員狀態(tài)及轉(zhuǎn)換兩部分。每個(gè)復(fù)制集成員在啟動(dòng)后,都先進(jìn)入狀態(tài),然后加載成員的復(fù)制集配置,之后進(jìn)入到狀態(tài)。選舉行為除了受和兩個(gè)屬性影響外,成員的狀態(tài)也會(huì)影響選舉,僅有和五種狀態(tài)的成員允許進(jìn)行投票操作。 此文已由作者溫正湖授權(quán)網(wǎng)易云社區(qū)發(fā)布。 歡迎訪問(wèn)網(wǎng)易云社區(qū),了解更多網(wǎng)易技術(shù)產(chǎn)品運(yùn)營(yíng)經(jīng)驗(yàn)。 復(fù)制集(Replica Set)是MongoDB核心組件,相比早期版本采用...
摘要:投票節(jié)點(diǎn)僅僅在選舉中進(jìn)行投票。如下圖所示從節(jié)點(diǎn)無(wú)法升職為主節(jié)點(diǎn)的情況其他概念從節(jié)點(diǎn)還有集中特殊的設(shè)置情況,不同的設(shè)置有不同的需求優(yōu)先級(jí)為設(shè)置,那么該結(jié)點(diǎn)將不能成為主節(jié)點(diǎn),但是其數(shù)據(jù)仍是與主節(jié)點(diǎn)保持一致的而且應(yīng)用程序也可以進(jìn)行讀操作。 介紹 replicattion set 多臺(tái)服務(wù)器維護(hù)相同的數(shù)據(jù)副本,提高服務(wù)器的可用性,總結(jié)下來(lái)有以下好處: 數(shù)據(jù)備份與恢復(fù) 讀寫分離 MongoD...
摘要:解釋首先,到底是什么意思呢在關(guān)系型數(shù)據(jù)庫(kù)中因?yàn)橛惺聞?wù)的概念,操作數(shù)據(jù)后在沒有之前是可以執(zhí)行命令進(jìn)行數(shù)據(jù)回退的。 前言 前段時(shí)間突然發(fā)現(xiàn)數(shù)據(jù)庫(kù)文件路徑下多了個(gè)rollback名字的文件夾,很是納悶,里面居然還有.bson后綴格式的文件,隨一探究竟。原來(lái)是在這段時(shí)間內(nèi)發(fā)生過(guò)failover(主從切換),導(dǎo)致了某些不一致數(shù)據(jù)的丟失,這可是一個(gè)大問(wèn)題啊,弄不好就是要丟數(shù)據(jù)的,故進(jìn)行了些調(diào)查研究...
摘要:下一小節(jié)我會(huì)和大家分享如何在真實(shí)的生產(chǎn)環(huán)境中創(chuàng)建副本集。好了,中副本集的搭建我們就先說(shuō)到這里,小伙伴們有問(wèn)題歡迎留言討論。 我們之前的案例都是在單個(gè)節(jié)點(diǎn)上實(shí)現(xiàn)的,在生產(chǎn)環(huán)境中這種做法是有風(fēng)險(xiǎn)的,如果服務(wù)宕機(jī)、崩潰或者硬盤壞了都會(huì)對(duì)公司業(yè)務(wù)造成損失,因此我們需要數(shù)據(jù)備份。在MongoDB中我們可以通過(guò)副本集來(lái)實(shí)現(xiàn)這一需求,MongoDB副本集(Replica Set)是有自動(dòng)故障恢復(fù)功能...
閱讀 2328·2021-11-22 14:56
閱讀 1460·2021-09-24 09:47
閱讀 904·2019-08-26 18:37
閱讀 2818·2019-08-26 12:10
閱讀 1522·2019-08-26 11:55
閱讀 3140·2019-08-23 18:07
閱讀 2294·2019-08-23 14:08
閱讀 605·2019-08-23 12:12