MongoDB集群部署

數(shù)據(jù)副本

MongoDB中的一組副本是一群mongod進程,這些進程維護同樣的數(shù)據(jù)集。副本集提供了冗余和高可用性,是生產(chǎn)環(huán)境部署的基礎。

數(shù)據(jù)冗余和可用性

通過在不同的服務器上存儲相同的數(shù)據(jù),副本機制保證了一定程度的容錯,即在一個數(shù)據(jù)庫掛掉后,數(shù)據(jù)服務仍然可用。

在某些情況下,副本可以提升數(shù)據(jù)的讀性能,因為用戶可以從不同的數(shù)據(jù)庫讀取數(shù)據(jù)。在不同的數(shù)據(jù)中心維護數(shù)據(jù)的拷貝,能夠提高分布式應用程序的可用性。也可以維護額外的副本用于其他的目的,比如災難恢復,告警或者是備份。

Mongo中的副本

一個Mongo副本集包括幾個數(shù)據(jù)軸承節(jié)點和一個可選的仲裁者。在這些節(jié)點中,有且只有一個主節(jié)點,其他的節(jié)點都被認為是輔助節(jié)點。

主節(jié)點接收所有的寫操作。一套副本中,只有主節(jié)點能夠確認{ w: "majority"};雖然在一些情況下,另外的mongod進程會在短時間內(nèi)認為自己是主節(jié)點。主節(jié)點將所有數(shù)據(jù)的變動記錄在日志中,比如oplog

從節(jié)點復制主節(jié)點的oplog,然后根據(jù)日志重放數(shù)據(jù)集的變動,通過這樣的方式達到和主節(jié)點的數(shù)據(jù)一致。如果主節(jié)點掛掉,一個合格的從節(jié)點將發(fā)起一次選舉將自己選舉為新的主節(jié)點。

可以在副本集中添加一個額外的mongod實例作為仲裁者。仲裁者不維護數(shù)據(jù)集,它的主要功能是維護節(jié)點間的心跳和響應其他副本集成員的請求。因為仲裁者不維護數(shù)據(jù),因此和一個完整節(jié)點相比,占用的資源會更少。如果副本集中節(jié)點數(shù)量是偶數(shù),添加一個仲裁者可以在主節(jié)點的選舉中添加多數(shù)選票的能力。

仲裁者的角色不會變,主節(jié)點有可能會降級成從節(jié)點,從節(jié)點也可能升級為主節(jié)點。

異步復制

從節(jié)點異步從主節(jié)點應用操作。在從主節(jié)點同步數(shù)據(jù)后,即使有部分節(jié)點掛掉,副本集依然可以保持工作。

自動故障轉(zhuǎn)移

當一個主節(jié)點和副本集中的其他節(jié)點有超過10秒中的連接斷開時,一個合格的從節(jié)點將發(fā)起選舉,將自己提升為主節(jié)點。第一個發(fā)起選舉并且得到副本集中大多數(shù)選票的節(jié)點會成為主節(jié)點。

故障轉(zhuǎn)移過程通常在一分鐘內(nèi)完成。副本集中的其他節(jié)點可能需要10到30秒來讓確認主節(jié)點不可訪問。在確認后將發(fā)起選舉。選舉的過程可能需要10到30秒。

讀操作

默認情況下,用戶會從主節(jié)點中讀取數(shù)據(jù),不過用戶也可以通過設置發(fā)送讀請求到從節(jié)點。異步制意味著從節(jié)點中的數(shù)據(jù)可能和主節(jié)點并不一致。

數(shù)據(jù)分片

數(shù)據(jù)分片是將數(shù)據(jù)分散存儲在多個機器上。MongoDB使用分片技術來支持部署非常大的數(shù)據(jù)集,并提高系統(tǒng)的吞吐量。

單服務器會面臨大量數(shù)據(jù)和高吞吐量的應用程序的挑戰(zhàn)。比如,高頻率的查詢會耗盡服務器的CPU資源;大于系統(tǒng)內(nèi)存的工作數(shù)據(jù)集會對磁盤的I/O造成很大壓力。

有兩種方式來應對系統(tǒng)數(shù)據(jù)的增長:垂直擴展和水平擴展。

垂直擴展包括增加單個服務器的能力,比如使用更強的CPU,添加更多內(nèi)存,或者增加存儲空間?,F(xiàn)有技術的局限可能讓單臺機器無法應對某個給定的工作負載。另外,云服務商能夠提供的硬件配置也有一定的上限。因此在實踐中,垂直擴展能夠應對的負載有上限。

水平擴展包括數(shù)據(jù)集的劃分,和多臺服務器分攤負載,水平擴展可以通過添加新的機器來提升處理能力。雖然單機的能力可能不是很強,但是每臺機器都負責處理整體負載的一個子集,因此有能力提供比高速大容量服務器更高的效率。水平擴展提升系統(tǒng)的處理能力只需要添加新的服務器,這比提升高端服務器性能所需的成本要低。缺點是增加了基礎設施部署和維護的復雜度。

MongoDB通過分片技術支持系統(tǒng)的水平擴展。

分片集群

MongoDB的分片集群中有以下組件:

  • shard:每個shard都包含數(shù)據(jù)分片的一個子集。每個shard都可以部署為一個副本集
  • mongos:mongos作為查詢路由,提供客戶端應用程序和分片集群之間的接口
  • config servers:config servers存儲集群中的元數(shù)據(jù)和配置數(shù)據(jù)。在Mongo3.4中,config server必須被部署為副本集。

