欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

怎么深入mongodb集群副本集內(nèi)部機(jī)制

怎么深入MongoDB集群副本集內(nèi)部機(jī)制,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

10多年建站經(jīng)驗(yàn), 網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì)客戶(hù)的見(jiàn)證與正確選擇。成都創(chuàng)新互聯(lián)公司提供完善的營(yíng)銷(xiāo)型網(wǎng)頁(yè)建站明細(xì)報(bào)價(jià)表。后期開(kāi)發(fā)更加便捷高效,我們致力于追求更美、更快、更規(guī)范。

  • 副本集故障轉(zhuǎn)移,主節(jié)點(diǎn)是如何選舉的?能否手動(dòng)干涉下架某一臺(tái)主節(jié)點(diǎn)。

  • 官方說(shuō)副本集數(shù)量最好是奇數(shù),為什么?

  • mongodb副本集是如何同步的?如果同步不及時(shí)會(huì)出現(xiàn)什么情況?會(huì)不會(huì)出現(xiàn)不一致性?

  • mongodb的故障轉(zhuǎn)移會(huì)不會(huì)無(wú)故自動(dòng)發(fā)生?什么條件會(huì)觸發(fā)?頻繁觸發(fā)可能會(huì)帶來(lái)系統(tǒng)負(fù)載加重?

Bully算法 mongodb副本集故障轉(zhuǎn)移功能得益于它的選舉機(jī)制。選舉機(jī)制采用了Bully算法,可以很方便從分布式節(jié)點(diǎn)中選出主節(jié)點(diǎn)。一個(gè)分布式集群架構(gòu)中一般都有一個(gè)所謂的主節(jié)點(diǎn),可以有很多用途,比如緩存機(jī)器節(jié)點(diǎn)元數(shù)據(jù),作為集群的訪問(wèn)入口等等。主節(jié)點(diǎn)有就有吧,我們干嘛要什么Bully算法?要明白這個(gè)我們先看看這兩種架構(gòu):

  1. 指定主節(jié)點(diǎn)的架構(gòu),這種架構(gòu)一般都會(huì)申明一個(gè)節(jié)點(diǎn)為主節(jié)點(diǎn),其他節(jié)點(diǎn)都是從節(jié)點(diǎn),如我們常用的MySQL就是這樣。但是這樣架構(gòu)我們?cè)诘谝还?jié)說(shuō)了整個(gè)集群如果主節(jié)點(diǎn)掛掉了就得手工操作,上架一個(gè)新的主節(jié)點(diǎn)或者從從節(jié)點(diǎn)恢復(fù)數(shù)據(jù),不太靈活。

    怎么深入mongodb集群副本集內(nèi)部機(jī)制

  2. 不指定主節(jié)點(diǎn),集群中的任意節(jié)點(diǎn)都可以成為主節(jié)點(diǎn)。mongodb也就是采用這種架構(gòu),一但主節(jié)點(diǎn)掛了其他從節(jié)點(diǎn)自動(dòng)接替變成主節(jié)點(diǎn)。如下圖:

    怎么深入mongodb集群副本集內(nèi)部機(jī)制

好了,問(wèn)題就在這個(gè)地方,既然所有節(jié)點(diǎn)都是一樣,一但主節(jié)點(diǎn)掛了,怎么選擇出來(lái)下一個(gè)節(jié)點(diǎn)是誰(shuí)來(lái)做為主節(jié)點(diǎn)呢?這就是Bully算法解決的問(wèn)題。

那什么是Bully算法,Bully算法是一種協(xié)調(diào)者(主節(jié)點(diǎn))競(jìng)選算法,主要思想是集群的每個(gè)成員都可以聲明它是主節(jié)點(diǎn)并通知其他節(jié)點(diǎn)。別的節(jié)點(diǎn)可以選擇接受這個(gè)聲稱(chēng)或是拒絕并進(jìn)入主節(jié)點(diǎn)競(jìng)爭(zhēng)。被其他所有節(jié)點(diǎn)接受的節(jié)點(diǎn)才能成為主節(jié)點(diǎn)。節(jié)點(diǎn)按照一些屬性來(lái)判斷誰(shuí)應(yīng)該勝出。這個(gè)屬性可以是一個(gè)靜態(tài)ID,也可以是更新的度量像最近一次事務(wù)ID(最新的節(jié)點(diǎn)會(huì)勝出)。

