溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MongoDB高可用與分片的知識(shí)點(diǎn)有哪些

發(fā)布時(shí)間:2023-04-03 11:20:50 來(lái)源:億速云 閱讀:95 作者:iii 欄目:開(kāi)發(fā)技術(shù)

今天小編給大家分享一下MongoDB高可用與分片的知識(shí)點(diǎn)有哪些的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。

一、復(fù)制

在MongoDB中,創(chuàng)建副本集后就可以使用復(fù)制功能了,副本集是一組服務(wù)器,其中一個(gè)用于處理寫操作的主節(jié)點(diǎn)primary,還有多個(gè)用于保存主節(jié)點(diǎn)數(shù)據(jù)副本的從節(jié)點(diǎn)secondary。如果主節(jié)點(diǎn)崩潰了,則從節(jié)點(diǎn)會(huì)選取出一個(gè)新的主節(jié)點(diǎn)。

如果使用復(fù)制功能時(shí)有一臺(tái)服務(wù)器停止運(yùn)行了,那么仍然可以從副本集中的其它服務(wù)器訪問(wèn)數(shù)據(jù)。如果服務(wù)器上的數(shù)據(jù)已損壞或無(wú)法訪問(wèn),則可以從副本集中的其它成員中創(chuàng)建一個(gè)新的數(shù)據(jù)副本。

副本集中的每個(gè)成員都必須能夠連接到其它成員,如果收到有關(guān)成員無(wú)法訪問(wèn)到其它成員,則可能需要更改網(wǎng)絡(luò)配置以允許它們之間的連接。

二、如何進(jìn)行選舉

當(dāng)一個(gè)從節(jié)點(diǎn)無(wú)法與主節(jié)點(diǎn)連通時(shí),它就會(huì)聯(lián)系并請(qǐng)求其它的副本集成員將自己選舉為主節(jié)點(diǎn)。

其它成員會(huì)做幾項(xiàng)健全性檢查:

  1. 它們能否連接到主節(jié)點(diǎn),而這個(gè)主節(jié)點(diǎn)是發(fā)起選舉的節(jié)點(diǎn)無(wú)法連接到的?

  2. 這個(gè)發(fā)起選舉的從節(jié)點(diǎn)是否有最新數(shù)據(jù)?

  3. 有沒(méi)有其它更高優(yōu)先級(jí)的成員可以被選舉為主節(jié)點(diǎn)?

MongoDB在3.2版本中引入了第1版復(fù)制協(xié)議。這是一個(gè)類PAFT的協(xié)議,并且包含了一些特定于MongoDB的副本集概念,比如仲裁節(jié)點(diǎn)、優(yōu)先級(jí)、非選舉成員、寫入關(guān)注點(diǎn)等。還提出了很多新概念,比如更短的故障轉(zhuǎn)移時(shí)間,大大減少了檢測(cè)主節(jié)點(diǎn)失效的時(shí)間,它還通過(guò)使用term ID來(lái)防止重復(fù)投票。

RAFT是一種共識(shí)算法,它被分解成了相對(duì)獨(dú)立的子問(wèn)題。共識(shí)是指多臺(tái)服務(wù)器或進(jìn)程在一些值上達(dá)成一致的過(guò)程。RAFT確保了一致性,使得同一序列的命令產(chǎn)生相同序列的結(jié)果,并在所部署的各個(gè)成員中達(dá)到相同序列的狀態(tài)。

副本集成員相互間每隔兩秒發(fā)送一次心跳。如果某個(gè)成員在10秒內(nèi)沒(méi)有反饋心跳,則其它成員會(huì)將不良成員標(biāo)記為無(wú)法訪問(wèn)。選舉算法將盡最大努力嘗試讓具有最高優(yōu)先權(quán)的從節(jié)點(diǎn)發(fā)起選舉。成員優(yōu)先權(quán)會(huì)影響選舉的時(shí)機(jī)和結(jié)果。優(yōu)先級(jí)高的從節(jié)點(diǎn)要比優(yōu)先級(jí)低的從節(jié)點(diǎn)更快發(fā)起選舉,而且也更有可能成為主節(jié)點(diǎn)。然而,低優(yōu)先級(jí)的從節(jié)點(diǎn)也是有可能被短暫的選舉為主節(jié)點(diǎn)的,副本集成員會(huì)繼續(xù)發(fā)起選舉直到可用的最高優(yōu)先級(jí)成員被選舉為主節(jié)點(diǎn)。被選舉為主節(jié)點(diǎn)的從節(jié)點(diǎn)必須擁有最新的復(fù)制數(shù)據(jù)。

三、優(yōu)先級(jí)

