一文了解MongoDB的各種部署模式
單節(jié)點(diǎn)模式(Standalone,不推薦用于生產(chǎn)環(huán)境)
standalone模式即單節(jié)點(diǎn)模式,指在服務(wù)器上只部署一個(gè) mongod 進(jìn)程用于讀寫數(shù)據(jù)。優(yōu)點(diǎn)是部署簡(jiǎn)單,可以快速完成部署,缺點(diǎn)是無容災(zāi)。只推薦用于日常的開發(fā)、測(cè)試和學(xué)習(xí)。
主從復(fù)制模式(官方已不建議使用,不推薦用于生產(chǎn)環(huán)境)
主從復(fù)制模式也比較簡(jiǎn)單,包含一個(gè)主節(jié)點(diǎn)(Primary)和一個(gè)或多個(gè)從節(jié)點(diǎn)(Secondary)。主節(jié)點(diǎn)提供讀寫服務(wù),從節(jié)點(diǎn)不提供任何服務(wù)。也可以修改配置讓從節(jié)點(diǎn)提供只讀服務(wù),以減少主節(jié)點(diǎn)的壓力,每個(gè)從節(jié)點(diǎn)會(huì)定期輪詢主節(jié)點(diǎn)的oplog以保持?jǐn)?shù)據(jù)與主節(jié)點(diǎn)一致。
這種模式相較于單節(jié)點(diǎn)模式,可用性高很多,可用于備份、故障恢復(fù)、讀擴(kuò)展等。缺點(diǎn)是當(dāng)主節(jié)點(diǎn)出現(xiàn)故障時(shí),只能人工介入指定新的主節(jié)點(diǎn)(從節(jié)點(diǎn)不會(huì)自動(dòng)升級(jí)為主節(jié)點(diǎn)),并且在這段時(shí)間內(nèi),集群處于只讀狀態(tài)。
副本集模式(Relica Set)
副本集模式包含一個(gè)主節(jié)點(diǎn)(Primary)和一個(gè)或多個(gè)從節(jié)點(diǎn)(Secondary),這一點(diǎn)與主從復(fù)制模式類似且主從節(jié)點(diǎn)的作用也類似。相較于主從復(fù)制模式,副本集模式的優(yōu)勢(shì)是當(dāng)主節(jié)點(diǎn)發(fā)生故障時(shí),副本集可以自動(dòng)投票產(chǎn)生新的主節(jié)點(diǎn),并引導(dǎo)其余的從節(jié)點(diǎn)連接新的主節(jié)點(diǎn)。副本集架構(gòu)如下圖所示:
副本集中各節(jié)點(diǎn)通過心跳機(jī)制來檢測(cè)各自的健康狀況,當(dāng)主節(jié)點(diǎn)出現(xiàn)故障時(shí),多個(gè)從節(jié)點(diǎn)會(huì)觸發(fā)選舉操作來選舉其中一個(gè)作為新的主節(jié)點(diǎn)。為了保證選舉票數(shù)不同,副本集的節(jié)點(diǎn)數(shù)保持為奇數(shù)。
在某些情況下(例如只有一個(gè)主節(jié)點(diǎn)和一個(gè)從節(jié)點(diǎn)的情況下,由于成本限制不允許添加另一個(gè)從節(jié)點(diǎn)),可以選擇向副本集中添加一個(gè)仲裁節(jié)點(diǎn)(Arbiter)。仲裁節(jié)點(diǎn)參與選舉但不會(huì)被選為主節(jié)點(diǎn)(因?yàn)檫x舉節(jié)點(diǎn)沒有數(shù)據(jù)集的副本)。
分片集群模式(Sharded Cluster)
副本集模式雖然解決了高可用問題,但不能滿足海量數(shù)據(jù)和需要非常高吞吐的場(chǎng)景。這時(shí)候就需要使用到分片技術(shù)(sharding,指將數(shù)據(jù)拆分并分散存儲(chǔ)在不同機(jī)器上)了,即分片集群模式。
分片集群模式主要利用了水平擴(kuò)展的特性,將數(shù)據(jù)和負(fù)載分散到多臺(tái)機(jī)器上,并根據(jù)需要添加額外的服務(wù)器以增加容量和提高性能。雖然單臺(tái)機(jī)器的整體性能或容量可能不高,但每臺(tái)機(jī)器只是處理總體工作負(fù)載的一個(gè)單元,集群整體效率可能比單臺(tái)性能和容量非常高的機(jī)器更高。
搭建一個(gè)分片集群需要如下幾個(gè)組件:
- shard,每個(gè)shard都是一個(gè)mongo數(shù)據(jù)庫(kù)實(shí)例,包含分片數(shù)據(jù)的一個(gè)子集。一個(gè)shard可由幾臺(tái)機(jī)器組成一個(gè)副本集,防止因主節(jié)點(diǎn)單點(diǎn)故障導(dǎo)致整個(gè)系統(tǒng)崩潰。
- config servers,用于配置服務(wù)器存儲(chǔ)集群的元數(shù)據(jù)和配置設(shè)置。
- mongos,在集群中作為查詢路由器,客戶端程序由此接入,讓整個(gè)集群看起來像是一個(gè)單一的數(shù)據(jù)庫(kù),提供客戶端應(yīng)用程序和分片集群之間的接口。mongos本身不保存數(shù)據(jù),啟動(dòng)時(shí)從config servers加載集群信息到緩存中,并將客戶端的請(qǐng)求路由給每個(gè)shard,聚合各shard返回的結(jié)果返回給客戶端。
分片集群內(nèi)組件間的交互如下圖:
分片集群模式有以下幾個(gè)優(yōu)勢(shì):
- 將讀寫負(fù)載分布在集群中的各個(gè)分片上,允許每個(gè)分片處理集群操作的一個(gè)子集。通過添加更多的分片,讀寫工作負(fù)載都可以在集群中水平擴(kuò)展。
- 將數(shù)據(jù)分布到集群中的各個(gè)分片上,允許每個(gè)分片包含整個(gè)集群數(shù)據(jù)的一個(gè)子集。隨著數(shù)據(jù)集的增長(zhǎng),額外的分片會(huì)增加集群的存儲(chǔ)容量。
- 高可用性,即使一個(gè)或多個(gè)分片副本集完全不可用,分片集群也可以繼續(xù)執(zhí)行部分讀寫。也就是說,雖然無法訪問不可用分片上的數(shù)據(jù),但對(duì)可用分片的讀寫仍然可以成功。
小結(jié)
本文介紹了MongoDB的四種部署模式:?jiǎn)喂?jié)點(diǎn)模式和三種集群模式。副本集模式已經(jīng)替代了主從復(fù)制模式,保障了集群的可靠性;分片集群模式的可擴(kuò)展性,可以滿足海量數(shù)據(jù)的存儲(chǔ)和高吞吐的需求。生產(chǎn)環(huán)境中,不建議使用單實(shí)例模式和主從復(fù)制模式,副本集模式和分片集模式根據(jù)業(yè)務(wù)場(chǎng)景來選擇。