選舉 那mongodb是怎進(jìn)行選舉的呢?官方這么描述:

We use a consensus protocol to pick a primary. Exact details will be spared here but that basic process is:

  1. get maxLocalOpOrdinal from each server.

  2. if a majority of servers are not up (from this server’s POV), remain in Secondary mode and stop.

  3. if the last op time seems very old, stop and await human intervention.

  4. else, using a consensus protocol, pick the server with the highest maxLocalOpOrdinal as the Primary.

大致翻譯過(guò)來(lái)為使用一致協(xié)議選擇主節(jié)點(diǎn)。基本步驟為:

  1. 得到每個(gè)服務(wù)器節(jié)點(diǎn)的最后操作時(shí)間戳。每個(gè)mongodb都有oplog機(jī)制會(huì)記錄本機(jī)的操作,方便和主服務(wù)器進(jìn)行對(duì)比數(shù)據(jù)是否同步還可以用于錯(cuò)誤恢復(fù)。

  2. 如果集群中大部分服務(wù)器down機(jī)了,保留活著的節(jié)點(diǎn)都為 secondary狀態(tài)并停止,不選舉了。

  3. 如果集群中選舉出來(lái)的主節(jié)點(diǎn)或者所有從節(jié)點(diǎn)最后一次同步時(shí)間看起來(lái)很舊了,停止選舉等待人來(lái)操作。

  4. 如果上面都沒(méi)有問(wèn)題就選擇最后操作時(shí)間戳最新(保證數(shù)據(jù)是最新的)的服務(wù)器節(jié)點(diǎn)作為主節(jié)點(diǎn)。

這里提到了一個(gè)一致協(xié)議(其實(shí)就是bully算法),這個(gè)和數(shù)據(jù)庫(kù)的一致性協(xié)議還是有些區(qū)別,一致協(xié)議主要強(qiáng)調(diào)的是通過(guò)一些機(jī)制保證大家達(dá)成共識(shí);而一致性協(xié)議強(qiáng)調(diào)的是操作的順序一致性,比如同時(shí)讀寫(xiě)一個(gè)數(shù)據(jù)會(huì)不會(huì)出現(xiàn)臟數(shù)據(jù)。一致協(xié)議在分布式里有一個(gè)經(jīng)典的算法叫“Paxos算法”,后續(xù)再介紹。

上面有個(gè)問(wèn)題,就是所有從節(jié)點(diǎn)的最后操作時(shí)間都是一樣怎么辦?就是誰(shuí)先成為主節(jié)點(diǎn)的時(shí)間最快就選誰(shuí)。

選舉觸發(fā)條件 選舉不是什么時(shí)刻都會(huì)被觸發(fā)的,有以下情況可以觸發(fā)。

  1. 初始化一個(gè)副本集時(shí)。

  2. 副本集和主節(jié)點(diǎn)斷開(kāi)連接,可能是網(wǎng)絡(luò)問(wèn)題。

  3. 主節(jié)點(diǎn)掛掉。

選舉還有個(gè)前提條件,參與選舉的節(jié)點(diǎn)數(shù)量必須大于副本集總節(jié)點(diǎn)數(shù)量的一半,如果已經(jīng)小于一半了所有節(jié)點(diǎn)保持只讀狀態(tài)。
日志將會(huì)出現(xiàn):

can't see a majority of the set, relinquishing primary