下圖展示了各個組件之間的交互。

Shard Keys

MongoDB使用shard key對collection的數(shù)據(jù)分片。shard key由一個不可變的字段或目標collection中每個文檔都存在的字段組成。

需要在對collection分片的時候選擇shard key。shard key之后不能更改。一個分片的collection只能有一個shard key。

要對一個非空collection分片,collection必須有一個由shard key開始的索引。對于空的collection,如果沒有一個合適索引,MongoDB會創(chuàng)建索引。

shard key的選擇會影響集群的性能,效率和可擴展性。shard key可能會成為集群的瓶頸,即使集群中的機器性能都很高。

chunks

MongoDB將數(shù)據(jù)分片到chunk中。依據(jù)選擇的shard key,每個chunk大小都有下限和上限。

在集群中,MongoDB使用分片集群均衡器遷移各個chunk。均衡器試圖實現(xiàn)在集群中chunk的均衡。

分片的優(yōu)點

讀/寫

MongoDB在分片集群中,將讀和寫的負載分配到各個節(jié)點中,允許每個shard處理集群操作的一個子集。可以通過添加更多的shard橫向擴展這種讀寫能力。

對于包括shard key的查詢,mongos可以將查詢定位到特定的shard。

存儲性能

分片技術將數(shù)據(jù)分配到集群中的節(jié)點上,每個shard包含總數(shù)據(jù)集合的一個子集。隨著數(shù)據(jù)集的增長,添加shard能夠增加集群的存儲容量。

高可用

即使在部分shard不可用的情況下,集群依然可以繼續(xù)執(zhí)行部分讀/寫操作。在掛掉的shard不可用期間,可用的shard的讀寫不受影響。

在生產(chǎn)環(huán)境中,shard應該部署為副本集,以提供數(shù)據(jù)冗余和可用性。

分片注意事項

在集群上實施分片需要仔細地規(guī)劃,執(zhí)行和維護。

仔細選擇shard key,對于確保集群的性能和效率是必要的。在分片后不能改變shard key,也不能撤銷分片。

分片有一定的操作要求和限制。

如果查詢不包括shard key,mongos會廣播操作,在集群中的shard中執(zhí)行查詢。這樣的查詢可能有較長耗時。

分片和非分片collection

一個數(shù)據(jù)庫可能同時有分片的collection和非分片的collection。分片的collection是分區(qū)的,分布在集群的不同shard中。非分片的collection存儲在主shard中。每個數(shù)據(jù)庫都有自己的主shard。

分片集群的連接

必須連接到mongos路由,來與分片集群中的collection交互。這種交互包括分片collection和非分片collection??蛻舳瞬辉试S直接連接到單獨的shard來進行讀寫操作。

分片策略

MongoDB支持兩種分片策略。

哈希分片

哈希分片是對shard key的值進行哈希運算后進行分片。每個chunk基于哈希后的值進行分配。

一個范圍內(nèi)的shard key可能很接近,但是hash后的結果很可能不在同一個chunk中。基于哈希的數(shù)據(jù)分布會形成更加均衡的數(shù)據(jù)分布,特別是在shard key單調(diào)變化的情況下。

但是,哈希分布意味著對范圍查詢不太可能定位到單個shard,這會導致廣播操作。

范圍分片

范圍分片是將數(shù)據(jù)基于shard key的值進行切分。每個chunk基于shard key的值進行分配。

shard key某個范圍內(nèi)的值更可能分配在相同的chunk中,mongos會將請求導向只含有請求數(shù)據(jù)的shard中。

范圍分片的效率取決于shard key。欠考慮的shard key會導致數(shù)據(jù)的分布不均,這會減少數(shù)據(jù)分片的優(yōu)勢或者導致性能瓶頸。

分片集群的區(qū)域

在分片集群中,可以基于shard key創(chuàng)建數(shù)據(jù)區(qū)域??梢园鸭褐械亩鄠€shard在同個區(qū)域中關聯(lián)起來。一個shard可以和任意數(shù)量的非沖突區(qū)域關聯(lián)起來。在平衡的集群中,MongoDB會將區(qū)域中的chunk遷移到區(qū)域里關聯(lián)的shard中。

每個區(qū)域包括一個或多個范圍的shard key。每個區(qū)域的覆蓋范圍總是包容它的下邊界和排它的上界。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 數(shù)據(jù)副本 MongoDB中的一組副本是一群mongod進程,這些進程維護同樣的數(shù)據(jù)集。副本集提供了冗余和高可用性,...
    宇哥聊AI閱讀 661評論 1 11
  • 1.1 MongoDB復制集簡介 一組Mongodb復制集,就是一組mongod進程,這些進程維護同一個數(shù)據(jù)集合。...
    IT_小白閱讀 907評論 0 4
  • Mongodb分片概括 分片在多臺服務器上分布數(shù)據(jù)的方法, Mongodb使用分片來支持具有非常大的數(shù)據(jù)集和高吞吐...
    平凡的運維之路閱讀 14,319評論 0 7
  • Mongodb分片概括 分片在多臺服務器上分布數(shù)據(jù)的方法, Mongodb使用分片來支持具有非常大的數(shù)據(jù)集和高吞吐...
    Vernon閱讀 621評論 0 1
  • 人生本來就沒有相欠, 別人對你付出,是因為別人喜歡; 你對別人付出,是因為自己甘愿。 以后,只對兩種人好, 一種是...
    三兩舊時憶閱讀 336評論 0 0

友情鏈接更多精彩內(nèi)容