優(yōu)先級(jí)用于表示一個(gè)成員稱為主節(jié)點(diǎn)的優(yōu)先程度,取值范圍是0 ~ 100。數(shù)值越大,優(yōu)先級(jí)越高。默認(rèn)為1,如果將priority設(shè)置為0,表示此節(jié)點(diǎn)永遠(yuǎn)無(wú)法成為主節(jié)點(diǎn),這樣的成員還有一個(gè)名字~被動(dòng)成員。

四、選舉仲裁者

大多數(shù)小型項(xiàng)目,MongoDB只有兩個(gè)副本集,為了參與選舉,MongoDB支持一種特殊類型的成員,稱為仲裁者,其唯一作用就是參與仲裁。仲裁者不參與存儲(chǔ)數(shù)據(jù),也不會(huì)為程序提供服務(wù),它只是為了幫助只有兩個(gè)副本集的集群選舉主節(jié)點(diǎn)(為了滿足大多數(shù)),需要注意的是,只能有一個(gè)仲裁者。

仲裁者的缺點(diǎn):

假設(shè)有一個(gè)主節(jié)點(diǎn),兩個(gè)從節(jié)點(diǎn),一個(gè)仲裁者。如果一個(gè)從節(jié)點(diǎn)停止運(yùn)行了,那么就需要一個(gè)新的從節(jié)點(diǎn),并且將主節(jié)點(diǎn)的數(shù)據(jù)復(fù)制到新的從節(jié)點(diǎn),復(fù)制數(shù)據(jù)會(huì)父服務(wù)器造成很大的壓力,降低程序運(yùn)行速度。所以,盡可能使用奇數(shù)的從節(jié)點(diǎn),而不是使用仲裁者。

五、同步

MongoDB通過(guò)保存操作日志oplog使多臺(tái)服務(wù)器間保持相同的數(shù)據(jù),oplog中保存著主節(jié)點(diǎn)執(zhí)行的每一次寫操作。oplog存在于主節(jié)點(diǎn)local數(shù)據(jù)庫(kù)中的一個(gè)固定集合中,從節(jié)點(diǎn)通過(guò)查詢此集合以獲取需要復(fù)制的操作。

每個(gè)從節(jié)點(diǎn)同樣維護(hù)著自己的oplog,用來(lái)記錄它從主節(jié)點(diǎn)復(fù)制的每個(gè)操作。這使得每個(gè)成員都可以被用作其他成員的同步源。如果應(yīng)用某個(gè)操作失敗,則從節(jié)點(diǎn)會(huì)停止從當(dāng)前數(shù)據(jù)源復(fù)制數(shù)據(jù)。

如果一個(gè)從節(jié)點(diǎn)由于某種原因停止工作了,它重新啟動(dòng)后,會(huì)從oplog中的最后一個(gè)操作開(kāi)始同步。由于這些操作是先應(yīng)用到數(shù)據(jù)上然后再寫入oplog,因此從節(jié)點(diǎn)可能會(huì)重復(fù)已經(jīng)應(yīng)用到數(shù)據(jù)上的操作。MongoDB在設(shè)計(jì)時(shí)考慮了這點(diǎn),oplog中的操作執(zhí)行一次和多次,效果都是一樣的,oplog中的每個(gè)操作都是冪等的。

六、處理過(guò)時(shí)數(shù)據(jù)

如果某個(gè)從節(jié)點(diǎn)的數(shù)據(jù)遠(yuǎn)遠(yuǎn)落后于同步源當(dāng)前的操作,那么這個(gè)從節(jié)點(diǎn)就是過(guò)時(shí)的。過(guò)時(shí)的從節(jié)點(diǎn)無(wú)法趕上同步源,如果繼續(xù)同步,從節(jié)點(diǎn)就需要跳過(guò)一些操作。此時(shí),需要從其它節(jié)點(diǎn)進(jìn)行復(fù)制,看看其它成員是否有更長(zhǎng)的oplog以繼續(xù)同步。如果都沒(méi)有,該節(jié)點(diǎn)當(dāng)前的復(fù)制操作將停止,需要進(jìn)行完全同步或從最近的備份中恢復(fù)。

為了避免出現(xiàn)不同步的節(jié)點(diǎn),讓主節(jié)點(diǎn)擁有比較大的oplog以保存足夠多的操作日志。

七、哈希片鍵

為了盡可能快地加載數(shù)據(jù),哈希片鍵是最好的選擇。哈希片鍵可以使任何字段隨機(jī)分發(fā)。如果打算在大量查詢中使用升序鍵,但又想在寫操作時(shí)隨機(jī)分發(fā),哈希片鍵是不錯(cuò)的選擇,不過(guò)需要注意的是,哈希片鍵無(wú)法執(zhí)行指定目標(biāo)的范圍查詢。