主節(jié)點(diǎn)掛掉能否人為干預(yù)?答案是肯定的。

  1. 可以通過(guò)replSetStepDown命令下架主節(jié)點(diǎn)。這個(gè)命令可以登錄主節(jié)點(diǎn)使用

    db.adminCommand({replSetStepDown : 1})

    如果殺不掉可以使用強(qiáng)制開(kāi)關(guān)

    db.adminCommand({replSetStepDown : 1, force : true})

    或者使用 rs.stepDown(120)也可以達(dá)到同樣的效果,中間的數(shù)字指不能在停止服務(wù)這段時(shí)間成為主節(jié)點(diǎn),單位為秒。

  2. 設(shè)置一個(gè)從節(jié)點(diǎn)有比主節(jié)點(diǎn)有更高的優(yōu)先級(jí)。
    先查看當(dāng)前集群中優(yōu)先級(jí),通過(guò)rs.conf()命令,默認(rèn)優(yōu)先級(jí)為1是不顯示的,這里標(biāo)示出來(lái)。

    rs.conf();

    {
            "_id" : "rs0",
            "version" : 9,
            "members" : [
                    {
                            "_id" : 0,
                            "host" : "192.168.1.136:27017"                },
                    {
                            "_id" : 1,
                            "host" : "192.168.1.137:27017"                },
                    {
                            "_id" : 2,
                            "host" : "192.168.1.138:27017"                }
            ]
            }

    我們來(lái)設(shè)置,讓id為1的主機(jī)可以?xún)?yōu)先成為主節(jié)點(diǎn)。

    cfg = rs.conf()
    cfg.members[0].priority = 1
    cfg.members[1].priority = 2
    cfg.members[2].priority = 1
    rs.reconfig(cfg)

    然后再執(zhí)行rs.conf()命令查看優(yōu)先級(jí)已經(jīng)設(shè)置成功,主節(jié)點(diǎn)選舉也會(huì)觸發(fā)。

    {
            "_id" : "rs0",
            "version" : 9,
            "members" : [
                    {
                            "_id" : 0,
                            "host" : "192.168.1.136:27017"                },
                    {
                            "_id" : 1,
                            "host" : "192.168.1.137:27017",
                            "priority" : 2
                    },
                    {
                            "_id" : 2,
                            "host" : "192.168.1.138:27017"                }
              ]
             }

    如果不想讓一個(gè)從節(jié)點(diǎn)成為主節(jié)點(diǎn)可以怎么操作?
    a、使用rs.freeze(120)凍結(jié)指定的秒數(shù)不能選舉成為主節(jié)點(diǎn)。
    b、按照上一篇設(shè)置節(jié)點(diǎn)為Non-Voting類(lèi)型。

  3. 當(dāng)主節(jié)點(diǎn)不能和大部分從節(jié)點(diǎn)通訊。把主機(jī)節(jié)點(diǎn)網(wǎng)線拔掉,嘿嘿:)

    優(yōu)先級(jí)還可以這么用,如果我們不想設(shè)置什么hidden節(jié)點(diǎn),就用secondary類(lèi)型作為備份節(jié)點(diǎn)也不想讓他成為主節(jié)點(diǎn)怎么辦?看下圖,共三個(gè)節(jié)點(diǎn)分布在兩個(gè)數(shù)據(jù)中心,數(shù)據(jù)中心2的節(jié)點(diǎn)設(shè)置優(yōu)先級(jí)為0不能成為主節(jié)點(diǎn),但是可以參與選舉、數(shù)據(jù)復(fù)制。架構(gòu)還是很靈活吧!

    怎么深入mongodb集群副本集內(nèi)部機(jī)制

奇數(shù) 官方推薦副本集的成員數(shù)量為奇數(shù),最多12個(gè)副本集節(jié)點(diǎn),最多7個(gè)節(jié)點(diǎn)參與選舉。最多12個(gè)副本集節(jié)點(diǎn)是因?yàn)闆](méi)必要一份數(shù)據(jù)復(fù)制那么多份,備份太多反而增加了網(wǎng)絡(luò)負(fù)載和拖慢了集群性能;而最多7個(gè)節(jié)點(diǎn)參與選舉是因?yàn)閮?nèi)部選舉機(jī)制節(jié)點(diǎn)數(shù)量太多就會(huì)導(dǎo)致1分鐘內(nèi)還選不出主節(jié)點(diǎn),凡事只要適當(dāng)就好。這個(gè)“12”、“7”數(shù)字還好,通過(guò)他們官方經(jīng)過(guò)性能測(cè)試定義出來(lái)可以理解。具體還有哪些限制參考官方文檔《 MongoDB Limits and Thresholds 》。 但是這里一直沒(méi)搞懂整個(gè)集群為什么要奇數(shù),通過(guò)測(cè)試集群的數(shù)量為偶數(shù)也是可以運(yùn)行的,參考這個(gè)文章http://www.itpub.net/thread-1740982-1-1.html。后來(lái)突然看了一篇stackoverflow的文章終于頓悟了,mongodb本身設(shè)計(jì)的就是一個(gè)可以跨IDC的分布式數(shù)據(jù)庫(kù),所以我們應(yīng)該把它放到大的環(huán)境來(lái)看。

假設(shè)四個(gè)節(jié)點(diǎn)被分成兩個(gè)IDC,每個(gè)IDC各兩臺(tái)機(jī)器,如下圖。但這樣就出現(xiàn)了個(gè)問(wèn)題,如果兩個(gè)IDC網(wǎng)絡(luò)斷掉,這在廣域網(wǎng)上很容易出現(xiàn)的問(wèn)題,在上面選舉中提到只要主節(jié)點(diǎn)和集群中大部分節(jié)點(diǎn)斷開(kāi)鏈接就會(huì)開(kāi)始一輪新的選舉操作,不過(guò)mongodb副本集兩邊都只有兩個(gè)節(jié)點(diǎn),但是選舉要求參與的節(jié)點(diǎn)數(shù)量必須大于一半,這樣所有集群節(jié)點(diǎn)都沒(méi)辦法參與選舉,只會(huì)處于只讀狀態(tài)。但是如果是奇數(shù)節(jié)點(diǎn)就不會(huì)出現(xiàn)這個(gè)問(wèn)題,假設(shè)3個(gè)節(jié)點(diǎn),只要有2個(gè)節(jié)點(diǎn)活著就可以選舉,5個(gè)中的3個(gè),7個(gè)中的4個(gè)。。。

怎么深入mongodb集群副本集內(nèi)部機(jī)制

心跳 綜上所述,整個(gè)集群需要保持一定的通信才能知道哪些節(jié)點(diǎn)活著哪些節(jié)點(diǎn)掛掉。mongodb節(jié)點(diǎn)會(huì)向副本集中的其他節(jié)點(diǎn)每?jī)擅刖蜁?huì)發(fā)送一次pings包,如果其他節(jié)點(diǎn)在10秒鐘之內(nèi)沒(méi)有返回就標(biāo)示為不能訪問(wèn)。每個(gè)節(jié)點(diǎn)內(nèi)部都會(huì)維護(hù)一個(gè)狀態(tài)映射表,表明當(dāng)前每個(gè)節(jié)點(diǎn)是什么角色、日志時(shí)間戳等關(guān)鍵信息。如果是主節(jié)點(diǎn),除了維護(hù)映射表外還需要檢查自己能否和集群中內(nèi)大部分節(jié)點(diǎn)通訊,如果不能則把自己降級(jí)為secondary只讀節(jié)點(diǎn)。

同步,副本集同步分為初始化同步和keep復(fù)制。初始化同步指全量從主節(jié)點(diǎn)同步數(shù)據(jù),如果主節(jié)點(diǎn)數(shù)據(jù)量比較大同步時(shí)間會(huì)比較長(zhǎng)。而keep復(fù)制指初始化同步過(guò)后,節(jié)點(diǎn)之間的實(shí)時(shí)同步一般是增量同步。初始化同步不只是在第一次才會(huì)被處罰,有以下兩種情況會(huì)觸發(fā):

  1. secondary第一次加入,這個(gè)是肯定的。

  2. secondary落后的數(shù)據(jù)量超過(guò)了oplog的大小,這樣也會(huì)被全量復(fù)制。

那什么是oplog的大?。壳懊嬲f(shuō)過(guò)oplog保存了數(shù)據(jù)的操作記錄,secondary復(fù)制oplog并把里面的操作在secondary執(zhí)行一遍。但是oplog也是mongodb的一個(gè)集合,保存在local.oplog.rs里,但是這個(gè)oplog是一個(gè)capped collection也就是固定大小的集合,新數(shù)據(jù)加入超過(guò)集合的大小會(huì)覆蓋。所以這里需要注意,跨IDC的復(fù)制要設(shè)置合適的oplogSize,避免在生產(chǎn)環(huán)境經(jīng)常產(chǎn)生全量復(fù)制。oplogSize 可以通過(guò)–oplogSize設(shè)置大小,對(duì)于linux 和windows 64位,oplog size默認(rèn)為剩余磁盤(pán)空間的5%。

同步也并非只能從主節(jié)點(diǎn)同步,假設(shè)集群中3個(gè)節(jié)點(diǎn),節(jié)點(diǎn)1是主節(jié)點(diǎn)在IDC1,節(jié)點(diǎn)2、節(jié)點(diǎn)3在IDC2,初始化節(jié)點(diǎn)2、節(jié)點(diǎn)3會(huì)從節(jié)點(diǎn)1同步數(shù)據(jù)。后面節(jié)點(diǎn)2、節(jié)點(diǎn)3會(huì)使用就近原則從當(dāng)前IDC的副本集中進(jìn)行復(fù)制,只要有一個(gè)節(jié)點(diǎn)從IDC1的節(jié)點(diǎn)1復(fù)制數(shù)據(jù)。

設(shè)置同步還要注意以下幾點(diǎn):

  1. secondary不會(huì)從delayed和hidden成員上復(fù)制數(shù)據(jù)。

  2. 只要是需要同步,兩個(gè)成員的buildindexes必須要相同無(wú)論是否是true和false。buildindexes主要用來(lái)設(shè)置是否這個(gè)節(jié)點(diǎn)的數(shù)據(jù)用于查詢(xún),默認(rèn)為true。

  3. 如果同步操作30秒都沒(méi)有反應(yīng),則會(huì)重新選擇一個(gè)節(jié)點(diǎn)進(jìn)行同步。

到此,本章前面提到的問(wèn)題全部解決了,不得不說(shuō)mongodb的設(shè)計(jì)還真是強(qiáng)大!

后續(xù)繼續(xù)解決上一節(jié)這幾個(gè)問(wèn)題:

  • 主節(jié)點(diǎn)掛了能否自動(dòng)切換連接?目前需要手工切換。

  • 主節(jié)點(diǎn)的讀寫(xiě)壓力過(guò)大如何解決?

還有這兩個(gè)問(wèn)題后續(xù)解決:

  • 從節(jié)點(diǎn)每個(gè)上面的數(shù)據(jù)都是對(duì)數(shù)據(jù)庫(kù)全量拷貝,從節(jié)點(diǎn)壓力會(huì)不會(huì)過(guò)大?

  • 數(shù)據(jù)壓力大到機(jī)器支撐不了的時(shí)候能否做到自動(dòng)擴(kuò)展?

關(guān)于怎么深入mongodb集群副本集內(nèi)部機(jī)制問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

文章題目:怎么深入mongodb集群副本集內(nèi)部機(jī)制
鏈接URL:http://aaarwkj.com/article32/gghisc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷(xiāo)、網(wǎng)站內(nèi)鏈企業(yè)網(wǎng)站制作、虛擬主機(jī)、定制開(kāi)發(fā)、全網(wǎng)營(yíng)銷(xiāo)推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都app開(kāi)發(fā)公司
日本高清久久一区二区三区| 丝袜啪啪啪麻豆白虎内射 | 91精品婷婷国产综合| 热九九这里只有热九九| 亚洲乱码一区二区在线| 亚洲激情在线观看一区| 国产操大奶头女人自拍av| 亚洲精品影视一区二区| 黄片色呦呦视频免费看| 亚洲国产欧美精品综合在线| 校花出白浆视频一区二区三区 | 周妍希浴室视频色哟哟| 亚洲熟女乱妇爽到高潮| 亚洲成人日韩欧美在线| 国产一区在线免费在线观看| 亚洲美女av一区二区三区| 91狠狠综合久久精品| 亚洲精品入口一区二区| 夜夜高潮夜夜爽免费观看| av全欧国男人在线天堂| 熟女乱熟乱熟妇综合网二区| 欧美日韩精品一区二区在线播放| 欧美亚洲清纯唯美另类| 中文字幕乱码人妻一区| 天天干天天干夜夜操| 亚洲国产综合亚洲综合国产| 97精品免费视频观看| 精品日韩电影在线观看| 久久国产精品99亚洲| 传媒视频免费在线观看| 亚洲欧美日韩国产成人精品| 亚洲欧美日韩有码一区| 色婷婷综合激情一区二区| 人妻中文字幕在线一二区| 亚洲美女av一区二区三区| 日韩一区二区三区免费播放 | 日韩精品中文字幕影视| 日本不卡二区高清三区| 特色特色欧美黄色影院| 亚洲一二三无人区是什么| 国产成人亚洲精品在线看|