創(chuàng)建哈希片鍵:

db.users.createIndex({"name":"hashed"})

MongoDB高可用與分片的知識(shí)點(diǎn)有哪些

有一點(diǎn)需要注意,哈希片鍵的字段,不能是數(shù)組。

Error: hashed indexes do not currently support array values

MongoDB高可用與分片的知識(shí)點(diǎn)有哪些

八、多熱點(diǎn)

單獨(dú)的mongod服務(wù)器在執(zhí)行升序?qū)懖僮鲿r(shí)效率最高,這與分片相沖突,當(dāng)寫操作分發(fā)在集群中時(shí)分片效率最高。每個(gè)分片上都有幾個(gè)熱點(diǎn),便于寫操作在集群中均勻分發(fā)。

可以使用復(fù)合片鍵實(shí)現(xiàn)均勻分發(fā),復(fù)合片鍵的第一個(gè)值可以是一個(gè)基數(shù)較小的值,片鍵的第二部分是一個(gè)升序值,這意味著在塊的內(nèi)部,值總是在增加的。

MongoDB高可用與分片的知識(shí)點(diǎn)有哪些

九、分片規(guī)則

1、分片的限制

比如上圖的異常,片鍵不能是數(shù)組,大多數(shù)特殊類型的索引不能用作片鍵。特別是,不能在地理空間索引上進(jìn)行分片。

2、片鍵的基數(shù)

片鍵與索引類似,在基數(shù)高的字段上進(jìn)行分片,性能會(huì)更好。如果有一個(gè)status鍵,只有“正?!薄ⅰ爱惓!薄ⅰ板e(cuò)誤”幾個(gè)值,MongoDB是無(wú)法將數(shù)據(jù)拆分成3個(gè)以上的塊(因?yàn)槟壳爸挥腥齻€(gè)值),如果想將一個(gè)取值較小的鍵作為片鍵,那么可以將其與另一個(gè)擁有多值的鍵組成復(fù)合片鍵,比如createTime字段。這樣復(fù)合片鍵就擁有了較高的基數(shù)。

十、控制數(shù)據(jù)分發(fā)

1、自動(dòng)分片

MongoDB將集合均勻分發(fā)在集群中的每個(gè)分片上,如果存儲(chǔ)的是同構(gòu)數(shù)據(jù),那么這種方式非常高效。如果有一個(gè)日志集合,價(jià)值不是很大,你可能不希望它存儲(chǔ)在性能最好的服務(wù)器上,性能最好的服務(wù)器一般會(huì)存儲(chǔ)重要的實(shí)時(shí)數(shù)據(jù),而不允許其它集合使用它。

可以通過(guò)sh.addShardToZone("shard0","hign")、sh.addShardToZone("shard1","low")sh.addShardToZone("shard2","low")實(shí)現(xiàn)它。

可以將不同的集合分配給不同的分片,比如,對(duì)及其重要的實(shí)時(shí)集合執(zhí)行:

sh.updateZoneKeyRange("super.important",{"<shardKey>":MinKey},...{"<shardKey>":MaxKey},"high")

這條命令指的是:

對(duì)于這個(gè)集合super.important,將片鍵從負(fù)無(wú)窮到正無(wú)窮的數(shù)據(jù)保存在標(biāo)記為“high”的分片上。這不會(huì)影響其它集合的均勻分發(fā)。

同樣可以通過(guò)low,將不重要的日志集合存放在性能較差的服務(wù)器上。

sh.updateZoneKeyRange("super.logs",{"<shardKey>":MinKey},...{"<shardKey>":MaxKey},"low")

此時(shí),日志集合就會(huì)均勻的分發(fā)到shard1和shard2上。

同樣,可以通過(guò)removeShardFromZone()從區(qū)域中刪除分片。

sh.removeShardFromZone("super.logs",{"<shardKey>":MinKey},...{"<shardKey>":MaxKey})

2、手動(dòng)分發(fā)

可以通過(guò)關(guān)閉均衡器 sh.stopBalancer()啟動(dòng)手動(dòng)分發(fā)。

如果當(dāng)前正在進(jìn)行遷移,則此設(shè)置在遷移完成之前不會(huì)生效。一旦正在運(yùn)行的遷移完成,均衡器就會(huì)停止移動(dòng)數(shù)據(jù)。

除非遇到特殊情況,否則,MongoDB應(yīng)該使用自動(dòng)分片,而不是手動(dòng)分片。

以上就是“MongoDB高可用與分片的知識(shí)點(diǎn)有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI